데이터베이스

11. 효율적 쿼리_JOIN - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 1. 20. 08:56

1. JOIN

  • 관계형 데이터베이스의 핵심 : 여러 개의 테이블을 하나로 묶는 방법

2. JOIN의 종류

  • INNER JOIN : 교집합(테이블1과, 테이블2의 결합 조건을 모두 만족하는 데이터만을 선택해 결합)
SELECT 열명
FROM 테이블명1
    INNER JOIN 테이블명2
    ON 결합조건
    

SELECT
    customers.name,
    customers.age,
    customers.address,
    orders.id,
    orders.product_id,
    orders.quantity,
    orders.amount
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
  • OUTER JOIN
    • LEFT OUTER JOIN : 일단 테이블1 모두 선택, 테이블2를 합치되 매칭되지 않으면 NULL 
    • RIGHT OUTER JOIN : 일단 테이블1 모두 선택, 테이블2를 합치되 매칭되지 않으면 NULL 
    • FULL OUTER JOIN(UNION) : 합집합(두 테이블 모두 선택, 매칭되지 않으면 NULL
    • UNION : MySQL에서는 FULL OUTER JOIN을 지원하지 않아서 UNION키워드를 대신 사용
SELECT 열명
FROM 테이블명1
LEFT JOIN 테이블명2 ON 결합조건
UNION
SELECT 열명
FROM 테이블명1
RIGHT JOIN 테이블명2 ON 결합조건;
  • 예제
CREATE DATABASE example;
USE example;
SHOW DATABASES;
DROP database example;

CREATE TABLE customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT,
    address VARCHAR(255)
);

INSERT INTO customers (name, age, address) VALUES
    ("김가나", 30, "서울시 강남구"),
    ("이다라", 25, "부산시 해운대구"),
    ("박마바", 40, "대구광역시 중구"),
    ("김사아", 50, "광주광역시 서구"),
    ("이자차", 60, "울산광역시 남구"),
    ("박타카", 70, "제주특별자치도 제주시"),
    ("강파하", 80, "강원도 춘천시"),
    ("이카나", 90, "충청북도 청주시"),
    ("박다라", 100, "전라북도 전주시");


SELECT * FROM customers;

CREATE TABLE orders(
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT,
    product_id INT,
    quantity INT,
    amount INT
);

INSERT INTO orders (customer_id, product_id, quantity, amount) VALUES
    (1, 1, 10, 1000),
    (2, 2, 20, 2000),
    (2, 3, 30, 3000),
    (3, 4, 40, 4000),
    (3, 5, 50, 5000),
    (4, 6, 60, 6000),
    (5, 7, 70, 7000),
    (10, 8, 80, 8000),
    (11, 9, 90, 9000);

SELECT * FROM orders;
SELECT * FROM customers;

SELECT 
customers.name,
customers.age,
customers.address,
orders.id,
orders.product_id,
orders.quantity,
orders.amount
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;

SELECT
customers.name,
customers.age,
customers.address
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id
WHERE orders.amount >= 5000;

SELECT 
customers.name,
orders.id AS order_id,
orders.product_id,
orders.quantity,
orders.amount
FROM customers
LEFT OUTER JOIN orders
ON customers.id = orders.customer_id;

SELECT 
customers.name,
orders.id AS order_id,
orders.product_id,
orders.quantity,
orders.amount
FROM customers
LEFT OUTER JOIN orders
ON customers.id = orders.customer_id
UNION
SELECT
customers.name,
orders.id AS order_id,
orders.product_id,
orders.quantity,
orders.amount
FROM customers
RIGHT OUTER JOIN orders
ON customers.id = orders.customer_id;