🍋 ⚾️ 💻 🎬 🎮

Tech/SQL

[SQL] JOIN(조인)

aeightchill 2025. 2. 10. 18:15
728x90

JOIN

JOIN은 두 개 이상의 테이블을 연결하여 원하는 데이터를 조회하는 데 사용
→    공통된 컬럼을 기준으로 두 개 이상의 테이블을 조합하는 것

 

 


기본

SELECT *
FROM 테이블1 A
JOIN 테이블2 B
ON A.컬럼 = B.컬럼;
  • JOIN을 사용할 때 ON을 통해 두 테이블 간의 공통된 컬럼을 지정하여 데이터를 연결한다.

 

💡 JOIN에 USING 사용

컬럼 이름이 동일한 경우 ON 대신 USING(컬럼명)을 사용할 수 있다.

SELECT e.emp_id, e.name, d.dept_name
FROM employees e
INNER JOIN departments d USING (dept_id);​
  • USING은 dept_id를 자동으로 비교한다.

 

 


JOIN 종류

JOIN 유형 설명
INNER JOIN 공통된 값이 있는 행만 반환
LEFT JOIN 왼쪽 테이블의 모든 행 + 일치하는 오른쪽 테이블 행
RIGHT JOIN 오른쪽 테이블의 모든 행 + 일치하는 왼쪽 테이블 행
FULL JOIN 두 테이블의 모든 행을 포함
CROSS JOIN 두 테이블의 모든 조합을 생성
SELF JOIN 같은 테이블을 두 번 참조

 

 


📌  INNER JOIN (교집합)

INNER JOIN은 두 테이블에서 공통된 값이 있는 행만 반환

 

예제

[Table]  employees (직원 테이블)

emp_id name dept_id
1 Alice 10
2 Bob 20
3 Charlie 30
4 David 20

 

[Table]  departments (부서 테이블)

dept_id dept_name
10 HR
20 IT

 

 

SELECT e.emp_id, e.name, d.dept_name
FROM employees e
INNER JOIN departments d
ON e.dept_id = d.dept_id;

 

 

실행 결과 >

emp_id name dept_name
1 Alice HR
2 Bob IT
4 David IT
  • 공통된 dept_id가 있는 행만 반환
  • dept_id = 30 인 Charlie는 departments 테이블에 없으므로 제외

 

 


📌  LEFT JOIN (왼쪽 기준)

왼쪽(employees) 테이블의 모든 행을 포함하며, 오른쪽(departments) 테이블에 일치하는 값이 없으면 NULL을 반환

 

 

SELECT e.emp_id, e.name, d.dept_name
FROM employees e
LEFT JOIN departments d
ON e.dept_id = d.dept_id;

 

 

실행 결과 >

emp_id name dept_name
1 Alice HR
2 Bob IT
3 Charlie NULL
4 David IT
  • employees 테이블의 모든 행이 유지
  • Charlie는 부서 정보가 없지만, LEFT JOIN이므로 NULL로 채운다.

 

 


📌  RIGHT JOIN (오른쪽 기준)

오른쪽(departments) 테이블의 모든 행을 포함하며, 왼쪽(employees) 테이블에 일치하는 값이 없으면 NULL을 반환

 

 

SELECT e.emp_id, e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d
ON e.dept_id = d.dept_id;

 

 

실행 결과 >

emp_id name dept_name
1 Alice HR
2 Bob IT
4 David IT
  • departments 테이블의 모든 행이 유지
  • INNER JOIN과 결과가 동일하지만, RIGHT JOIN은 오른쪽 테이블 기준으로 데이터가 존재하면 모두 출력한다.

 

 


📌  FULL JOIN (합집합)

두 테이블의 모든 데이터를 포함하며, 일치하는 값이 없는 경우 NULL을 반환

 

 

SELECT e.emp_id, e.name, d.dept_name
FROM employees e
FULL JOIN departments d
ON e.dept_id = d.dept_id;

 

 

실행 결과 >

 

emp_id name dept_name
1 Alice HR
2 Bob IT
3 Charlie NULL
4 David IT
  • Charlie는 부서 정보가 없기 때문에 dept_name에 NULL을 채우고, 두 테이블의 모든 데이터가 표시된다.

 

 


📌  CROSS JOIN (모든 조합)

두 테이블의 모든 행을 곱집합(카테시안 곱, Cartesian Product)으로 생성

 

 

SELECT e.name, d.dept_name
FROM employees e
CROSS JOIN departments d;

 

실행 결과 >

 

name dept_name
Alice HR
Alice IT
Bob HR
Bob IT
Charlie HR
Charlie IT
David HR
David IT
  • 모든 직원 x 모든 부서의 조합이 생성된다.

 

 


📌  SELF JOIN (자기 자신과 조인)

자기 자신과 조인하는 방식으로 계층 구조를 표현하는 데 사용

 

SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
JOIN employees e2
ON e1.manager_id = e2.emp_id;

 

실행 결과 >

 

employee manager
Bob Alice
Charlie Bob
David Alice
  • employees 테이블 내에서 상위 관리자를 찾는 예제

 

 


 

정리

JOIN 유형 결과
INNER JOIN 공통된 데이터만 출력 (교집합)
LEFT JOIN 왼쪽 테이블 전체 + 오른쪽 일치 데이터 (없으면 NULL)
RIGHT JOIN 오른쪽 테이블 전체 + 왼쪽 일치 데이터 (없으면 NULL)
FULL JOIN 모든 데이터 포함 (일치하지 않으면 NULL)
CROSS JOIN 모든 가능한 조합 출력 (카테시안 곱)
SELF JOIN 자기 자신을 조인하여 계층 구조 표현

 

 

 

 

 

728x90

'Tech > SQL' 카테고리의 다른 글

[SQL] DATE_FORMAT (MySQL)  (0) 2025.04.06
[SQL] COALESCE  (0) 2025.02.08
[SQL] ROUND, CEIL, FLOOR (반올림, 올림, 내림)  (0) 2025.02.08
[SQL] CASE WHEN  (0) 2025.02.08
[SQL] WITH AS (Common Table Expression, CTE)  (0) 2025.02.08