테이블 구조 예시
| 도서ID | 도서명 |
|---|---|
| 101 | Java |
| 102 | C++ |
| 103 | PHP |
| 도서ID | 저자 |
|---|---|
| 102 | 장길동 |
| 103 | 왕서방 |
| 104 | 이순신 |
| 저자 | 출판년도 |
|---|---|
| 장길동 | 2003 |
| 마동탁 | 2006 |
| 유재석 | 2011 |
내부 조인(INNER JOIN)
공통 컬럼 값을 기준으로 두 테이블의 교집합 반환
SELECT 도서.도서ID, 도서명, 저자 FROM 도서 INNER JOIN 저자정보 USING (도서ID);
+--------+--------+----------+ | 도서ID | 도서명 | 저자 | +--------+--------+----------+ | 102 | C++ | 장길동 | | 103 | PHP | 왕서방 | +--------+--------+----------+
교차 조인(CROSS JOIN)
두 테이블의 카테시안 곱 생성
SELECT * FROM 도서 CROSS JOIN 저자정보;
+--------+--------+--------+----------+ | 도서ID | 도서명 | 도서ID | 저자 | +--------+--------+--------+----------+ | 101 | Java | 102 | 장길동 | | 102 | C++ | 102 | 장길동 | | 103 | PHP | 102 | 장길동 | | 101 | Java | 103 | 왕서방 | | 102 | C++ | 103 | 왕서방 | | 103 | PHP | 103 | 왕서방 | | 101 | Java | 104 | 이순신 | | 102 | C++ | 104 | 이순신 | | 103 | PHP | 104 | 이순신 | +--------+--------+--------+----------+
자연 조인(NATURAL JOIN)
동일한 이름의 컬럼을 자동으로 조인 조건으로 사용
SELECT * FROM 도서 NATURAL JOIN 저자정보;
+--------+--------+----------+ | 도서ID | 도서명 | 저자 | +--------+--------+----------+ | 102 | C++ | 장길동 | | 103 | PHP | 왕서방 | +--------+--------+----------+
좌측 외부 조인(LEFT JOIN)
왼쪽 테이블 전체와 조건에 맞는 오른쪽 테이블 레코드 반환
SELECT 도서.도서ID, 도서명, 저자 FROM 도서 LEFT JOIN 저자정보 USING (도서ID);
+--------+--------+----------+ | 도서ID | 도서명 | 저자 | +--------+--------+----------+ | 101 | Java | NULL | | 102 | C++ | 장길동 | | 103 | PHP | 왕서방 | +--------+--------+----------+
차집합 연산 방법
SELECT 도서.* FROM 도서 LEFT JOIN 저자정보 USING (도서ID) WHERE 저자정보.도서ID IS NULL;
+--------+--------+ | 도서ID | 도서명 | +--------+--------+ | 101 | Java | +--------+--------+
USING vs ON 절 차이
SELECT * FROM 도서 JOIN 저자정보 USING (도서ID);
+--------+--------+----------+ | 도서ID | 도서명 | 저자 | +--------+--------+----------+ | 102 | C++ | 장길동 | | 103 | PHP | 왕서방 | +--------+--------+----------+
SELECT * FROM 도서 JOIN 저자정보 ON 도서.도서ID = 저자정보.도서ID;
+--------+--------+--------+----------+ | 도서ID | 도서명 | 도서ID | 저자 | +--------+--------+--------+----------+ | 102 | C++ | 102 | 장길동 | | 103 | PHP | 103 | 왕서방 | +--------+--------+--------+----------+
STRAIGHT_JOIN 활용
테이블 읽는 순서를 강제 지정할 때 사용
SELECT * FROM 작은테이블 STRAIGHT_JOIN 큰테이블 ON 작은테이블.id = 큰테이블.id;
조인 연산 우선순위
괄호를 명시적으로 사용하여 연산 순서 제어
SELECT * FROM 테이블1, (테이블2 JOIN 테이블3 ON 조건);