지금까지 우리는 대개 하나의 테이블을 다루는 작업을 위주로 수행했음
이를 기반으로 지금부터는 두 개 이상의 테이블이 서로 관계되어 있는 상태를 고려해 볼 예정
● JOIN (조인) : 두 개 이상의 테이블을서로 묶어서 하나의 결과 집합으로 만들어 내는 것
-데이터베이스의 테이블 : 중복과 공간 낭비를 피하고 데이터 무결성을 위해서 여러개의 테이블로 분리하여 저장함
그리고 이 분리된 테이블들은 서로 관계를 맺고 있다.
◆ INNER JOIN (내부조인)
: 조인 중에서 가장 많이 사용됨. 일반적으로 JOIN이라고 얘기하는 것이 INNER JOIN을 지칭한다
조인키에 해당하는 각 테이블의 열값을 비교해서 조건에 맞는 값을 검색

예) 구매테이블을 보면 물건을 구매한 사용자의 아이디와 물건 등의 정보만 나타남
그런데 이 물건을 배송하기 위해서는 구매한 회원의 주소르 알아야함. 이 회원의 주소 정보를 알기 위해 주소정보가 있는 회원 테이블과 결합하는 조인이 INNER JOIN
형식 :
SELECT < 열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인될 조건: 첫번째 테이블 .열이름 = 두번째 테이블 .열이름>
WHERE [검색조건]
위의 형식에서 INNER JOIN을 그냥 JOIN이라고만 써도 INNER JOIN으로 인식함
ON 절의 조건을 만족하는 데이터만을 가져온다
실습) 구매 테이블 중에서 JYP라는 아이디를 가진 사람이 구매한 물건을 발송하기 위해서
이름/주소/연락처 등을 조인해서 검색하기
:
SELECT * FROM buytbl
INNER JOIN usertbl ON buytbl.userID = usertbl.userID
WHERE buytbl.userID = 'JYP' ;
바이테이블에 있는 유저아이디와 유저테이블에 있는 유저아이디가 같아야 하고
조건은 바이티비엘에 있는 유저아이디가 jyp인 ...
즉, buytbl 테이블에서 userID가 'JYP'인 사람의 구매 정보와 해당 사용자의 정보를 usertbl에서 함께 가져옵니다.
모든정보를 조회하려면
SELECT * FROM buytbl
INNER JOIN usertbl ON buytbl.userID = usertbl.userID
ORDER BY num;
실습) 아이디/이름/구매물품/주소/연락처만 추출하기 ( 내가 보고싶은 열만 조회하려고 할 때는)
SELECT
buytbl.userID , name, prodName, addr, concat(mobile1, mobile2) as '연락처'
FROM buytbl
INNER JOIN usertbl ON buytbl.userID = usertbl.userID
ORDER BY num;
-- num은 보여지지 않지만 원래 테이블에는 num이 있기에 num으로 정렬
SELECT
buytbl.userID , name, prodName, addr, concat(mobile1, mobile2) as '연락처'
FROM buytbl B
INNER JOIN usertbl U ON buytbl.userID = usertbl.userID
ORDER BY num;
>
★ **약어(별칭)**는 주로 테이블이 처음 등장할 때 선언하며,
그 이후 쿼리 내에서 테이블을 참조할 때는 해당 약어를 사용
일반적으로 약어는 FROM 절이나 JOIN 절에서 테이블 이름과 함께 선언
이후에는 테이블의 전체 이름 대신 약어를 사용하여 쿼리를 간결하게 작성
테이블 이름이 처음 등장할 때 약어 설정
SELECT
B.userID , U.name, B.prodName, U.addr, concat(U.mobile1, U.mobile2) as '연락처'
FROM buytbl B
INNER JOIN usertbl U ON B.userID = U.userID
ORDER BY B.num;
> 약어 사용
실습) JYP만 보이게 하는 추출
SELECT
B.userID , U.name, B.prodName, U.addr, concat(U.mobile1, U.mobile2) as '연락처'
FROM buytbl B
INNER JOIN usertbl U ON B.userID = U.userID
WHERE B.userID = 'JYP';
실습) 3개 테이블 조인을 실습
3개의 테이블을 정의하고 데이터를 입력하기
★ FOREIGN KEY : 제약 조건을 설정한 필드는 외래 키라고 부른다
- 한 테이블을 다른 테이블과 연결해주는 역할
- 외래 키가 설정된 테이블에 레코드를 입력하면 기준이 되는 테이블의 내용을 참조해서 레코드가 입력됨
즉 , FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존하게 만든다
FOREIGN KEY 제약 조건을 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY 제약 조건이 설정되어 있어야 한다
실습) 3개의 테이블을 이용해서 학생을 기준으로 학생 이름/지역/가입한 동아리/동아리방 출력하기
SELECT
S.stdName, -- stdtbl에서 stdname을 select
S.addr, -- stdtbl에서 stdaddr을 select
C.clubName, -- clubtbl에서 clubname을 select
C.roomNo -- clubtbl에서 roomno를 select
FROM stdtbl S -- stdtbl을 기본 테이블로 설정 S 별칭 부여
INNER JOIN stdclubtbl SC
-- 학생이 가입한 stdclubtbl 에서 학생이 클럽에 가입한 정보가 있는 경우에만 해당 행이 반환
ON S.stdName = SC.stdName
-- stdtbld의 stdname과 stdclubtbl의 stdname을 기준으로 JOIN한다
즉, 학생의 이름으로 클럽 가입 정보를 매칭한다
INNER JOIN clubtbl C
-- 클럽 정보를 가진 clubtbl과 innerjoin 한다
클럽에 대한 정보가 있는 경우에만 해당 학생의 클럽 정보가 반환
ON SC.clubName = C.clubName;
-- stdclubtbl의 clubname 과 clubtbl의 clubname을 기준으로 JOIN한다
즉, 클럽의 이름을 통해 해당 클럽의 방 번호와 기타 정보를 가져온다
** 밑줄 부분이 테이블 이름 처음등장 이때 약어 설정해준다 쒹쒹
실습) 동아리를 기준으로 가입한 학생의 목록을 출력하기.
최종 결과에 clubName이 정렬되게 하기
SELECT
C.clubName, C.roomNo, S.stdName, S.addr -- 출력할 결과
FROM stdtbl S --학생정보테이블
INNER JOIN stdclubtbl SC ON SC.stdName = S.stdName
INNER JOIN clubtbl C ON SC.clubName = C.clubName
ORDER BY C.clubName;
ON : 조인할 때 조인 조건을 위해 사용됨 ON 절의 조건을 만족하는 데이터만을 가져옵니다.
WHERE : 조인을 완료한 상태에서 조건에 맞는 값을 가져오고자 할 때 사용
'MySQL' 카테고리의 다른 글
| MySQL_CROSS JOIN (0) | 2024.09.12 |
|---|---|
| MySQL_OUTER JOIN (0) | 2024.09.12 |
| MySQL_삭제 후 재설치 (1) | 2024.09.11 |
| MySQL_Windows Powershell(관리자) DB용량 늘리기 (0) | 2024.09.11 |
| MySQL_내장함수_시스템 정보 함수 (0) | 2024.09.11 |