728x90
반응형
데이터베이스에서 Join은 서로 다른 테이블들을 연결하여 하나의 테이블로 결과를 보여주는 중요한 작업이다.
우선 MySQL로 데이터베이스 테이블과 샘플 데이터를 설정해보자.
-- 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 sample data
INSERT INTO employees (emp_id, name, dept_id) VALUES
(1, 'Aliece', 101),
(2, 'Bob', 102),
(3, 'Charlie' 103),
(4, 'David', NULL);
INSERT INTO departments (dept_id, dept_name) VALUES
(101, 'HR'),
(102, 'Finance'),
(103, 'IT');
결과


Inner Join
- 교집합 연산과 유사. 하나로 합칠 두 테이블에 모두 연관된 값이 있는 유효한 레코드만 가져오는 방법.
- 두 테이블 중 어느 한쪽이라도 비어있는 값이나 연관성이 없는 값은 제외된다.
- 두 테이블 A, B가 있고 id 필드가 공통적으로 존재한다고 가정할 때, A, B에서 id가 일치하는 행만 결과로 나타난다.
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
결과
| name | dept_name |
| Alice | HR |
| Bob | Finance |
Outer Join
Outer Join은 하나로 합칠 두 테이블 중 어느 하나라도 값을 가진 레코드가 있으면 모두 출력하는 조인 방법이다.
Left, Right, Full로 나뉜다.
Left Join
- 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환한다. 오른쪽 테이블에 일치하는 행이 없는 경우 NULL 값을 갖는다.
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
결과
| name | dept_name |
| Alice | HR |
| Bob | Finance |
| Charlie | NULL |
| David | NULL |
Right Join
- 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환한다. 왼쪽 테이블에 일치하는 행이 없는 경우 NULL 값을 갖는다.
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.dept_id;
결과
| name | dept_name |
| Alice | HR |
| Bob | Finance |
| NULL | IT |
Full Outer Join
DBMS 별 지원 여부가 다르다. Oracle의 경우 Full Outer Join을 지원하지만 MySQL/MariaDB의 경우 지원하지 않아 UNION을 사용해야 한다.
- 두 테이블의 모든 행을 반환한다. 일치하는 행이 없는 경우, 해당 테이블의 부분은 NULL로 표시한다.
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;
결과
| name | dept_name |
| Alice | HR |
| Bob | Finance |
| Charlie | NULL |
| David | NULL |
| NULL | IT |
Cross Join
SELECT e.name, d.dept_name
FROM employees e
CROSS JOIN departments d;

- 두 테이블 간 가능한 모든 조합을 반환한다.
- SQLD나 정처기에서 가끔 레코드 수를 구하는 문제로 출제된다.
= A의 레코드 수 * B의 레코드 수
728x90
반응형
'Database' 카테고리의 다른 글
| MySQL 엔진 아키텍처 이해하기 (0) | 2025.10.09 |
|---|---|
| MySQL, PostgreSQL의 날짜와 시간 타입이 만든 혼란 (1) | 2025.04.23 |
| [ Database ] 정규화, 비정규화, 역정규화 (0) | 2024.01.08 |
| [데이터베이스] RDBMS, NoSQL (2) | 2023.12.16 |
| [데이터베이스] Index (2) | 2023.12.01 |