Seung's Learning Record

[SQL] JOIN 구문 본문

프로그래밍/SQL

[SQL] JOIN 구문

70_0ewd 2024. 2. 21. 02:07

JOIN을 통해 두 개 이상의 테이블을 연결해서 원하는 결과를 만들어 낼 수 있다. 이 때 테이블의 조인을 위해서는 기본키와 외래키가 연결되어야 하며, 이를 일대다 관계라고 한다. JOIN의 종류에는 아래와 같은 것들이 있다.

  • INNER JOIN(내부 조인) : 두 테이블에서 공통된 값을 가지는 행들을 반환
  • OUTER JOIN(외부 조인) : 두 테이블에서 공통된 값을 가지지 않는 행들도 반환
    • LEFT OUTER JOIN : 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 왼쪽 테이블과 공통된 값을 가지는 행들을 반환
    • RIGHT OUTER JOIN :  오른쪽 테이블의 모든 행과 왼쪽 테이블에서 오른쪽 테이블과 공통된 값을 가지는 행들을 반환
    • FULL OUTER JOIN : 두 테이블에서 모든 값을 반환
  • CROSS JOIN(상호 조인) : 두 개 이상의 테이블에서 모든 가능한 조합을 만들어 반환
employees 테이블
| id | name   | department_id |
|----|--------|---------------|
| 1  | John   | 1             |
| 2  | Alice  | 2             |
| 3  | Bob    | 1             |


departments 테이블
| id | name       |
|----|------------|
| 1  | HR         |
| 2  | Marketing  |
| 3  | Finance    |

INNER JOIN

SELECT employees.name AS employee_name, departments.name AS department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;



/* 결과 */
| employee_name | department_name |
|---------------|-----------------|
| John          | HR              |
| Alice         | Marketing       |
| Bob           | HR              |

LEFT OUTER JOIN

SELECT employees.name AS employee_name, departments.name AS department_name
FROM employees
LEFT OUTER JOIN departments ON employees.department_id = departments.id;


/* 결과 */
| employee_name | department_name |
|---------------|-----------------|
| John          | HR              |
| Alice         | Marketing       |
| Bob           | HR              |

RIGHT OUTER JOIN

SELECT employees.name AS employee_name, departments.name AS department_name
FROM employees
RIGHT OUTER JOIN departments ON employees.department_id = departments.id;


/* 결과 */
| employee_name | department_name |
|---------------|-----------------|
| John          | HR              |
| NULL          | Marketing       |
| Bob           | HR              |

FULL OUTER JOIN

SELECT employees.name AS employee_name, departments.name AS department_name
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.id;


/* 결과 */
| employee_name | department_name |
|---------------|-----------------|
| John          | HR              |
| Alice         | Marketing       |
| Bob           | HR              |
| NULL          | Finance         |
| NULL          | NULL            |

CROSS JOIN

SELECT employees.name AS employee_name, departments.name AS department_name
FROM employees
CROSS JOIN departments;


/* 결과 */
| employee_name | department_name |
|---------------|-----------------|
| John          | HR              |
| John          | Marketing       |
| John          | Finance         |
| Alice         | HR              |
| Alice         | Marketing       |
| Alice         | Finance         |
| Bob           | HR              |
| Bob           | Marketing       |
| Bob           | Finance         |

두 개의 테이블을 합치는 방법으로는 JOIN 말고도 UNION이라는 방법도 있다. 

  • UNION : 두 개의 테이블에서 중복을 제거하고 합친 모든 행을 반환
  • UNION ALL : 두 개의 테이블에서 중복을 제거하지 않고 합친 모든 행을 반환

UNION과 FULL JOIN은 일치하지 않는 레코드의 처리 방식에 차이를 가진다. FULL JOIN은 일치하지 않아도 모두 반환하는 반면 UNION은 일치하는 레코드만 반환한다.

UNION

SELECT name AS employee_or_department_name, 'Employee' AS type
FROM employees
UNION
SELECT name AS employee_or_department_name, 'Department' AS type
FROM departments;


/* 결과 */
| employee_or_department_name | type       |
|-----------------------------|------------|
| John                        | Employee   |
| Alice                       | Employee   |
| Bob                         | Employee   |
| HR                          | Department |
| Marketing                   | Department |
| Finance                     | Department |

UNION ALL

SELECT name AS employee_or_department_name, 'Employee' AS type
FROM employees
UNION ALL
SELECT name AS employee_or_department_name, 'Department' AS type
FROM departments;


/* 결과 */
| employee_or_department_name | type       |
|-----------------------------|------------|
| John                        | Employee   |
| Alice                       | Employee   |
| Bob                         | Employee   |
| HR                          | Department |
| Marketing                   | Department |
| Finance                     | Department |