JOIN
SQL JOIN은 두 개 이상의 테이블을 공통 열(조건)을 기준으로 결합하여 데이터를 조회하는 데 사용됩니다. JOIN은 관계형 데이터베이스에서 테이블 간의 관계를 활용하여 필요한 데이터를 통합하는 중요한 기능입니다.
- JOIN 을 통해서 만들어진 테이블은 유지되지 않고 SELECT 가 종료되면 바로 사라진다.
- 두 테이블을 조인할 때 ON 을 통해서 조인 조건을 주지 않으면 무지성 조인이 된다.
종류
1. INNER JOIN
- 두 테이블에서 조인 조건을 만족하는 행만 반환합니다.
- 조인 조건이 성립되지 않는 데이터는 결과에 포함되지 않습니다.
- 좌우 테이블의 순서가 중요하지 않습니다.
2. LEFT JOIN (LEFT OUTER JOIN)
- 왼쪽 테이블의 모든 행과 조인 조건을 만족하는 오른쪽 테이블의 데이터를 반환합니다.
- 조건을 만족하지 않는 경우 오른쪽 테이블의 값은 NULL로 채워집니다.
- 좌우 테이블의 순서가 중요합니다. 왼쪽 테이블이 중심입니다.
3. RIGHT JOIN (RIGHT OUTER JOIN)
- 오른쪽 테이블의 모든 행과 조인 조건을 만족하는 왼쪽 테이블의 데이터를 반환합니다.
- 조건을 만족하지 않는 경우 왼쪽 테이블의 값은 NULL로 채워집니다.
- 좌우 테이블의 순서가 중요합니다. 오른쪽 테이블이 중심입니다.
4. FULL JOIN (FULL OUTER JOIN)
- 두 테이블의 모든 데이터를 반환하며, 조인 조건이 성립하지 않는 경우 NULL로 채워집니다.
- MySQL은 FULL JOIN을 직접 지원하지 않으며, UNION을 통해 구현할 수 있습니다.
5. CROSS JOIN
- 두 테이블의 모든 행의 조합(카티션 곱)을 반환합니다.
- 조인 조건이 없으므로 결과 행 수는 테이블1 행 수 × 테이블2 행 수입니다.
6. SELF JOIN
- 같은 테이블을 조인하여 사용합니다.
- 테이블 내에서 데이터를 비교하거나 관계를 나타낼 때 유용합니다.
JOIN 예제
* 테이블 생성
-- Employees 테이블
CREATE TABLE Employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
dept_id INT
);
-- Departments 테이블
CREATE TABLE Departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
-- 데이터 삽입
INSERT INTO Employees (emp_id, name, dept_id)
VALUES (1, 'Alice', 101), (2, 'Bob', 102), (3, 'Charlie', NULL);
INSERT INTO Departments (dept_id, dept_name)
VALUES (101, 'HR'), (102, 'IT'), (103, 'Finance');
1. INNER JOIN
SELECT E.name, D.dept_name
FROM Employees E
INNER JOIN Departments D
ON E.dept_id = D.dept_id;
➡️ 두 테이블에서 dept_id가 일치하는 데이터만 반환
| name | dept_name |
| Alice | HR |
| Bob | IT |
2. LEFT JOIN (LEFT OUTER JOIN)
SELECT E.name, D.dept_name
FROM Employees E
LEFT JOIN Departments D
ON E.dept_id = D.dept_id;
➡️ Employees의 모든 행을 반환하며, dept_id가 일치하지 않는 경우 NULL
| name | dept_name |
| Alice | HR |
| Bob | IT |
| Charlie | NULL |
3. RIGHT JOIN (RIGHT OUTER JOIN)
SELECT E.name, D.dept_name
FROM Employees E
RIGHT JOIN Departments D
ON E.dept_id = D.dept_id;
➡️ Departments의 모든 행을 반환하며, dept_id가 일치하지 않는 경우 NULL
| name | dept_name |
| Alice | HR |
| Bob | IT |
| NULL | Finance |
4. FULL JOIN (FULL OUTER JOIN)
-- MySQL에서는 FULL JOIN을 직접 지원하지 않음.
-- 대신 UNION으로 구현
SELECT E.name, D.dept_name
FROM Employees E
LEFT JOIN Departments D
ON E.dept_id = D.dept_id
UNION
SELECT E.name, D.dept_name
FROM Employees E
RIGHT JOIN Departments D
ON E.dept_id = D.dept_id;
➡️ 두 테이블의 모든 데이터를 반환하며, 조건에 맞지 않는 데이터는 NULL
| name | dept_name |
| Alice | HR |
| Bob | IT |
| Charlie | NULL |
| NULL | Finance |
5. CROSS JOIN
SELECT E.name, D.dept_name
FROM Employees E
CROSS JOIN Departments D;
➡️ 두 테이블의 모든 행(ROW)의 조합을 반환
| name | dept_name |
| Alice | HR |
| Alice | IT |
| Alice | Finance |
| Bob | HR |
| Bob | IT |
| Bob | Finance |
| Charlie | HR |
| Charlie | IT |
| Charlie | Finance |
6. SELF JOIN
-- Employees 테이블에 상사(sup_id) 추가
ALTER TABLE Employees ADD COLUMN sup_id INT;
UPDATE Employees
SET sup_id = 1 WHERE emp_id = 2;
UPDATE Employees
SET sup_id = 2 WHERE emp_id = 3;
-- 직원과 상사를 매칭
SELECT E1.name AS Employee, E2.name AS Supervisor
FROM Employees E1
LEFT JOIN Employees E2
ON E1.sup_id = E2.emp_id;
➡️ 같은 테이블을 조인하여, 예를 들어 직원의 상사 관계를 표현
| Employee | Supervisor |
| Alice | NULL |
| Bob | Alice |
| Charlie | Bob |
요약
| JOIN 종류 | 설명 |
| INNER JOIN | 조인 조건을 만족하는 행만 반환 |
| LEFT JOIN | 왼쪽 테이블의 모든 행과, 조건이 맞는 오른쪽 테이블의 행. 조건 불일치 시 NULL |
| RIGHT JOIN | 오른쪽 테이블의 모든 행과, 조건이 맞는 왼쪽 테이블의 행. 조건 불일치 시 NULL |
| FULL JOIN | 두 테이블의 모든 행을 반환하며, 조건이 맞지 않는 경우 NULL (MySQL에서는 UNION으로 구현) |
| CROSS JOIN | 두 테이블의 모든 행의 조합(카티션 곱) |
| SELF JOIN | 동일 테이블을 조인하여, 테이블 내 관계를 표현 |
중요성
- 테이블 간 관계 활용 : JOIN은 테이블 간 관계를 이용해 데이터를 통합하고 분석할 수 있게 합니다.
- 효율적 데이터 처리 : JOIN을 사용하면 다수의 테이블에서 필요한 데이터만 추출할 수 있습니다.
- 다양한 패턴 지원 : INNER, LEFT, RIGHT, FULL 등 다양한 JOIN 방식으로 복잡한 데이터 구조를 처리할 수 있습니다.
출처
OpenAI의 ChatGPT (https://openai.com)
2024 프로그래머스 백엔드 데브코스 3기 4회차 수업
'DB > MySQL' 카테고리의 다른 글
| GROUP_CONCAT feat. DISTINCT (0) | 2025.01.03 |
|---|---|
| GROUP BY (0) | 2025.01.02 |
| SELECT문 실행 순서 (0) | 2024.12.30 |
| AUTO_INCREMENT (0) | 2024.12.29 |
| DBMS를 사용하는 이유 feat. MySQL (1) | 2024.12.27 |