1. JOIN / GROUP BY / HAVING
1-1. JOIN
ํ์ค ์ธ๊ณ์ ๋ฐ์ดํฐ๋ ๋ณดํต ํ ์ด๋ธ ํ๋์ ๋ค ๋ฃ์ง ์๊ณ ์ฌ๋ฌ ํ ์ด๋ธ๋ก ๋๋์ด ์ ์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด,
- user ํ ์ด๋ธ: ์ฌ์ฉ์ ์ ๋ณด (id, name, email…)
- orders ํ ์ด๋ธ: ์ฃผ๋ฌธ ์ ๋ณด (id, user_id, total_price…)
์ด๋ ๊ฒ ๋๋ ๋์ผ๋ฉด, ์ด๋ค ์ฌ์ฉ์๊ฐ ์ด๋ค ์ฃผ๋ฌธ์ ํ๋์ง๋ฅผ ๋ณด๋ ค๋ฉด ๋ ํ ์ด๋ธ์ ๋ฌถ์ด์ ์กฐํํด์ผ ํฉ๋๋ค.
์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด JOIN์ ๋๋ค.
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒ์ INNER JOIN, LEFT JOIN์ ๋๋ค.
1. INNER JOIN
๋ ํ ์ด๋ธ์์ ์กฐ๊ฑด์ ์ผ์นํ๋ ํ๋ง ๊ฐ์ ธ์ค๋ ์กฐ์ธ์ ๋๋ค.
SELECT u.id, u.name, o.id AS order_id, o.total_price
FROM users u
JOIN orders o ON u.id = o.user_id;
- users์ orders์์ u.id = o.user_id๊ฐ ๊ฐ์ ํ๋ค๋ง ๊ฒฐ๊ณผ์ ๋์ต๋๋ค.
- ์ฃผ๋ฌธ์ ํ ์ ์ด ์๋ ์ฌ์ฉ์(orders์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ฌ์ฉ์)๋ ๊ฒฐ๊ณผ์ ๋์ค์ง ์์ต๋๋ค.
2. LEFT (OUTER) JOIN
์ผ์ชฝ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ ๋ชจ๋ ๊ฐ์ ธ์ค๊ณ , ์ค๋ฅธ์ชฝ์ ๋งค์นญ๋๋ ๊ฒ๋ง ๊ฐ์ ธ์ค๋ ์กฐ์ธ์ ๋๋ค.
SELECT u.id, u.name, o.id AS order_id, o.total_price
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
- ์ฌ์ฉ์๋ ๋ชจ๋ ๊ฐ์ ธ์ต๋๋ค.
- ์ฃผ๋ฌธ์ด ์๋ ์ฌ์ฉ์๋ order_id, total_price๊ฐ NULL๋ก ๋์ต๋๋ค.
- ์ฃผ๋ฌธ์ ํ๋ ์ ํ๋ ์ ์ฒด ์ฌ์ฉ์ ๋ชฉ๋ก๊ณผ ์ฃผ๋ฌธ์ ๋ณด๋ฅผ ๋ณด๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
3. FULL (OUTER) JOIN
๋ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋งค์นญ๋์ง ์๋ ๋ถ๋ถ์ NULL๋ก ์ฑ์์ ํฉ์น๋ ์กฐ์ธ์ ๋๋ค.
SELECT *
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;
- ์ฌ์ฉ์์ ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์ต๋๋ค.
- MySQL์ FULL OUTER JOIN์ ๊ณต์ ์ง์ํ์ง ์์ต๋๋ค. (PostgreSQL, Oracle ๋ฑ์์๋ ์ง์ํฉ๋๋ค)
- MySQL์์ ๋น์ทํ ํจ๊ณผ๋ฅผ ๋ด๋ ค๋ฉด LEFT JOIN + UNION + RIGHT JOIN ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
1-2. GROUP BY
GROUP BY๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ด์ ์ง๊ณํ ๋ ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์๋ณ ์ฃผ๋ฌธ ์ด์ก, ์ผ์๋ณ ๊ฐ์ ์ ์, ์นดํ ๊ณ ๋ฆฌ๋ณ ์ํ ๊ฐ์ ๊ฐ์ ๊ฒ์ ๊ตฌํ ๋ ์ฌ์ฉํฉ๋๋ค.
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;
- orders ํ ์ด๋ธ์์ user_id๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌถ๊ณ ,
- ๊ฐ ์ฌ์ฉ์๋ณ๋ก ์ฃผ๋ฌธ ๊ฑด์๋ฅผ ์ธ์ด์ค๋๋ค.
SELECT user_id, SUM(total_price) AS total_spent
FROM orders
GROUP BY user_id;
- ์ฌ์ฉ์๋ณ๋ก ์ผ๋ง๋ ๊ฒฐ์ ํ๋์ง ์ด์ก์ ๊ตฌํ ์ ์์ต๋๋ค.
์ค์ํ ์ ์ SELECT ์ ์ ์๋ ์นผ๋ผ ์ค, ์ง๊ณ ํจ์๊ฐ ์๋ ์นผ๋ผ์ ๋ชจ๋ GROUP BY์ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
- ์ง๊ณ ํจ์: COUNT(), SUM(), AVG(), MAX(), MIN() ๋ฑ
// ์๋ชป๋ ์์ - total_price๋ GROUP BY์๋ ์๊ณ , ์ง๊ณ ํจ์๋ ์๋
SELECT user_id, total_price, SUM(total_price)
FROM orders
GROUP BY user_id;
// ์ ์ ์์1 - ๋ชจ๋ ๋น์ง๊ณ ์ปฌ๋ผ์ GROUP BY์ ํฌํจ
SELECT user_id, total_price, SUM(total_price)
FROM orders
GROUP BY user_id, total_price;
// ์ ์ ์์2 - total_price๋ฅผ ์ง๊ณ ํจ์๋ก ๋ฌถ๊ธฐ
SELECT user_id, SUM(total_price) AS total_spent
FROM orders
GROUP BY user_id;
1-3. HAVING
HAVING์ GROUP BY ํ์ ๋ง๋ค์ด์ง ๊ทธ๋ฃน์ ์กฐ๊ฑด์ ๊ฑฐ๋ ๊ฒ์ ๋๋ค. WHERE๊ณผ ๋น๊ตํ์๋ฉด, WHERE๋ GROUP BY ์ ์ ๊ฐ ํ(row)์ ์กฐ๊ฑด์ ๊ฑฐ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์๋ณ ์ฃผ๋ฌธ ์ด์ก์ด 10๋ง ์ ์ด์์ธ ์ฌ์ฉ์๋ง ๋ณด๊ณ ์ถ๋ค๊ณ ํ๋ค๋ฉด
SELECT user_id, SUM(total_price) AS total_spent
FROM orders
GROUP BY user_id
HAVING SUM(total_price) >= 100000;
- SUM(total_price)๋ ์ง๊ณ ๊ฒฐ๊ณผ์ด๋ฏ๋ก WHERE์ด ์๋ HAVING์์ ํํฐ๋งํด์ผ ํฉ๋๋ค.
์ ๋ฆฌํ๋ฉด:
- WHERE: ์ผ๋ฐ ํ ํํฐ๋ง
- HAVING: ์ง๊ณ ๊ฒฐ๊ณผ ํํฐ๋ง
SQL ์คํ ์์ FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY
2. ์ธ๋ฑ์ค์ B-Tree ๋์ ์๋ฆฌ
2-1. ์ธ๋ฑ์ค๋?
์ธ๋ฑ์ค๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ผ์ผ์ด ํ์ง ์๊ณ ๋, B-Tree ๊ฐ์ ์ ๋ ฌ๋ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ์ํ๋ ๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํ ‘๊ฒ์์ฉ ๋ชฉ์ฐจ’์ ๋๋ค.
DB์์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์ฒ์๋ถํฐ ๋๊น์ง ๊ฒ์ฌ(Full Scan) ํด์ผ ํฉ๋๋ค.
ํ์ง๋ง ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด, ์ธ๋ฑ์ค๋ฅผ ๋ณด๊ณ ์ํ๋ ๊ฐ์ด ์๋ ์์น๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ธ๋ฑ์ค๋ ์ฃผ๋ก WHERE ์กฐ๊ฑด, JOIN ์กฐ๊ฑด, ORDER BY ์นผ๋ผ์ ์ค์ ํฉ๋๋ค.
// ๋จ์ผ ์ธ๋ฑ์ค
CREATE INDEX idx_users_age ON users(age);
// ๋ณตํฉ ์ธ๋ฑ์ค
CREATE INDEX idx_orders_user_created
ON orders(user_id, created_at);
2-2. B-Tree ์ธ๋ฑ์ค์ ๊ธฐ๋ณธ ๋์
๊ด๊ณํ DB์์ ๊ฐ์ฅ ํํ ์ธ๋ฑ์ค ๊ตฌ์กฐ๋ B-Tree์ ๋๋ค.
ํต์ฌ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ธ๋ฑ์ค๋ ํน์ ์นผ๋ผ ๊ฐ๋ค์ ์ ๋ ฌ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ ์ฅํฉ๋๋ค.
- ํธ๋ฆฌ์ ๋ ธ๋์๋ “ํค ๊ฐ”๊ณผ “๋ค์ ๋ ธํธ ๋๋ ์ค์ ๋ฐ์ดํฐ ์์น”๊ฐ ๋ค์ด ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๋ ํธ๋ฆฌ๋ฅผ ํ๊ณ ๋ด๋ ค๊ฐ๋ฉฐ ๋น๊ตํฉ๋๋ค. → ์ด์ง ํ์๊ณผ ๋น์ทํ๊ฒ O(log N) ์๊ฐ์ ์ํ๋ ๊ฐ์ ์ฐพ์ ์ ์์ต๋๋ค.
3. ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋์ง ์๋(์ ๋จนํ๋ ) ๊ฒฝ์ฐ
์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด๋, ํญ์ ์ฌ์ฉ๋๋ ๊ฒ์ ์๋๋๋ค.
DB๊ฐ ์ธ๋ฑ์ค๋ฅผ ์จ๋ ์ด๋์ด ์๋ค๊ณ ํ๋จํ๋ ๊ฒฝ์ฐ๋ ์๊ณ , ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฟผ๋ฆฌ ๊ตฌ์กฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ๋ชป ์ฐ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
3-1. ํจ์/์ฐ์ฐ์ ์นผ๋ผ์ ์ง์ ์ฌ์ฉํ ๊ฒฝ์ฐ
SELECT * FROM users
WHERE DATE(created_at) = '2025-01-01';
- created_at์ ์ธ๋ฑ์ค๊ฐ ์์ด๋ DATE(created_at)์ฒ๋ผ ์นผ๋ผ์ ํจ์๋ฅผ ์์ฐ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ ํ์ฉํ์ง ๋ชปํฉ๋๋ค.
SELECT * FROM users
WHERE created_at >= '2025-01-01'
AND created_at < '2025-01-02';
- ๊ฐ๋ฅํ๋ฉด ์ด๋ ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
3-2. LIKE ‘% ๊ฐ’ ํํ (์์ %๊ฐ ๋ถ๋ ๊ฒฝ์ฐ)
SELECT * FROM users
WHERE name LIKE '%bin';
- ๋ฌธ์์ด ์์ %๊ฐ ๋ถ์ด ์์ผ๋ฉด, ์ธ๋ฑ์ค ์ ์ฅ์์๋ ์๋ถ๋ถ์ด ๋ญ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ ๋๋ก ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก Full Scan์ด ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
WHERE name LIKE 'hyebin%'
- ๋ฐ๋ฉด ์์ด ๊ณ ์ ๋์ด ์๊ณ ๋ค์ %๊ฐ ๋ถ๋ ๊ฒฝ์ฐ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
3-3. ๋ณตํฉ ์ธ๋ฑ์ค์์ ์ ๋ ์นผ๋ผ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ
INDEX idx_user (user_id, created_at)
// ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ
WHERE user_id = 10
WHERE user_id = 10 AND created_at >= '2025-01-01'
//์ฌ์ฉ๋์ง ์์ ์ ์๋ ๊ฒฝ์ฐ
WHERE created_at >= '2025-01-01'
- user_id → created_at ์์๋ก ์ ๋ ฌ๋์ด ์๋ ๋ณตํฉ ์ธ๋ฑ์ค์์๋ ์ผ์ชฝ(์ ๋) ์นผ๋ผ๋ถํฐ ์์๋๋ก ์ฌ์ฉํ ๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
3-4. ์กฐ๊ฑด์ ํด๋นํ๋ ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ๋ง์ ๋ (์ ํ๋๊ฐ ๋ฎ์ ๋)
SELECT * FROM users
WHERE gender = 'F';
- ์ ์ฒด์ 90%๊ฐ ‘F’๋ผ๋ฉด, ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ์ฌ๊ธฐ์ ๊ธฐ ์ ํํ๋ ๊ฒ๋ณด๋ค ๊ทธ๋ฅ Full Scan์ ํ๋ ๊ฒ ๋ ๋น ๋ฅผ ์๋ ์์ต๋๋ค.
- DB๋ ๋ด๋ถ์ ์ผ๋ก ๋๋ต ๋ช ๊ฑด์ด ๋์ฌ์ง ํต๊ณ๋ฅผ ๋ณด๊ณ ์ธ๋ฑ์ค๋ฅผ ์ธ์ง, Full Scan์ ํ ์ง ํ๋จํฉ๋๋ค.
3-5. ํ์ ์ด ๋ง์ง ์๋ ๋น๊ต, ์์์ ํ๋ณํ
SELECT * FROM users
WHERE id = '100'; -- id๋ INT์ธ๋ฐ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ์ฌ์ฉ
- DB์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง, ํ์ ์ด ๋ง์ง ์์ ๋ด๋ถ์์ ํ๋ณํ์ด ๋ฐ์ํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ ๋๋ก ํ์ฉํ์ง ๋ชปํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฅํ๋ฉด ํ์ ์ ์ ํํ ๋ง์ถฐ์ ๋น๊ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
4. ์คํ ๊ณํ(EXPLAIN) ๊ธฐ๋ณธ ์ฝ๋ ๋ฒ
์ค๋ฌด์์๋ ์ฟผ๋ฆฌ๊ฐ ๋๋ฆฐ๋ฐ ์ ๋๋ฆฐ์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด ์คํ ๊ณํ์ ์์ฃผ ํ์ธํฉ๋๋ค.
EXPLAIN
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;
DB๋ง๋ค ์ถ๋ ฅํ์์ ์กฐ๊ธ์ฉ ๋ค๋ฅด์ง๋ง, ์ค์ํ๊ฒ ๋ณด๋ ์นผ๋ผ์ ๋น์ทํฉ๋๋ค.
ํ์ฌ ๊ธ์์๋ MySQL ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
4-1. ์์ฃผ ๋ณด๋ ์นผ๋ผ
- type
- ์ ๊ทผ ๋ฐฉ์
- ALL ์ด๋ฉด Full Table Scan (๊ฐ์ฅ ์ ์ข์)
- range, ref, eq_ref, const ๋ฑ์ผ๋ก ๊ฐ์๋ก ๋ ์ข์ ๋ฐฉ์
- range: ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ํน์ ๋ฒ์๋ง ์กฐํ (BETWEEN, IN, >, < ….)
- ref: ์ธ๋ฑ์ค๋ก ํน์ ๊ฐ์ ๊ฐ์ง row ์กฐํ (=)
- eq_ref: ์กฐ์ธ์์ ํ ํ ๊ฐ์ row๋ฅผ ์ฐพ์ ๋
- const: ๋ฑ 1๊ฐ์ row๋ง ์ฝ์ผ๋ฉด ๋๋ ์ํฉ์ด๋ผ ์์์ฒ๋ผ ์ทจ๊ธํ ์ ์์ ๋
- key
- ์ค์ ๋ก ์ฌ์ฉ๋ ์ธ๋ฑ์ค ์ด๋ฆ
- NULL์ด๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ
- rows
- ์ด ์ฟผ๋ฆฌ๋ฅผ ์ํด ๋๋ต ๋ช ๊ฐ์ ํ์ ์ฝ์ด์ผ ํ๋์ง ์ถ์ ํ๋ ๊ฐ
- ์ซ์๊ฐ ์์์๋ก ์ฑ๋ฅ์ ์ ๊ธฐ
- Extra
- Using index: ์ธ๋ฑ์ค๋ง ๋ณด๊ณ ๋ฐ์ดํฐ๋ฅผ ํด๊ฒฐํ๋ค๋ ์๋ฏธ (์ปค๋ฒ๋ง ์ธ๋ฑ์ค)
- Using where: WHERE ์กฐ๊ฑด์ผ๋ก ํํฐ๋งํจ
- Using temporary, Using filesort: GROUP BY / ORDER BY ๋๋ฌธ์ ์์ ํ ์ด๋ธ/์ ๋ ฌ์ด ๋ฐ์ํ์์ ์๋ฏธ (์ฃผ์ํ ํ์๊ฐ ์์ต๋๋ค)
4-2. ์ด๋ป๊ฒ ํ์ฉํ๋ฉด ์ข์๊น์?
- type = ALL, rows๊ฐ ์์ฃผ ํฌ๋ค → ์ธ๋ฑ์ค ๊ณ ๋ ค
- key = NULL → ์ธ๋ฑ์ค๊ฐ ์๊ฑฐ๋, ์์ด๋ ์ฌ์ฉํ์ง ์์
- Using temporary, Using filesort → GROUP BY / ORDER BY ์ต์ ํ ํ์ ๊ฐ๋ฅ์ฑ
์ฆ, EXPLAIN์ ์ด ์ฟผ๋ฆฌ๋ฅผ DB๊ฐ ์ด๋ค ๊ฒฝ๋ก๋ก ์ฒ๋ฆฌํ๊ณ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ง๋์ ๋๋ค.
์ด๋ฅผ ๋ณด๊ณ , ์ธ๋ฑ์ค ์ถ๊ฐ๋ ์ฟผ๋ฆฌ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ๊ฒฐ์ ํฉ๋๋ค.
5. ์ ๊ทํ์ ๋ฐ์ ๊ทํ
5-1. ์ ๊ทํ๋?
์ ๊ทํ๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต ์์ด, ์ด์ ํ์์ด ์๋๋ก ์ฌ๋ฌ ํ ์ด๋ธ๋ก ์๊ฒ ๋๋์ด ์ค๊ณํ๋ ๊ณผ์ ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ํ๋์ ํ ์ด๋ธ์ ํ์์ ๋ณด + ์ฃผ๋ฌธ์ ๋ณด + ์ํ์ ๋ณด๊ฐ ๋ค ๋ค์ด์๋ค๋ฉด, ํ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ๊ทธ ํ์์ ๋ชจ๋ ์ฃผ๋ฌธ ํ์ ์์ ํด์ผ ํฉ๋๋ค.
์ด๋ฐ ๊ตฌ์กฐ๋ ์ค๋ณต๋ ๋ง๊ณ , ์์ ์ ์ค์์ ๋ถ์ผ์น๊ฐ ์๊ธฐ๊ธฐ ์ฝ์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ด์(Anomaly)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๊ทธ๋์ ํ์์ members ํ ์ด๋ธ, ์ฃผ๋ฌธ์ orders ํ ์ด๋ธ, ์ํ์ products ํ ์ด๋ธ์ฒ๋ผ ๋๋๊ณ , ๊ด๊ณ(์ธ๋ํค)๋ก ์ฐ๊ฒฐํ๋ ์ค๊ณ๋ฅผ ํฉ๋๋ค.
์ด ๊ณผ์ ์ ๋จ๊ณ์ ์ผ๋ก ์ด๋ก ํํด ๋์ ๊ฒ์ด 1์ ๊ทํ, 2์ ๊ทํ, 3์ ๊ทํ ๋ฑ์ ๋๋ค.
5-2. ์ ๊ทํ์ ์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ๋ฐ์ดํฐ ์ค๋ณต ๊ฐ์
- ํ ๊ณณ๋ง ์์ ํ๋ฉด ๋๋ฏ๋ก ์ผ๊ด์ฑ ์ ์ง ๊ฐ๋ฅ
- ์ด์ ํ์(์ฝ์ /๊ฐฑ์ /์ญ์ ์ด์) ๊ฐ์
๋จ์
- ๋๋ฌด ์๊ฒ ์ชผ๊ฐ๋ฉด, ๋ฐ์ดํฐ ์กฐํํ ๋ ์ฌ๋ฌ ํ
์ด๋ธ์ JOIN ํด์ผ ํจ
- JOIN์ด ๋ง์์๋ก ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํด์ง๊ณ , ์ฑ๋ฅ ๊ฐ์
⇒ ์๋ฒฝํ ์ ๊ทํ๋ณด๋ค๋ ์ ๋นํ ์ ๊ทํ + ํ์์ ๋ฐ์ ๊ทํ๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.
5-3. ๋ฐ์ ๊ทํ๋?
๋ฐ์ ๊ทํ๋ ์กฐํ ์ฑ๋ฅ์ ์ฌ๋ฆฌ๊ธฐ ์ํด ์๋์ ์ผ๋ก ์ค๋ณต์ ํ์ฉํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ํฉ์น๋ ์์ ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฃผ๋ฌธ ๋ด์ญ์ ์กฐํํ ๋๋ง๋ค orders + members + products๋ฅผ ํญ์ JOIN ํด์ผ ํด ์กฐํ๊ฐ ๋๋ฌด ์ฆ๊ณ , ์ฑ๋ฅ์ด ๋ฌธ์ ๊ฐ ๋๋ค๋ฉด ์ฃผ๋ฌธ ํ ์ด๋ธ์ “ํ์ ์ด๋ฆ, ์ํ ์ด๋ฆ, ๊ฐ๊ฒฉ”์ ๋ฃ์ด๋ ์๋ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด, ํ ํ ์ด๋ธ๋ง ์กฐํํด๋ ํ์ํ ์ ๋ณด๋ฅผ ํ ๋ฒ์ ๋ณผ ์ ์์ง๋ง ์ด๋ฆ์ด ๋ฐ๋๊ฑฐ๋ ๊ฐ๊ฒฉ์ด ๋ฐ๋ ๋ ๋ฐ์ดํฐ๊ฐ ์ผ๊ด๋์ง ์์ ์ ์์ต๋๋ค. (๋์ , “์ฃผ๋ฌธ ์์ ์ ์ค๋ ์ท”์ด๋ผ๊ณ ๋ณด๊ณ ํ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.)