ํ
SQL ์กฐ์ธ์ ์ฌ๋ฌ ๊ฐ์ ํ
์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํ์์ ์ธ ๊ธฐ์ ์
๋๋ค.
์ด ๊ธ์์๋ ๊ฐ ์กฐ์ธ์ ๊ฐ๋
, ์ฐจ์ด์ , ์ฌ์ฉ ์ฌ๋ก, ํผํฌ๋จผ์ค ์ต์ ํ ๋ฐฉ๋ฒ๊น์ง ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํฉ๋๋ค.
SQL ์กฐ์ธ์ ํฌ๊ฒ INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, UNION, INTERSECT๋ก ๋๋ฉ๋๋ค.
๊ฐ ์กฐ์ธ์ ๊ฐ๋
๊ณผ ์ฐจ์ด์ ์ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ ๋ฆฌํ์ต๋๋ค.
| ์กฐ์ธ ์ข ๋ฅ | ์ค๋ช | ๋น์ | SQL ๋ฌธ๋ฒ |
|---|---|---|---|
| INNER JOIN | ๊ณตํต๋ ๋ฐ์ดํฐ๋ง ๋ฐํ | ๋ ํ ์ด๋ธ์์ ๊ฒน์น๋ ๋ถ๋ถ๋ง ์ถ์ถ | INNER JOIN |
| LEFT JOIN | ์ผ์ชฝ ํ ์ด๋ธ ๋ชจ๋ ๋ฐ์ดํฐ + ์ค๋ฅธ์ชฝ ๋งค์นญ ๋ฐ์ดํฐ | ์ผ์ชฝ ํ ์ด๋ธ ๊ธฐ์ค, ์ค๋ฅธ์ชฝ ์๋ ๊ฐ์ NULL | LEFT JOIN |
| RIGHT JOIN | ์ค๋ฅธ์ชฝ ํ ์ด๋ธ ๋ชจ๋ ๋ฐ์ดํฐ + ์ผ์ชฝ ๋งค์นญ ๋ฐ์ดํฐ | ์ค๋ฅธ์ชฝ ํ ์ด๋ธ ๊ธฐ์ค, ์ผ์ชฝ ์๋ ๊ฐ์ NULL | RIGHT JOIN |
| FULL OUTER JOIN | ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจ | NULL๋ ํฌํจํ์ฌ ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ | FULL OUTER JOIN |
| UNION | ์ค๋ณต ์ ๊ฑฐ ํ ํฉ์งํฉ | A์ B์ ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต ์์ด ๊ฒฐํฉ | UNION |
| INTERSECT | ๊ณตํต๋ ๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ | ๋ ํ ์ด๋ธ์ ๊ณตํต์ผ๋ก ์กด์ฌํ๋ ๋ฐ์ดํฐ ๋ฐํ | INTERSECT |
์์ : ๊ณ ๊ฐ๊ณผ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ์ฌ ๊ณตํต๋ ๊ณ ๊ฐ๋ง ์กฐํ
SELECT customers.name, orders.order_id
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
๊ฒฐ๊ณผ:
โ
์ฃผ๋ฌธ์ ํ ๊ณ ๊ฐ๋ง ์กฐํ (์ฃผ๋ฌธ์ด ์๋ ๊ณ ๊ฐ์ ์ ์ธ๋จ)
์์ : ๋ชจ๋ ๊ณ ๊ฐ์ ๊ฐ์ ธ์ค๋, ์ฃผ๋ฌธ์ด ์๋ ๊ณ ๊ฐ๋ ํฌํจ
SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
๊ฒฐ๊ณผ:
โ
์ฃผ๋ฌธ์ด ์๋ ๊ณ ๊ฐ๋ ์กฐํ๋๋ฉฐ, ์ฃผ๋ฌธ์ด ์๋ ๊ฒฝ์ฐ NULL ๊ฐ ํฌํจ
์์ : ๋ชจ๋ ์ฃผ๋ฌธ์ ๊ฐ์ ธ์ค๋, ๊ณ ๊ฐ ์ ๋ณด๊ฐ ์๋ ์ฃผ๋ฌธ๋ ํฌํจ
SELECT customers.name, orders.order_id
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
๊ฒฐ๊ณผ:
โ
์ฃผ๋ฌธ์ด ์์ง๋ง ๊ณ ๊ฐ ์ ๋ณด๊ฐ ์๋ ๋ฐ์ดํฐ๋ ํฌํจ (์: ํํดํ ๊ณ ๊ฐ)
์์ : ๋ชจ๋ ๊ณ ๊ฐ๊ณผ ๋ชจ๋ ์ฃผ๋ฌธ์ ๊ฐ์ ธ์ค๋, ๋งค์นญ๋์ง ์๋ ๋ฐ์ดํฐ๋ NULL ์ฒ๋ฆฌ
SELECT customers.name, orders.order_id
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id;
๊ฒฐ๊ณผ:
โ
๋ชจ๋ ๊ณ ๊ฐ๊ณผ ๋ชจ๋ ์ฃผ๋ฌธ์ด ํฌํจ๋๋ฉฐ, ๋งค์นญ๋์ง ์๋ ๊ฐ์ NULL ์ฒ๋ฆฌ
์์ : ๋ ๊ฐ์ ์ง์ ์์ ํ๋งค๋ ์ํ ๋ชฉ๋ก์ ํตํฉ
SELECT product_name FROM store1
UNION
SELECT product_name FROM store2;
๊ฒฐ๊ณผ:
โ
์ค๋ณต๋ ์ํ์ ํ๋๋ง ํฌํจ๋จ
์์ : ๋ ๊ฐ์ ์ง์ ์์ ๊ณตํต์ ์ผ๋ก ํ๋งค๋ ์ํ ์กฐํ
SELECT product_name FROM store1
INTERSECT
SELECT product_name FROM store2;
๊ฒฐ๊ณผ:
โ
๋ ์ง์ ์์ ๋ชจ๋ ํ๋งค๋๋ ์ํ๋ง ์ถ๋ ฅ๋จ
SQL ์กฐ์ธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์๋ ์ต์ ํ ์ ๋ต์ ์ ์ฉํ๋ฉด ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์กฐ์ธ์ ์คํํ ์ ์์ต๋๋ค.
ON ์กฐ๊ฑด ์ต์ ํJOIN์ ์ํํ ๋ WHERE๊ฐ ์๋๋ผ ON์ ์ฌ์ฉํด์ผ ํ๋ค.ON์ ์ฌ์ฉํ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค(INDEX) ์ค์ ์ด ํ์.SELECT * FROM orders o
INNER JOIN customers c
ON o.customer_id = c.customer_id;
โ ๋นํจ์จ์ ์ธ ์์ (WHERE ์ฌ์ฉ)
SELECT * FROM orders o, customers c
WHERE o.customer_id = c.customer_id;
โ
JOIN ON์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋น ๋ฅด๊ณ ์ต์ ํ๋จ
INDEX(์ธ๋ฑ์ค) ์ค์ ํ์์กฐ์ธ์ ํ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ์๋๊ฐ ๋๋ ค์ง๋ค
PRIMARY KEY ๋๋ FOREIGN KEY๋ก ์ค์ ํ๋ฉด ์ฑ๋ฅ ํฅ์ ๊ฐ๋ฅ.
CREATE INDEX idx_customer_id ON customers(customer_id);
CREATE INDEX idx_order_id ON orders(order_id);
โ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ฉด ์กฐ์ธ ์๋๊ฐ ๋ํญ ํฅ์๋จ
ํ์ํ ์ปฌ๋ผ๋ง ๊ฐ์ ธ์ค๊ธฐSELECT * ๋์ ์ ํํ ์ปฌ๋ผ์ ๋ช
์ํ๋ฉด ์ฑ๋ฅ์ด ์ข์์งSELECT customers.name, orders.order_id
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
โ ๋ถํ์ํ ๋ฐ์ดํฐ ๋ก๋ฉ์ ์ค์ด๊ณ ์ต์ ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํ ๊ฐ๋ฅ
EXISTS vs JOIN ๋น๊ตSELECT * FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o WHERE c.customer_id = o.customer_id
);
โ ์ฃผ๋ฌธ์ด ์๋ ๊ณ ๊ฐ๋ง ์ฐพ์ ๋๋ EXISTS๊ฐ ๋ ํจ์จ์ ์ผ ์ ์์
WITH๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ์ฟผ๋ฆฌ ์ต์ ํWITH FilteredOrders AS (
SELECT * FROM orders WHERE order_date >= '2024-01-01'
)
SELECT * FROM FilteredOrders o
INNER JOIN customers c
ON o.customer_id = c.customer_id;
โ WITH๋ฅผ ํ์ฉํ๋ฉด ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๊ฐ๋ ์ฑ์ด ํฅ์๋จ
SQL ์กฐ์ธ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋
์ค ํ๋์
๋๋ค.
์กฐ์ธ์ ๊ฐ๋
์ ์ ํํ ์ดํดํ๊ณ , ์ต์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๐ ํต์ฌ ์์ฝ
โ INNER JOIN โ ๊ณตํต๋ ๋ฐ์ดํฐ๋ง
โ LEFT JOIN โ ์ผ์ชฝ ๋ฐ์ดํฐ ์ ๋ถ ํฌํจ
โ RIGHT JOIN โ ์ค๋ฅธ์ชฝ ๋ฐ์ดํฐ ์ ๋ถ ํฌํจ
โ FULL OUTER JOIN โ ๋ชจ๋ ๋ฐ์ดํฐ ํฌํจ (NULL ํฌํจ)
โ UNION โ ์ค๋ณต ์ ๊ฑฐ ํ ํฉ์งํฉ
โ INTERSECT โ ๊ณตํต๋ ๊ฐ๋ง ์ถ์ถ
๐ฏ ํผํฌ๋จผ์ค ์ต์ ํ๋ฅผ ์ํด
ON ์กฐ๊ฑด์ ์ต์ ํํ๊ณ WHERE ๋์ ์ฌ์ฉ SELECT * ์ง์) WITH๋ก ์ต์ ํ SQL ์กฐ์ธ์ ๋จ์ํ ๊ฐ๋
์ด์ง๋ง, ์ ์ ํ๊ฒ ํ์ฉํ๋ฉด ์ฑ๋ฅ ์ต์ ํ๊น์ง ๊ฐ๋ฅํฉ๋๋ค.
์ค์ ํ๋ก์ ํธ์์ ํ์ฉํ๋ฉฐ ์ฒด๊ณ์ ์ผ๋ก ์ตํ ๋๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.