관계형 데이터베이스(RDBMS)에서는 정규화를 통해 데이터를 여러 테이블로 분리하여 관리합니다.
하지만 분리된 테이블의 데이터를 하나의 쿼리로 가져오기 위해서는 JOIN 연산이 필요합니다.
| JOIN 유형 | 설명 |
|---|---|
| CROSS JOIN | 두 테이블의 모든 행의 조합을 반환 (Cartesian Product) |
| INNER JOIN | 두 테이블에서 공통된 값이 존재하는 행만 반환 |
| LEFT JOIN | 왼쪽 테이블의 모든 행을 반환하며, 오른쪽 테이블에 없는 데이터는 NULL |
| RIGHT JOIN | 오른쪽 테이블의 모든 행을 반환하며, 왼쪽 테이블에 없는 데이터는 NULL |
📌 "모든 조합을 생성"
-- 테스트 테이블 생성
CREATE TABLE testA ( a INTEGER );
CREATE TABLE testB ( b VARCHAR(10) );
-- 데이터 삽입
INSERT INTO testA VALUES(1);
INSERT INTO testA VALUES(2);
INSERT INTO testA VALUES(3);
INSERT INTO testB VALUES('A');
INSERT INTO testB VALUES('B');
INSERT INTO testB VALUES('C');
-- CROSS JOIN 실행
SELECT *
FROM testA
CROSS JOIN testB;
-- 동일한 결과를 얻을 수 있음
SELECT *
FROM testA, testB;
✅ 결과
| a | b |
|----|----|
| 1 | A |
| 1 | B |
| 1 | C |
| 2 | A |
| 2 | B |
| 2 | C |
| 3 | A |
| 3 | B |
| 3 | C |
📌 "두 개의 테이블에서 공통된 값이 존재하는 행만 반환"
ON 조건에 해당하는 값이 양쪽 테이블에 존재해야 출력됨 USE BaseballData;
-- INNER JOIN 실행
SELECT *
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID;
✅ 결과
players와 salaries 테이블에서 playerID가 공통으로 존재하는 데이터만 결합 salaries에 해당하는 데이터가 없는 playerID는 제외됨📌 "왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에 없는 데이터는 NULL"
ON 조건이 일치하는 데이터는 JOIN되고, 오른쪽 테이블에 데이터가 없으면 NULL로 표시됨SELECT *
FROM players AS p
LEFT JOIN salaries AS s
ON p.playerID = s.playerID;
✅ 결과
players 테이블에 있는 모든 playerID를 포함salaries 테이블에 해당 데이터가 없으면 NULL 반환📌 "오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에 없는 데이터는 NULL"
ON 조건이 일치하는 데이터는 JOIN되고, 왼쪽 테이블에 데이터가 없으면 NULL로 표시됨SELECT *
FROM players AS p
RIGHT JOIN salaries AS s
ON p.playerID = s.playerID;
✅ 결과
salaries 테이블에 있는 모든 playerID를 포함players 테이블에 해당 데이터가 없으면 NULL 반환| JOIN 유형 | 결과 |
|---|---|
| CROSS JOIN | 두 테이블의 모든 행 조합 (카르테시안 곱) |
| INNER JOIN | 공통된 값이 존재하는 행만 반환 |
| LEFT JOIN | 왼쪽 테이블의 모든 행 반환, 오른쪽 테이블 값이 없으면 NULL |
| RIGHT JOIN | 오른쪽 테이블의 모든 행 반환, 왼쪽 테이블 값이 없으면 NULL |
✅ 1) 조인 조건을 명확하게 설정해야 함
ON 절을 명확하게 지정하지 않으면 의도하지 않은 결과가 나올 수 있음✅ INNER JOIN → 두 테이블의 공통 데이터를 가져올 때
✅ LEFT JOIN → 기준이 되는 테이블을 기준으로 데이터를 조회할 때
✅ RIGHT JOIN → 기준이 되는 테이블이 오른쪽에 있을 때
✅ CROSS JOIN → 모든 조합을 필요로 하는 경우 (거의 사용하지 않음)
📌 "실제 프로젝트에서는 INNER JOIN과 LEFT JOIN이 가장 많이 사용됨!"
JOIN과 INDEX를 함께 활용하면 검색 속도를 더욱 최적화할 수 있음 😊