๋ณธ ํฌ์คํ ์ ํ๋ก๊ทธ๋๋จธ์ค ๋ฏธ๋ ๋ฐ๋ธ ์ฝ์ค๋ฅผ ๊ณต๋ถํ๋ฉฐ
ํ์ต์ ๊ธฐ๋กํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์์ฑ๋ ๊ธ์ ๋๋ค.
JOIN์ด๋ ์คํ ์คํค๋ง ๋ชจ๋ธ์ ์ฌ์ฉํ RDBMS์์
๊ฐ ํ
์ด๋ธ์ ๋ณํฉํด์ ์์ ํ ์ ๋ณด๋ฅผ ์ป๊ธฐ์ํด ์ฌ์ฉํ๋ ์ฐ์ฐ์ด๋ค.
์คํ ์คํค๋ง ๋ชจ๋ธ
์ ์ ์ฅ๊ณต๊ฐ์ ๋ญ๋น๊ฐ ๋ํ๊ณ
ํน์ ์ํฐํฐ์ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํ
์ด๋ธ์ ์์กด์ฑ
์์ด ์ฝ๊ฒ ์
๋ฐ์ดํธํ ์ ์๋ค.
์์กด์ฑ์ด๋ ๋ฌด์์ธ๊ฐ?
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์์ ์์กด์ฑ
์ด ์๋ค๋ ๊ฒ์ ํด๋์ค ๊ฐ ์์กด ๊ด๊ณ๊ฐ ์๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ํ ํด๋์ค๊ฐ ๋ฐ๋๋ฉด ๋ค๋ฅธ ํด๋์ค๋ ์ํฅ์ ๋ฐ๋ ๊ฒ์ด๋ค.
์คํ ์คํค๋ง ๋ชจ๋ธ
์์๋ ๊ทธ๋ฐ ๊ฐ์ฒด(ํ
์ด๋ธ)
๊ฐ ์ํฅ ์์ด ํน์ ํ
์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์คํ ์คํค๋ง
๋ฅผ ์ด์ฉํ DB์ผ ๊ฒฝ์ฐ
์ฌ๋ฌ ํ
์ด๋ธ์ ์ ๋ณด๊ฐ ๋ถ์ฐ๋์ด ์์ ํ๋ฅ ์ด ๋์ผ๋ฏ๋ก
์์ ํ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด์๋ JOIN ์ฐ์ฐ
์ด ํ์ํ๋ค.
JOIN์ด๋?
JOIN์ ์์ชฝ์ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ๊ฐ์ง ์๋ก์ด ๊ฐ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด์ SELECT
ํด์ฃผ๋ ๊ฒ์ด๋ค.
JOIN์ ๋ฐฉ์์ ๋ฐ๋ผ
์ด๋ค ๋ ์ฝ๋๊ฐ ์ ํ๋๋๊ฐ?
์ด๋ค ํ๋๊ฐ ์ฑ์์ง๋๊ฐ?
๋ ๊ฐ์ง๊ฐ ๊ฒฐ์ ๋๋ค.
์ค๋ณต ๋ ์ฝ๋
๊ฐ ์์ด์ผ ํ๋ค.
JOIN ๋์ ํ
์ด๋ธ์ Primary Key
๊ฐ ์ ๋๋ก ์ ์๋์ด ์์ด์ผ ํ๋ค.
์ด๋ ํ
์ด๋ธ์ FROM์
์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ฒฐ์ ํด์ผ ํ๋ค.
JOIN ํ
์ด๋ธ ๊ฐ ๊ด๊ณ
๋ฅผ ๋ช
ํํ๊ฒ ์ ์ํด์ผํ๋ค.
์ฃผ๋ฌธ ํ
์ด๋ธ
๊ณผ ์ฃผ๋ฌธ ๋ฌผํ ํ
์ด๋ธ๋ค
)JOIN ๊ธฐ๋ณธ ๋ฌธ๋ฒ
SELECT A.*, B.*
FROM table1 A
[INNER | LEFT | RIGHT | CROSS ] JOIN table2 B ON A.number = B.id_number
WHERE table1์ ์กฐ๊ฑด;
JOIN ์์ ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ํดํธ๋ก INNER JOIN
์ ์ฌ์ฉํ๋ค.
JOIN์์ WHERE ์กฐ๊ฑด๋ฌธ์ ๋ณดํต FROM์ ํ
์ด๋ธ
์ ์ ํ์กฐ๊ฑด์ด๋ค.
SELECT A.*, B.*
FROM table1 A
[INNER | LEFT | RIGHT | CROSS ] JOIN table2 B ON A.number = B.id_number
WHERE A.timestamp >= '2019-01-01';
timestamp
๊ฐ 2019-01-01 ์ด์์ธ ๋ ์ฝ๋๋ง JOIN๋์์ด ๋๋ค.๋ค์ ์ฌ์ง์ ์ฐธ๊ณ ํ๋ฉฐ JOIN์ ์ข ๋ฅ๋ฅผ ํ์ตํด๋ณด์.
[์ด๋ฏธ์ง ์ถ์ฒ] https://theartofpostgresql.com/blog/2019-09-sql-joins/
vital ํ
์ด๋ธ
vitalID
alert ํ
์ด๋ธ
alertID
์์ชฝ์์ ๋งค์นญ๋๋ ๋ ์ฝ๋๋ง ๋ฆฌํดํ๋ค.
(๋งค์นญ๋๋ค -> ON ๋ค์ ์ ์๋ ๋ณํฉ์กฐ๊ฑด
์ด ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์๋ฏธํ๋ค.)
๋งค์นญ์ด ์ ๋๋ ๋ ์ฝ๋๋ JOIN ๋์์ด ์๋๊ธฐ์ ์ถ๋ ฅํ์ง ์๋๋ค.
๋ฐ๋ผ์ INNER JOIN
์ ํ๋๊ฐ ๋ชจ๋ ์ฑ์์ง ์ํ๋ก ๋ฆฌํดํ๋ค.
(๋๋ถ๋ถ์ JOIN์ INNER JOIN
์ด๋ค.)
SELECT * FROM vital v
JOIN alert a ON v.vitalID = a.vitalID;
์ผ์ชฝ ํ
์ด๋ธ์ ์๋ ๋ ์ฝ๋๋ฅผ ์ ๋ถ ๋ฆฌํดํ๋ค.
์ค๋ฅธ์ชฝ ํ
์ด๋ธ์์ ๋์ด์ค๋ ๋ ์ฝ๋๋ ๋งค์นญ๋๋ ๊ฒ๋ง ํ๋๊ฐ ์ฑ์์ ธ์ ๋ฆฌํดํ๋ค.
๋งค์นญ์ด ์ ๋๋ ํ๋๋ NULL๋ก ๋์จ๋ค.
FROM์ ์ด LEFT JOIN
์์์ ์ผ์ชฝ ํ
์ด๋ธ์ด๋ค.
SELECT * FROM vital v
LEFT JOIN alert a ON v.vitalID = a.vitalID;
์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ์๋ ๋ ์ฝ๋๋ฅผ ์ ๋ถ ๋ฆฌํดํ๋ค.
์ผ์ชฝ ํ
์ด๋ธ์์ ๋์ด์ค๋ ๋ ์ฝ๋๋ ๋งค์นญ๋๋ ๊ฒ๋ง ํ๋๊ฐ ์ฑ์์ ธ์ ๋ฆฌํดํ๋ค.
๋งค์นญ์ด ์ ๋๋ ํ๋๋ NULL๋ก ๋์จ๋ค.
RIGHT JOIN
์ ์์๋ง ๋ฐ๊พธ๋ฉด LEFT JOIN
์ผ๋ก ์ ์ฉํ ์ ์๋ค.
SELECT * FROM vital v
RIGHT JOIN alert a ON v.vitalID = a.vitalID;
(+) LEFT JOIN๊ณผ RIGHT JOIN
SELECT * FROM alert a
RIGHT JOIN vital v ON v.vitalID = a.vitalID;
FROM์
์ ์ค๋ ํ
์ด๋ธ์ ์์๋ง ๋ฐ๊พธ๋ฉด LEFT JOIN
์ ์์ ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค.์์ชฝ ํ
์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ฆฌํดํ๋ค.
์์ชฝ์ด ๋ชจ๋ ๋งค์นญ๋๋ ๊ฒฝ์ฐ์๋ง ๋ชจ๋ ํ๋๋ค์ด ์ฑ์์ง ๋ ์ฝ๋๊ฐ ๋ฆฌํด๋๊ธฐ ๋๋ฌธ์
๋งค์นญ์ด ์ ๋์ด NULL๊ฐ์ผ๋ก ๋ํ๋๋ ๋ ์ฝ๋๊ฐ ์์ชฝ ๋ชจ๋์์ ๋ณด์ผ ์ ์๋ค.
SELECT * FROM vital v
LEFT JOIN alert a ON v.vitalID = a.vitalID
UNION
SELECT * FROM vital v
RIGHT JOIN alert a ON v.vitalID = a.vitalID;
MySQL์์๋ FULL JOIN์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์
LEFT JOIN
๊ณผ RIGHT JOIN
์ UNION
ํ๋ ํํ๋ก FULL JOIN์ ํ๋ด๋ธ๋ค.
๋ ๊ฐ์ SELECT ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ LEFT JOIN
๊ณผ RIGHT JOIN
์์ ๋ฐ์ํ ๋์ผํ ๋ ์ฝ๋๊ฐ ์์ ์ ์๋ค.
UNION
์ฐ์ฐ์ ๊ทธ๋ ๊ฒ ์์ชฝ์์ return๋๋ ์ค๋ณต ๋ ์ฝ๋๋ฅผ ์์ค ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.
SELECT * FROM vital v
LEFT JOIN alert a ON v.vitalID = a.vitalID
UNION ALL
SELECT * FROM vital v
RIGHT JOIN alert a ON v.vitalID = a.vitalID;
UNION ALL
์ ์ค๋ณต ๋ ์ฝ๋๋ฅผ ์์ ์ง ์๋๋ค.๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ๋ํด์ ๋ณํฉํ๋ค.
๊ทธ๋์ JOIN ์กฐ๊ฑด์ด ์๋ค.
ํ
์ด๋ธ ๋ ๊ฐ๊ฐ ๊ฐ๊ฐ A
๊ฐ, B
๊ฐ์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ ๋,
๋ ํ
์ด๋ธ์ CROSS JOIN
ํ๋ฉด ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅ๋๋ ๋ ์ฝ๋์ ์๋ A * B
๊ฐ์ด๋ค.
SELECT * FROM vital v
CROSS JOIN alert a; -- JOIN ๋ณํฉ ์กฐ๊ฑด์ด ์๋ค.
vitalID = 1
)์ ์ค๋ฅธ์ชฝ ๋ ์ฝ๋ 3๊ฐ๋ฅผ ์ ๋ถ ๋งค์นญํ์ฌ ๋ฆฌํดํ๋ค.vitalID = 2
)์ ์ค๋ฅธ์ชฝ ๋ ์ฝ๋ 3๊ฐ๋ฅผ ์ ๋ถ ๋งค์นญํ์ฌ ๋ฆฌํดํ๋ค.3 * 4
์ด๋ค.๊ฐ์ ํ
์ด๋ธ๋ผ๋ฆฌ JOINํ๋ค.
๋์ผํ ํ
์ด๋ธ์ alias (as)๋ฅผ ๋ค๋ฅด๊ฒ ํด์ ์๊ธฐ ์์ ๊ณผ JOINํ๋ค.
JOIN ์กฐ๊ฑด์ ์ด๋ป๊ฒ ์ฃผ๋์ง์ ๋ฐ๋ผ ์ ์ฉํ๊ฒ ์ฐ์ผ ์ ์๋ค.
SELECT * FROM vital v1
JOIN vital v2 ON v1.vitalID = v2.vitalID;