[SQL] UNION & JOIN

Hyunjun Kim·2024년 9월 25일
0

SQL

목록 보기
4/44

UNION

SQL UNION은 두 개 이상의 SELECT 쿼리 결과를 하나로 결합할 때 사용됩니다. 여러 SELECT 쿼리에서 반환된 결과를 하나의 집합으로 반환하며, 기본적으로 중복된 값은 제거됩니다. 중복된 값을 포함하려면 UNION ALL을 사용할 수 있습니다.

UNION과 UNION ALL의 차이

  • UNION: 중복된 행을 제거하고 결과를 반환합니다.
  • UNION ALL: 중복된 행을 포함하여 모든 결과를 반환합니다.

Ex) orders_jan과 orders_feb 테이블에서 고객 ID를 선택하여, 중복되지 않은 고유한 고객 ID 목록을 반환하세요 - UNION

SELECT customer_id FROM orders_jan
UNION
SELECT customer_id FROM orders_feb;

Ex) orders_jan과 orders_feb 테이블에서 고객 ID를 모두 선택하여, 중복된 고객 ID도 포함한 전체 결과를 반환하세요 - UNION ALL

SELECT customer_id FROM orders_jan
UNION ALL
SELECT customer_id FROM orders_feb;



JOIN

SQL JOIN은 두 개 이상의 테이블을 결합하여 데이터를 조회할 때 사용됩니다. JOIN은 테이블 간에 공통된 키를 기반으로 데이터를 연결함.

JOIN의 종류

  • INNER JOIN: 두 테이블 간의 공통된 값이 있는 행만 반환
  • LEFT JOIN (LEFT OUTER JOIN): 왼쪽 테이블의 모든 행을 반환하며, 오른쪽 테이블에서 일치하는 값이 없는 경우 NULL로 반환.
  • RIGHT JOIN (RIGHT OUTER JOIN): 오른쪽 테이블의 모든 행을 반환하며, 왼쪽 테이블에서 일치하는 값이 없는 경우 NULL로 반환.
  • FULL JOIN (FULL OUTER JOIN): 두 테이블의 모든 행을 반환하며, 일치하지 않는 값은 NULL로 반환.
  • CROSS JOIN: 두 테이블 간의 모든 가능한 조합을 반환.

JOIN 사용법

1. INNER JOIN 사용법

table1과 table2에서 공통 열(common_column)을 기준으로 일치하는 데이터만 반환

SELECT t1.column_name, t2.column_name
FROM table1 t1
INNER JOIN table2 t2 ON t1.common_column = t2.common_column;

2. LEFT JOIN 사용법

table1의 모든 행을 반환하고, table2에서 일치하는 값이 없는 경우 NULL을 반환

SELECT t1.column_name, t2.column_name
FROM table1 t1
LEFT JOIN table2 t2 ON t1.common_column = t2.common_column;

3. RIGHT JOIN 사용법

table2의 모든 행을 반환하고, table1에서 일치하는 값이 없는 경우 NULL을 반환

SELECT t1.column_name, t2.column_name
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.common_column = t2.common_column;

4. FULL JOIN 사용법

두 테이블의 모든 행을 반환하고, 일치하지 않는 값은 NULL로 표시

SELECT t1.column_name, t2.column_name
FROM table1 t1
FULL JOIN table2 t2 ON t1.common_column = t2.common_column;

5. CROSS JOIN 사용법

테이블의 모든 가능한 행 조합을 반환

SELECT t1.column_name, t2.column_name
FROM table1 t1
CROSS JOIN table2 t2;

JOIN 활용 문제

employees와 departments 테이블에서 직원과 그들이 속한 부서의 이름을 출력하세요. 직원이 속한 부서가 없는 경우도 포함하세요.

테이블 구조:

  • employees: 직원 정보
    - employee_id: 직원 ID
    - department_id: 부서 ID
    - employee_name: 직원 이름

  • departments: 부서 정보
    - department_id: 부서 ID
    - department_name: 부서 이름

SELECT e.employee_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

orders와 customers 테이블에서 주문이 있는 고객만 출력하세요.

테이블 구조:

  • orders: 주문 정보
    - order_id: 주문 ID
    - customer_id: 고객 ID
    - order_date: 주문 날짜

  • customers: 고객 정보
    - customer_id: 고객 ID
    - customer_name: 고객 이름

SELECT c.customer_name, o.order_date
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;

employees, departments, projects 테이블을 사용하여 부서별로 담당하고 있는 프로젝트의 이름과 각 부서에 속한 직원의 수를 구하세요.

테이블 구조:

  • employees: 직원 정보
    - employee_id: 직원 ID
    - department_id: 부서 ID

  • departments: 부서 정보
    - department_id: 부서 ID
    - department_name: 부서 이름

  • projects: 프로젝트 정보
    - project_id: 프로젝트 ID
    - department_id: 부서 ID
    - project_name: 프로젝트 이름

SELECT d.department_name, p.project_name, COUNT(e.employee_id) AS employee_count
FROM departments d
LEFT JOIN projects p ON d.department_id = p.department_id
LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY d.department_name, p.project_name;

sales_2023, sales_2024, products 테이블에서 각 제품의 이름과 2023년과 2024년에 팔린 수량을 출력하세요. 두 해 모두 판매된 제품만 포함하세요.

테이블 구조:

  • sales_2023: 2023년 판매 정보
    - product_id: 제품 ID
    - quantity: 판매 수량

  • sales_2024: 2024년 판매 정보
    - product_id: 제품 ID
    - quantity: 판매 수량

  • products: 제품 정보
    - product_id: 제품 ID
    - product_name: 제품 이름

SELECT p.product_name, s1.quantity AS quantity_2023, s2.quantity AS quantity_2024
FROM products p
INNER JOIN sales_2023 s1 ON p.product_id = s1.product_id
INNER JOIN sales_2024 s2 ON p.product_id = s2.product_id;

0개의 댓글