Post

[SQL] Join과 Union에 대해서

JOIN

SQL에서 ‘JOIN’은 여러 데이터 테이블을 결합하여 데이터를 검색하는 데 사용되는 중요한 개념이다. 조인을 사용하면 서로 다른 테이블의 관련 데이터를 연결하여 하나의 결과 집합으로 표시 할 수 있다.

join

내부 조인 (Inner Join)

두 테이블에서 일치하는 행만 반환(NOT NULL)한다. 두 테이블 간에 일치하는 데이터가 없는 경우, 해당 행은 결과 집합에 포함되지 않는다.

기본 구문

1
2
3
4
SELECT column_names
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;
  • INNER 구문 생략 가능: ‘JOIN’만 사용시 기본적으로 ‘INNER JOIN’을 하므로 생략이 가능하다.
  • ON 조인 조건: ‘ON’절은 두 테이블을 어떻게 연결할지 정의한다. 이 조건은 두 테이블 간의 관계를 명시한다.

여러 테이블을 조인할 수 있다.

데이터베이스에 ‘직원(employee)’, ‘부서(department)’, 그리고 ‘위치(location)’라는 세 개의 테이블이 있을때, 직원의 이름, 그들이 속한 부서의 이름, 그리고 그 부서의 위치 주소를 알고 싶다고 가정

1
2
3
4
SELECT E.name, D.department_name, L.address
FROM employee E
INNER JOIN department D ON E.department_id = D.department_id
INNER JOIN locations L ON D.location_id = L.location_id;

Self Join

‘Self Join’은 동일한 테이블을 마치 두 개의 별도 테이블인 것처럼 조인하는 방법이다. 이를 통해 같은 테이블 내에서 관계를 탐색 할 수 있다.

‘직원(employee)’ 테이블에 manager_id라는 필드가 있다고 가정해 봅시다. 이 필드는 각 직원의 상사(manager)의 employee_id를 나타냅니다. 상사와 그의 부하 직원의 이름을 알고 싶다고 가정

1
2
3
SELECT E1.name AS Employee, E2.name AS Manager
FROM employee E1
INNER JOIN employee E2 ON E1.manager_id = E2.employee_id;

외부 조인 (Outer Join)

내부 조인과 달리, 일치하지 않는 행도 결과에 포함시킨다.

Left Outer Join

왼쪽 테이블의 모든 행과 두 번째 테이블에서 일치하는 행을 반환한다. 오른쪽 테이블에 일치하는 행이 없는 경우, 결과에 'NULL'값이 포함된다.

1
2
3
4
SELECT column_names
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;

Right Outer Join

오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 반환한다.

1
2
3
4
SELECT column_names
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

Full Outer Join

두 테이블의 모든 행을 반환한다. 한쪽 테이블에만 존재하는 행은 다른 쪽 테이블에서 ‘NULL’값으로 표시된다.

1
2
3
4
SELECT column_names
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

Inner & Left & Right

  • 이와 같은 테이블이 있을 때 image

  • Inner

1
2
3
4
5
6
7
SELECT
  E1.EmployeeID, CONCAT_WS(' ', E1.FirstName, E1.LastName) AS Employee,
  E2.EmployeeID, CONCAT_WS(' ', E2.FirstName, E2.LastName) AS NextEmployee
FROM Employees E1
JOIN Employees E2
ON E1.EmployeeID + 1 = E2.EmployeeID
ORDER BY E1.EmployeeID;

image

‘E1’, ‘E2’에 값이 없는 경우 출력하지 않음

  • Left
1
2
3
4
5
6
7
SELECT
  E1.EmployeeID, CONCAT_WS(' ', E1.FirstName, E1.LastName) AS Employee,
  E2.EmployeeID, CONCAT_WS(' ', E2.FirstName, E2.LastName) AS NextEmployee
FROM Employees E1
LEFT JOIN Employees E2
ON E1.EmployeeID + 1 = E2.EmployeeID
ORDER BY E1.EmployeeID;

image

왼쪽 기준 값이 있으면 출력, 오른쪽 값이 없는 경우 NULL

  • Right
1
2
3
4
5
6
7
SELECT
  E1.EmployeeID, CONCAT_WS(' ', E1.FirstName, E1.LastName) AS Employee,
  E2.EmployeeID, CONCAT_WS(' ', E2.FirstName, E2.LastName) AS NextEmployee
FROM Employees E1
RIGHT JOIN Employees E2
ON E1.EmployeeID + 1 = E2.EmployeeID
ORDER BY E1.EmployeeID;

image

크로스 조인 (Cross Join)

두 테이블의 모든 가능한 조합을 반환한다. 예를 들어, 하나의 테이블에 5개의 행이 있고 다른 테이블에 3개의 행이 있는 경우, 결과 집합에는 15개(5*3)의 행이 생성된다.

Full Join과 차이점

‘Full Join’은 두 테이블 간의 일치하는 행을 찾아 연결하고, 일치하지 않는 행도 포함 한다. 일치하지 않는 행의 경우, 해당 되지 않는 테이블의 열 값은 NULL로 채워진다. 반면, 크로스 조인은 두 테이블 간의 조인 조건을 고려하지 않고 단순히 모든 가능한 조합을 생성한다. 따라서 크로스 조인은 조건이 없는 반면, ‘Full Join’은 테이블 간의 관계를 기반으로 한 조건이 적용된다.

자연 조인 (Natural Join)

두 테이블 간에 동일한 이름을 가진 모든 열에 대해 내부 조인을 수행한다. 명시적으로 조인 조건을 지정할 필요가 없다.

UNION

두 개 이상의 SELECT문의 결과를 하나의 결과 집합으로 결합하는데 사용된다. 이를 통해 여러 쿼리의 결과를 하나의 결과로 통합할 수 있다.

image

규칙

  1. 열의 수와 데이터 타입: 결합하려는 각 SELECT문은 동일한 수의 열을 반환해야 하며, 해당 열들은 서로 호환 가능한 데이터 타입을 가져야 한다.
  2. 중복 제거: 기본적으로, UNION은 두 쿼리의 결과에서 중복된 행을 제거한다. 즉, 각 행은 결과 집합에서 유일하게 나타난다.
  3. UNION ALL: 중복된 행을 보존하려면, ‘UNION ALL’을 사용한다. 이 경우, 중복 제거 과정이 생략되어 처리 속도가 더 빠를 수 있다.
1
2
3
4
5
SELECT employee_id, name
FROM project1
UNION
SELECT employee_id, name
FROM project2;
This post is licensed under CC BY 4.0 by the author.