SQL์์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ JOIN!
๊ฐ๋
์ ์ต์ํ๋ฐ ๋ง์ ์ฐ๋ ค ํ๋ฉด ํท๊ฐ๋ฆฌ๋ JOIN๋คโฆ
๋ด๊ฐ ์ง์ ๊ถ๊ธํ๋ ๊ฒ๋ค์ ๊ธฐ์ค์ผ๋ก JOIN ์์ ์ ๋ฆฌ + ์ค์ต์ฉ ์์ ๊น์ง ์ค๋นํ์.
๐จ๐ปโ๐ป ์
๋ฌธ์๋ ๊ทธ๋๋ก ๋ฐ๋ผ ํ๋ฉด ๊ฐ ์ก์ ์ ์์!
์ ๋ฐ... ์๊ฐ ๋ด์ ์๋ ํ๊ณ ํ ๋ฒ๋ง ์ค์ต ์์ ๊น์ง ํ์ด์ฃผ๋ฉด ์ข๊ฒ ๋ค... ๋ฌด์กฐ๊ฑด ์ดํด ๋ ํ ๋ฐ...
-- ์๋ ๋ ์ฟผ๋ฆฌ๋ ์์ ํ ๋์ผํ๋ค!
SELECT * FROM A JOIN B ON A.id = B.a_id;
SELECT * FROM A INNER JOIN B ON A.id = B.a_id;
JOIN = INNER JOINMySQL์ FULL OUTER JOIN์ ์ง์ ์ง์ํ์ง ์์!
๋์ ์ด๋ ๊ฒ LEFT JOIN + RIGHT JOIN + UNION ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ:
SELECT *
FROM A LEFT JOIN B ON A.id = B.a_id
UNION
SELECT *
FROM A RIGHT JOIN B ON A.id = B.a_id;
SELECT * FROM A JOIN B WHERE A.id = B.id;
JOIN ... ON ... ๋ฐฉ์์ด ๋ช
ํํ๊ณ ์์ ํจSELECT * FROM A CROSS JOIN B;
A.id, B.id ๊ฐ์ด ๊ฐ์ ์ด๋ฆ์ ์ปฌ๋ผ์ด ์์ ๊ฒฝ์ฐ๋ช ํํ๊ฒ ํ๋ ค๋ฉด ์๋์ฒ๋ผ ์์ฑํ์:
SELECT A.id AS a_id, B.id AS b_id FROM A JOIN B ON A.id = B.id;
id, id_1 ๋ฑ)| id | name |
|---|---|
| 1 | ์ฒ ์ |
| 2 | ์ํฌ |
CREATE TABLE students (
id INT,
name VARCHAR(20)
);
INSERT INTO students (id, name)
VALUES (1, '์ฒ ์'), (2, '์ํฌ');
| id | hobby |
|---|---|
| 1 | ๋๊ตฌ |
| 2 | ํผ์๋ ธ |
| 3 | ๊ฒ์ |
CREATE TABLE hobbies (
id INT,
hobby VARCHAR(20)
);
INSERT INTO hobbies (id, hobby)
VALUES (1, '๋๊ตฌ'), (2, 'ํผ์๋
ธ'), (3, '๊ฒ์');
SELECT s.id AS student_id, s.name, h.hobby
FROM students s
INNER JOIN hobbies h ON s.id = h.id;
โ ๊ณตํต ID๋ง ๋งค์นญ๋จ (1, 2)
SELECT s.id AS student_id, s.name, h.hobby
FROM students s
LEFT JOIN hobbies h ON s.id = h.id;
โ ๋ชจ๋ ํ์ + ๋งค์นญ๋๋ ์ทจ๋ฏธ
(์ํฌ๊ฐ ์๋ ์ทจ๋ฏธ๋ NULL๋ก ๋์ด)
SELECT s.id AS student_id, s.name, h.hobby
FROM students s
RIGHT JOIN hobbies h ON s.id = h.id;
โ ๋ชจ๋ ์ทจ๋ฏธ + ๋งค์นญ๋๋ ํ์
(๊ฒ์์ ํ์ ์์ โ NULL)
SELECT s.id AS student_id, s.name, h.hobby
FROM students s
LEFT JOIN hobbies h ON s.id = h.id
UNION
SELECT s.id AS student_id, s.name, h.hobby
FROM students s
RIGHT JOIN hobbies h ON s.id = h.id;
โ ํ์์ด๋ ์ทจ๋ฏธ๋ ํ๋๋ผ๋ ์กด์ฌํ๋ฉด ์ถ๋ ฅ
SELECT s.id AS student_id, s.name, h.hobby
FROM students s
CROSS JOIN hobbies h;
โ ์ฒ ์ ร 3๊ฐ ์ทจ๋ฏธ, ์ํฌ ร 3๊ฐ ์ทจ๋ฏธ โ ์ด 6ํ ์ถ๋ ฅ
| JOIN ์ข ๋ฅ | ๊ธฐ์ค ํ ์ด๋ธ | ์ถ๋ ฅ ๋ฒ์ |
|---|---|---|
| INNER JOIN | ๋ ๋ค | ์์ชฝ ์กฐ๊ฑด ๋ง๋ ํ๋ง ์ถ๋ ฅ |
| LEFT JOIN | ์ผ์ชฝ | ์ผ์ชฝ ํ ์ด๋ธ ์ ์ฒด + ์ค๋ฅธ์ชฝ ๋งค์นญ |
| RIGHT JOIN | ์ค๋ฅธ์ชฝ | ์ค๋ฅธ์ชฝ ํ ์ด๋ธ ์ ์ฒด + ์ผ์ชฝ ๋งค์นญ |
| FULL JOIN | ๋ ๋ค | ์์ชฝ ํฉ์งํฉ (MySQL์ UNION์ผ๋ก ๊ตฌํ) |
| CROSS JOIN | ์์ | ๋ชจ๋ ์กฐํฉ ์ถ๋ ฅ (๊ณฑ์งํฉ) |
| ์ง๋ฌธ | ํ ์ค ์ ๋ฆฌ |
|---|---|
| JOIN๊ณผ INNER JOIN ์ฐจ์ด? | ๊ธฐ๋ฅ ๊ฐ์ |
| FULL JOIN MySQL์์? | ์ง์ ์์, UNION์ผ๋ก ๋์ฒด |
| ON ์์ด JOIN ์ฐ๋ฉด? | CROSS JOIN์ฒ๋ผ ์๋ํด์ ๋น๊ถ์ฅ |
| CROSS JOIN์ด๋? | ๋ชจ๋ ์กฐํฉ์ ์ถ๋ ฅํ๋ ๋ฐฉ์ |
| ์ค๋ณต ์ปฌ๋ผ์? | ์ค์ ๋ก๋ ๋ค ์์ง๋ง ํด์ด ์จ๊ธฐ๊ฑฐ๋ ์ด๋ฆ ๋ฐ๊ฟ |
| CSV ์ ์ฅ์? | ๋ชจ๋ ์ปฌ๋ผ ํฌํจ๋์ง๋ง ์ด๋ฆ์ ๋ณ๊ฒฝ๋ ์ ์์ |
๐ ์ด ๊ธ ํ๋๋ก JOIN ๋!
๋๊ธ์ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์๋ฉด ์ฆ๋งฌ๋ฃจ ๊ฐ์ฌํ๊ฒ ์๋๋ค... ์ ๋ ๊ถ๊ธํ๊ฒ ๋ง์ผ๋๊น ๊ฐ์ด ๊ณต๋ถํด์!