DB/MySQL

JOIN

annovation 2025. 1. 1. 10:05

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