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 |