์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Absolute
- AGI
- ai
- AI agents
- AI engineer
- AI researcher
- ajax
- algorithm
- Algorithms
- aliases
- Array ๊ฐ์ฒด
- ASI
- bayes' theorem
- Bit
- Blur
- BOM
- bootstrap
- canva
- challenges
- ChatGPT
- Today
- In Total
A Joyful AI Research Journey๐ณ๐
[55] 230317 SQL Ch. 7 ๋ณต์์ ํ ์ด๋ธ ๋ค๋ฃจ๊ธฐ: 31๊ฐ ์งํฉ ์ฐ์ฐ, 32๊ฐ ํ ์ด๋ธ ๊ฒฐํฉ, 33๊ฐ ๊ด๊ณํ ๋ชจ๋ธ [K-๋์งํธ ํธ๋ ์ด๋ 54์ผ] ๋ณธ๋ฌธ
[55] 230317 SQL Ch. 7 ๋ณต์์ ํ ์ด๋ธ ๋ค๋ฃจ๊ธฐ: 31๊ฐ ์งํฉ ์ฐ์ฐ, 32๊ฐ ํ ์ด๋ธ ๊ฒฐํฉ, 33๊ฐ ๊ด๊ณํ ๋ชจ๋ธ [K-๋์งํธ ํธ๋ ์ด๋ 54์ผ]
yjyuwisely 2023. 3. 16. 16:36230317 Fri 55th class
Ch 7. ๋ณต์์ ํ
์ด๋ธ ๋ค๋ฃจ๊ธฐ
์ง๋: p. 274 ~ (๊ต์ฌ: SQL ์ฒซ๊ฑธ์, ์ ์: ์์ฌ์ด ์์ธ ์)
MySQL Workbench Manual: https://dev.mysql.com/doc/workbench/en/
MySQL ํํ ๋ฆฌ์ผ: https://www.tutorialspoint.com/mysql/
SQLD ์์ฝ pdf: https://yurimac.tistory.com/40
์ฑ
์์ฝ (9p) pdf: https://brunch.co.kr/@ydy702/10
๊ณต๋ถํ ๊ฒ ์ค ๊ธฐ์ตํ ๊ฒ์ ์ ๋ฆฌํ๋ค.
์์ฝ
FROM JOIN ์ ํํ
FROM JOIN ์ ํํ |
์ค๋ช |
๊ต์ฐจ ๊ฒฐํฉ CROSS JOIN |
์นดํฐ์์ ๊ณฑ ์์ชฝ ์งํฉ์ M*N๊ฑด์ ๋ฐ์ดํฐ ์กฐํฉ์ด ๋ฐ์ํ๋ค. |
๋ด๋ถ ๊ฒฐํฉ INNER JOIN |
JOIN ์กฐ๊ฑด์์ ๋์ผํ ๊ฐ์ด ์๋ ํ๋ง ๋ฐํ, USING์ด๋ ON ์ ์ ํ์์ ์ผ๋ก ์ฌ์ฉ -- ๋ด๋ถ๊ฒฐํฉ(inner joinํค์๋๋ฅผ ์ด์ฉ, ์ด๋ inner๋ ์๋ตํ ์ ์์.) select ์ํ๋ช , ์ฌ๊ณ ์ -- from ์ํ inner join ์ฌ๊ณ ์ from ์ํ join ์ฌ๊ณ ์ on ์ํ.์ํ์ฝ๋ = ์ฌ๊ณ ์.์ํ์ฝ๋; |
์ธ๋ถ ๊ฒฐํฉ OUTER JOIN |
JOIN ์กฐ๊ฑด์์ ๋์ผํ ๊ฐ์ด ์๋ ํ๋ ๋ฐํ ๊ฐ๋ฅํ๋ค, USING ์ด๋ ON ์กฐ๊ฑด์ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํจ. SQL ์์์ (+) ์ ๋ถ์ ์ชฝ์ผ๋ก JOINํ๋ค. |
LEFT OUTER JOIN: A์๋ง ์๊ณ B๋ NULL ์ธ ๊ฐ ํฌํจ ๋จผ์ ํ๊ธฐ๋ ์ข์ธก ํ ์ด๋ธ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋์ค ํ๊ธฐ๋ ์ฐ์ธก ํ ์ด๋ธ์์ JOIN ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์จ๋ค. ์ฐ์ธก ๊ฐ์์ ๊ฐ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ NULL ๊ฐ์ผ๋ก ์ฑ์ด๋ค |
|
RIGHT OUTER JOIN: A์ ์๊ณ B์๋ง ์๋ ๊ฐ ํฌํจ LEFT OUTER JOIN์ ๋ฐ๋ |
|
FULL OUTER JOIN: ์ข์ฐ์ธก ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด JOINํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ค. ์ค๋ณต ๋ฐ์ดํฐ๋ ์ญ์ ํ๋ค. | |
NATURAL JOIN |
๋ ํ
์ด๋ธ ๊ฐ์ ๋์ผํ ์ด๋ฆ์ ๊ฐ๋ ๋ชจ๋ ์นผ๋ผ๋ค์ ๋ํด EQUI JOIN(๋ฑ๊ฐ ์กฐ์ธ)์ํ, NATURAL JOIN์ด ๋ช ์๋๋ฉด ์ถ๊ฐ๋ก USING, ON, WHERE ์ ์์JOIN ์กฐ๊ฑด์ ์ ์ํ ์ ์๋ค, SQL Sever๋ X |
USING ์กฐ๊ฑด์ |
๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์นผ๋ผ๋ค ์ค์์ ์ํ๋ ์นผ๋ผ์ ๋ํด์๋ง ์ ํ์ ์ผ๋ก EQUI JOIN(๋ฑ๊ฐ ์กฐ์ธ)์ ํ ์ ์๋ค. JOIN ์นผ๋ผ์ ๋ํด์ ALIAS๋ ํ ์ด๋ธ ์ด๋ฆ๊ณผ ๊ฐ์ ์ ๋์ฌ๋ฅผ ๋ถ์ผ ์ ์๋ค , SQL Server ์ง์x |
ON ์กฐ๊ฑด์ |
ON ์กฐ๊ฑด์ ๊ณผ WHERE ์กฐ๊ฑด์ ์ ๋ถ๋ฆฌํ์ฌ ์ดํด๊ฐ ์ฌ์ฐ๋ฉฐ ์นผ๋ผ๋ช ์ด ๋ค๋ฅด๋๋ผ๋ JOIN ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์๋ ์ฅ์ ์ด ์๋ค. ALIAS๋ ํ ์ด๋ธ๋ช ๋ฐ๋์ ์ฌ์ฉ |
์ฐธ๊ณ : https://keep-cool.tistory.com/41
Ch. 7 ๋ณต์์ ํ ์ด๋ธ ๋ค๋ฃจ๊ธฐ
์ฑ ์ ๋ชฉ์ฐจ
__31๊ฐ__์งํฉ ์ฐ์ฐ
1. SQL๊ณผ ์งํฉ
2. UNION์ผ๋ก ํฉ์งํฉ ๊ตฌํ๊ธฐ
3. ๊ต์งํฉ๊ณผ ์ฐจ์งํฉ
__32๊ฐ__ํ ์ด๋ธ ๊ฒฐํฉ
1. ๊ณฑ์งํฉ๊ณผ ๊ต์ฐจ๊ฒฐํฉ
2. ๋ด๋ถ๊ฒฐํฉ
3. INNER JOIN์ผ๋ก ๋ด๋ถ ๊ฒฐํฉํ๊ธฐ
4. ๋ด๋ถ๊ฒฐํฉ์ ํ์ฉํ ๋ฐ์ดํฐ ๊ด๋ฆฌ
5. ์ธ๋ถ๊ฒฐํฉ
__33๊ฐ__๊ด๊ณํ ๋ชจ๋ธ
1. ๊ด๊ณํ ๋ชจ๋ธ
2. ๊ด๊ณํ ๋ชจ๋ธ๊ณผ SQL
31๊ฐ ์งํฉ ์ฐ์ฐ p. 274
'๋ณต์์ ํ
์ด๋ธ'์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณธ๋ค.
๊ด๊ณํ ๋ชจ๋ธ์ ์ฑํํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ๊ณ ํ๋ค.
31.1 SQL๊ณผ ์งํฉ p. 275
๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ํ
์ด๋ธ์ ํ์ด ์์์ ํด๋นํ๋ค.
ํ๋์ ํ์ด ๊ณง ํ๋์ ์์๊ฐ ๋๋ค.
SELECT ๋ช
๋ น์ผ๋ก ๋ฐํ๋ ๊ฒฐ๊ณผ ์ ์ฒด๋ฅผ ํ๋์ ์งํฉ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
31.2 UNION์ผ๋ก ํฉ์งํฉ ๊ตฌํ๊ธฐ
- UNION
ํฉ์งํฉ์ ๊ณ์ฐํ ๊ฒฝ์ฐ์๋ UNION ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
์์ 7-1) UNION์ผ๋ก ํฉ์งํฉ ๊ตฌํ๊ธฐ
SELECT * FROM sample71_a;
SELECT * FROM sample71_b;
์์ 7-2) ๋ ๊ฐ์ SELECT ๋ช
๋ น์ UNION์ผ๋ก ํฉ์งํฉ ๊ตฌํ๊ธฐ
์ค๋ณต๋ ๋ฐ์ดํฐ๋ ํ๋๋ก ์ทจ๊ธํ๋ค.
SELECT * FROM sample71_a
UNION -- ๋ ๊ฐ์ ๋ช
๋ น์ ํ๋์ ๋ช
๋ น์ผ๋ก ํฉ์น๋ค.
SELECT * FROM sample71_b;
Point: UNION์ผ๋ก ๋ ๊ฐ์ SELECT ๋ช ๋ น์ ํ๋๋ก ์ฐ๊ณํด ์ง์(Query) ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์์ ํ ์ด ๊ตฌ์ฑ์ด ๋ค๋ฅธ ํ
์ด๋ธ์ UNION์ผ๋ก ๋ฌถ์ ์๋ ์๋ค.
(๊ฐ์ ์นธ์ผ๋ก ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค. ์ด์ ๊ฐ์๊ฐ ๋ง์์ผ ํ๋ค.)
์ด์ ๋ฐ๋ก ์ง์ ํ์ฌ ๊ฐ SELECT ๋ช
๋ น์์ ์งํฉ์ ์์๊ฐ ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ง์ถฐ์ฃผ๋ฉด UNION์ผ๋ก ์คํํ ์ ์๋ ์ฟผ๋ฆฌ๊ฐ ๋๋ค.
SELECT a FROM sample71_a
UNION
SELECT b FROM sample71_b
UNION
SELECT age FROM sample31;
UNION์ผ๋ก ๋ฌถ์ ๋ ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ ๊ฐ์ง๋ง ๊ฒฐ๊ด๊ฐ์ ๋์ด ์์๋ ๋ฌ๋ผ์ง ์๋ ์๋ค.
SELECT * FROM sample71_a UNION SELECT * FROM sample71_b;
SELECT * FROM sample71_b UNION SELECT * FROM sample71_a;
1) UNION์ ์ฌ์ฉํ ๋์ ORDER BY
ํฉ์งํฉ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๋ฏ๋ก ๊ฐ์ฅ ๋ง์ง๋ง์ SELECT ๋ช
๋ น์ ORDER BY๋ฅผ ์ง์ ํด์ผ ํ๋ค.
-- ๋ง์ง๋ง์ SELECT ๋ช
๋ น์ ORDER BY๋ฅผ ์ง์ ํ๋ค.
SELECT a AS c FROM sample71_a
UNION
SELECT b AS c FROM sample71_b ORDER BY c;
๋ ๊ฐ์ SELECT ๋ช ๋ น์์ ์ด ์ด๋ฆ์ด ์๋ก ์ผ์นํด์ผ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์๋ก ๋์ผํ๊ฒ ๋ณ๋ช ์ ๋ถ์ฌ์ ์ ๋ ฌํ ์ ์๋ค.
Point: UNION์ผ๋ก SELECT ๋ช
๋ น์ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ, ๊ฐ์ฅ ๋ง์ง๋ง SELECT ๋ช
๋ น์ ๋ํด์๋ง ORDER BY ๊ตฌ๋ฅผ ์ง์ ํ ์ ์๋ค.
ORDER BY ๊ตฌ์ ์ง์ ํ๋ ์ด์ ๋ณ๋ช
์ ๋ถ์ฌ ์ด๋ฆ์ ์ผ์น์ํจ๋ค.
2) UNION ALL
์์ 7-3) ๋ ๊ฐ์ SELECT ๋ช
๋ น์ UNION ALL์ ์ ์ฉํด ํฉ์งํฉ ๊ตฌํ๊ธฐ
์ค๋ณต๋ ๋ฐ์ดํฐ๋ ํฌํจํด์ ์ถ๋ ฅํ๋ค.
SELECT * FROM sample71_a
UNION ALL
SELECT * FROM sample71_b;
31.3 ๊ต์งํฉ(INTERSECT)๊ณผ ์ฐจ์งํฉ(EXCEPT) p. 282
MySQL์์๋ ์ง์ํ์ง ์๋๋ค.
๊ต์งํฉ(๋ ๊ฐ์ ์งํฉ์ด ๊ฒน์น๋ ๋ถ๋ถ): INTERSECT
์ฐจ์งํฉ(์งํฉ์์ ๋ค๋ฅธ ์ชฝ์ ์งํฉ์ ์ ๊ฑฐํ๊ณ ๋จ์ ๋ถ๋ถ): EXCEPT (Oracle: MiNUS)
๋ฅผ ์ฌ์ฉํ๋ค.
๊ณต์งํฉ(์์๊ฐ ํ๋๋ ์๋ ์งํฉ): ์์ ํ ๊ฐ์ ์งํฉ๋ผ๋ฆฌ ์ฐจ์งํฉ์ ๊ณ์ฐํ๋ฉด ์๋ฌด๋ฐ ์์๋ ์กด์ฌํ์ง ์๋๋ค.
32๊ฐ ํ ์ด๋ธ ๊ฒฐํฉ (join) p. 284
RDBMS(Relational database management system)์์ ๋๋จํ ์ค์ํ ๊ฐ๋ ์ด๋ค.
32.1 ๊ณฑ์งํฉ๊ณผ ๊ต์ฐจ๊ฒฐํฉ
๊ณฑ์งํฉ์ ๋ ๊ฐ์ ์งํฉ์ ๊ณฑํ๋ ์ฐ์ฐ ๋ฐฉ๋ฒ์ผ๋ก '์ ์งํฉ' ๋๋ '์นดํฐ์ ๊ณฑ(Cartesian product)'์ด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
1) ๊ต์ฐจ๊ฒฐํฉ(Cross Join)
๊ต์ฐจ ๊ฒฐํฉ
SELECT * FROM ํ
์ด๋ธ๋ช
1, ํ
์ด๋ธ๋ช
2
์์ 7-4) sample72_x์ sample72_y
SELECT * FROM sample72_x;
SELECT * FROM sample72_y;
์์ 7-5) FROM ๊ตฌ๋ก ๊ณฑ์งํฉ ๊ตฌํ๊ธฐ
-- FROM๊ตฌ์ ํ
์ด๋ธ ๋ ๊ฐ๋ฅผ ์ง์ ํด ๊ณฑ์งํฉ ๊ตฌํ๊ธฐ
SELECT * FROM sample72_x, sample72_y;
Point: FROM ๊ตฌ์ ๋ณต์์ ํ ์ด๋ธ์ ์ง์ ํ๋ฉด ๊ต์ฐจ๊ฒฐํฉ์ ํ๋ค.
2) UNION ์ฐ๊ฒฐ๊ณผ ๊ฒฐํฉ ์ฐ๊ฒฐ์ ์ฐจ์ด
Point: ๊ฒฐํฉ์ ์ด(๊ฐ๋ก =>)๋ฐฉํฅ์ผ๋ก ํ๋๋๋ค.
32.2 ๋ด๋ถ๊ฒฐํฉ
INNER JOIN์ ON ์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ON ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง์ ๊ฐ์ ธ์ต๋๋ค.
๋ฌธ๋ฒ
1. ์ฒซ๋ฒ์งธํ ์ด๋ธ์ด๋ฆ
INNER JOIN ๋๋ฒ์งธํ ์ด๋ธ์ด๋ฆ
ON ์กฐ๊ฑด
2. ์ฒซ๋ฒ์งธํ ์ด๋ธ์ด๋ฆ
JOIN ๋๋ฒ์งธํ ์ด๋ธ์ด๋ฆ
ON ์กฐ๊ฑด
ON ์ ์์๋ WHERE ์ ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ค SQL๊ณผ๋ ๋ฌ๋ฆฌ MySQL์์๋ JOIN, INNER JOIN, CROSS JOIN์ด ๋ชจ๋ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์์ )
SELECT *
FROM Reservation
INNER JOIN Customer
ON Reservation.Name = Customer.Name;
SELECT *
FROM Reservation
JOIN Customer
ON Reservation.Name = Customer.Name;
INNER JOIN์ ๊ฒฝ์ฐ์๋ ์์ ์ดํด๋ณธ ํ์ค SQL ๋ฐฉ์๊ณผ๋ ๋ณ๋๋ก MySQL์์๋ง ์ฌ์ฉํ ์ ์๋ ๋ฐฉ์์ด ๋ฐ๋ก ์กด์ฌํฉ๋๋ค. ๋ค์ ์์ ๋ ์์ ์ดํด๋ณธ INNER JOIN ์์ ์ ๊ฐ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๊ฒฐ๊ณผ)
์ ์์ ์ ์คํ ๊ฒฐ๊ณผ์ฒ๋ผ JOIN์ ๊ฒฐ๊ณผ๋ ํ๋์ ํ
์ด๋ธ ํํ๋ก ๋ฐํ๋ฉ๋๋ค.
MySQL ์์
์์ ์์ ์ฌ์ฉ๋๋ Reservation ํ
์ด๋ธ๊ณผ Customer ํ
์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
INNER JOIN์ ๊ฒฐ๊ณผ๋ฅผ ๋ฒค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ )
SELECT *
FROM Reservation, Customer
WHERE Reservation.Name = Customer.Name;
์์ ์์ ์ฒ๋ผ ํ
์ด๋ธ์ ์ด๋ฆ์ด ๊ธธ๊ฑฐ๋ ๋ณต์กํ ๊ฒฝ์ฐ์๋ ๋ณ์นญ(alias)์ ์ฌ์ฉํ์ฌ SQL ๊ตฌ๋ฌธ์ ๊ฐ๋ตํํ ์ ์์ต๋๋ค. ๋ค์ ์์ ๋ ์์ ์์ ๋ฅผ ๋ณ์นญ(alias)์ ์ฌ์ฉํ์ฌ ๊ฐ๋ตํํ ์์ ์
๋๋ค.
์์ )
SELECT *
FROM Reservation AS r, Customer AS c
WHERE r.Name = c.Name;
์ฐธ๊ณ : http://www.tcpschool.com/mysql/mysql_multipleTable_join
์์ 7-6) ์ํ ํ ์ด๋ธ ์์ฑํ๊ธฐ
CREATE TABLE ์ํ(
์ํ์ฝ๋ CHAR(4) NOT NULL,
์ํ๋ช
VARCHAR(30),
๋ฉ์ด์ปค๋ช
VARCHAR(30),
๊ฐ๊ฒฉ INTEGER,
์ํ๋ถ๋ฅ VARCHAR(30),
PRIMARY KEY (์ํ์ฝ๋)
);
์์ 7-7) ์ฌ๊ณ ์ ํ ์ด๋ธ ์์ฑํ๊ธฐ
CREATE TABLE ์ฌ๊ณ ์(
์ํ์ฝ๋ CHAR(4),
์
๊ณ ๋ ์ง DATE,
์ฌ๊ณ ์ INTERGER
);
์์ 7-8) ์ํ ํ ์ด๋ธ๊ณผ ์ฌ๊ณ ์ ํ ์ด๋ธ์ ๊ต์ฐจ๊ฒฐํฉํ๊ธฐ
SELECT * FROM ์ํ, ์ฌ๊ณ ์;
์์ 7-9) ์ํ์ฝ๋๊ฐ ๊ฐ์ ํ์ ๊ฒ์ํ๊ธฐ
SELECT * FROM ์ํ, ์ฌ๊ณ ์
WHERE ์ํ.์ํ์ฝ๋ = ์ฌ๊ณ ์.์ํ์ฝ๋;
์์ 7-10) ๊ฒ์ํ ํ๊ณผ ๋ฐํํ ์ด ์ ํํ๊ธฐ
SELECT ์ํ.์ํ๋ช
, ์ฌ๊ณ ์.์ฌ๊ณ ์ FROM ์ํ, ์ฌ๊ณ ์
WHERE ์ํ.์ํ์ฝ๋ = ์ฌ๊ณ ์.์ํ์ฝ๋
AND ์ํ.์ํ๋ถ๋ฅ = '์๋ฃํ';
32.3 INNER JOIN์ผ๋ก ๋ด๋ถ ๊ฒฐํฉํ๊ธฐ p. 294
SELECT ์ํ.์ํ๋ช
, ์ฌ๊ณ ์.์ฌ๊ณ ์
FROM ์ํ(ํ
์ด๋ธ๋ช
1) INNER JOIN ์ฌ๊ณ ์(ํ
์ด๋ธ๋ช
2)
ON ์ํ.์ํ์ฝ๋ = ์ฌ๊ณ ์.์ํ์ฝ๋ (๊ฒฐํฉ์กฐ๊ฑด)
WHERE ์ํ.์ํ๋ถ๋ฅ = '์๋ฃํ';
๋ด๋ถ๊ฒฐํฉ
SELECT * FROM ํ
์ด๋ธ๋ช
1 INNER JOIN ํ
์ด๋ธ๋ช
2 ON ๊ฒฐํฉ์กฐ๊ฑด
Point: INNER JOIN์ผ๋ก ๋ ๊ฐ ํ ์ด๋ธ์ ๊ฐ๋ก๋ก ๊ฒฐํฉํ ์ ์๋ค.
๋ ํ ์ด๋ธ์ ์ํ ์ฝ๋๊ฐ ๊ฐ์ ์กฐ๊ฑด์ด๋ค.
32.4 ๋ด๋ถ๊ฒฐํฉ์ ํ์ฉํ ๋ฐ์ดํฐ ๊ด๋ฆฌ p. 295
์์ 7-11) ๋ฉ์ด์ปค ํ ์ด๋ธ ์์ฑํ๊ธฐ
CREATE TABLE ๋ฉ์ด์ปค(
๋ฉ์ด์ปค์ฝ๋ CHAR(4) NOT NULL,
๋ฉ์ด์ปค๋ช
VARCHAR(30),
PRIMARY KEY (๋ฉ์ด์ปค์ฝ๋)
);
์์ 7-12) ์ํ ํ ์ด๋ธ๊ณผ ๋ฉ์ด์ปค ํ ์ด๋ธ์ ๋ด๋ถ๊ฒฐํฉํ๊ธฐ
SELECT S.์ํ๋ช
, M.๋ฉ์ด์ปค๋ช
FROM ์ํ2 S INNER JOIN ๋ฉ์ด์ปค M
ON S.๋ฉ์ด์ปค์ฝ๋ = M.๋ฉ์ด์ปค์ฝ๋;
๋ฉ์ด์ปค ํ
์ด๋ธ์๋ 'M', ์ํ ํ
์ด๋ธ์๋ 'S'๋ผ๋ ์งง์ ๋ณ๋ช
์ ๋ถ์๋ค.
๋ณ๋ช
.๋ณ์๋ช
S.์ํ๋ช
(from Table ์ํ2)
M.๋ฉ์ด์ปค๋ช
(from Table ๋ฉ์ด์ปค)
1) ์ธ๋ถํค
๋ฉ์ด์ปค ํ
์ด๋ธ์ ๋ฉ์ด์ปค์ฝ๋๋ ๊ธฐ๋ณธํค์ด๋ค.
๊ทธ์ ๋นํด ์ํ ํ
์ด๋ธ์ ๋ฉ์ด์ปค์ฝ๋๋ '์ธ๋ถํค'๋ผ ๋ถ๋ฆฐ๋ค. ๋ค๋ฅธ ํ
์ด๋ธ์ ๊ธฐ๋ณธํค๋ฅผ ์ฐธ์กฐํ๋ ์ด์ด ์ธ๋ถํค๊ฐ ๋๋ค.
2) ์๊ธฐ ๊ฒฐํฉ(Self Join)
ํ
์ด๋ธ์ ๋ณ๋ช
์ ๋ถ์ผ ์ ์๋ ๊ธฐ๋ฅ์ ์ด์ฉํด ๊ฐ์ ํ
์ด๋ธ๋ผ๋ฆฌ ๊ฒฐํฉํ๋ ๊ฒ์ด๋ค.
์์ 7-13) ์ํ ํ ์ด๋ธ์ ์๊ธฐ๊ฒฐํฉํ๊ธฐ
SELECT S1.์ํ๋ช
, S2.์ํ๋ช
FROM ์ํ S1 INNER JOIN ์ํ S2
ON S1.์ํ์ฝ๋ = S2.์ํ์ฝ๋;
์๊ธฐ ๊ฒฐํฉ์์๋ ๊ฒฐํฉ์ ์ข์ฐ๊ฐ ๊ฐ์ ํ
์ด๋ธ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๋ณ๋ช
์ ๋ถ์ฌ์ผ ํ๋ค.
์๊ธฐ ๊ฒฐํฉ์ ์๊ธฐ ์์ ์ ๊ธฐ๋ณธํค๋ฅผ ์ฐธ์กฐํ๋ ์ด์ ์๊ธฐ ์์ ์ด ๊ฐ์ง๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋์ด ์์ ๊ฒฝ์ฐ์ ์์ฃผ ์ฌ์ฉ๋๋ค.
select ์ํ๋ช
, ๋ฉ์ด์ปค๋ช
, S.๋ฉ์ด์ปค์ฝ๋
from ์ํ2 S, ๋ฉ์ด์ปค M
where S.๋ฉ์ด์ปค์ฝ๋ = M.๋ฉ์ด์ปค์ฝ๋
and S.๋ฉ์ด์ปค์ฝ๋ = 'M001';
select ์ํ๋ช
, ๋ฉ์ด์ปค๋ช
, S.๋ฉ์ด์ปค์ฝ๋
from ์ํ2 S inner join ๋ฉ์ด์ปค M
on S.๋ฉ์ด์ปค์ฝ๋ = M.๋ฉ์ด์ปค์ฝ๋
where S.๋ฉ์ด์ปค์ฝ๋ = 'M001';
32.5 ์ธ๋ถ๊ฒฐํฉ
LEFT JOIN
LEFT JOIN์ ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก, ๋ ๋ฒ์งธ ํ ์ด๋ธ์ ์กฐํฉํ๋ JOIN์ ๋๋ค.
์ด๋ ON ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์ ํ๋ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์ต๋๋ค.
ํ์ง๋ง ํด๋น ๋ ์ฝ๋์ ๋ ๋ฒ์งธ ํ ์ด๋ธ์ ํ๋ ๊ฐ์ ๋ชจ๋ NULL๋ก ํ์๋ฉ๋๋ค.
๋ฌธ๋ฒ
์ฒซ๋ฒ์งธํ ์ด๋ธ์ด๋ฆ
LEFT JOIN ๋๋ฒ์งธํ ์ด๋ธ์ด๋ฆ
ON ์กฐ๊ฑด
ON ์ ์์๋ WHERE ์ ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์ ์์ ๋ Reservation ํ
์ด๋ธ์ Name ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก Customer ํ
์ด๋ธ์ Name ํ๋์ ์ผ์นํ๋ ๋ ์ฝ๋๋ง์ LEFT JOIN์ผ๋ก ๊ฐ์ ธ์จ ํ, ๊ทธ ์ค์์ ReserveDate ํ๋์ ๊ฐ์ด 2016๋
02์ 01์ผ ์ดํ์ธ ๋ ์ฝ๋๋ง์ ์ ํํ๋ ์์ ์
๋๋ค.
์์ )
SELECT *
FROM Reservation
LEFT JOIN Customer
ON Reservation.Name = Customer.Name
WHERE ReserveDate > '2016-02-01';
๊ฒฐ๊ณผ)
์์ ์์ ์์ ๋ ๊ฐ์ Name ๊ฐ์ด ์ผ์นํ๋ฉด, INNER JOIN๊ณผ ๊ฐ์ด ๋ ํ ์ด๋ธ์ ๋ชจ๋ ํ๋๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ต๋๋ค. ํ์ง๋ง ๋ ๊ฐ์ Name ๊ฐ์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ์๋ Customer ํ ์ด๋ธ์ ๋ชจ๋ ํ๋๋ฅผ NULL๋ก ํ์๋ฉ๋๋ค.
LEFT JOIN์ ๊ฒฐ๊ณผ๋ฅผ ๋ฒค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
RIGHT JOIN
RIGHT JOIN์ LEFT ์กฐ์ธ๊ณผ๋ ๋ฐ๋๋ก ๋ ๋ฒ์งธ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก, ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์ ์กฐํฉํ๋ JOIN์ ๋๋ค.
์ด๋ ON ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ๊ฒฝ์ฐ์๋ ๋ ๋ฒ์งธ ํ ์ด๋ธ์ ํ๋ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์ต๋๋ค.
ํ์ง๋ง ํด๋น ๋ ์ฝ๋์ ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์ ํ๋ ๊ฐ์ ๋ชจ๋ NULL๋ก ํ์๋ฉ๋๋ค.
๋ฌธ๋ฒ
์ฒซ๋ฒ์งธํ ์ด๋ธ์ด๋ฆ
RIGHT JOIN ๋๋ฒ์งธํ ์ด๋ธ์ด๋ฆ
ON ์กฐ๊ฑด
ON ์ ์์๋ WHERE ์ ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์ ์์ ๋ Customer ํ
์ด๋ธ์ Name ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก Reservation ํ
์ด๋ธ์ Name ํ๋์ ์ผ์นํ๋ ๋ ์ฝ๋๋ง์ RIGHT JOIN์ผ๋ก ๊ฐ์ ธ์ค๋ ์์ ์
๋๋ค.
์์ )
SELECT *
FROM Reservation
RIGHT JOIN Customer
ON Reservation.Name = Customer.Name;
๊ฒฐ๊ณผ)
์์ ์์ ์์ ๋ ๊ฐ์ Name ๊ฐ์ด ์ผ์นํ๋ฉด, INNER JOIN๊ณผ ๊ฐ์ด ๋ ํ ์ด๋ธ์ ๋ชจ๋ ํ๋๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ต๋๋ค. ํ์ง๋ง ๋ ๊ฐ์ Name ๊ฐ์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ์๋ Reservation ํ ์ด๋ธ์ ๋ชจ๋ ํ๋๋ฅผ NULL๋ก ํ์๋ฉ๋๋ค.
RIGHT JOIN์ ๊ฒฐ๊ณผ๋ฅผ ๋ฒค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฐธ๊ณ : http://www.tcpschool.com/mysql/mysql_multipleTable_join
์ธ๋ถ๊ฒฐํฉ์ '์ด๋ ํ ์ชฝ์๋ง ์กด์ฌํ๋ ๋ฐ์ดํฐํ์ ์ด๋ป๊ฒ ๋ค๋ฃฐ์ง'๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒฐํฉ ๋ฐฉ๋ฒ์ด๋ค.
์์ 7-14) ๋ด๋ถ ๊ฒฐํฉ์์๋ ์ํ์ฝ๋๊ฐ 0009์ธ ์ํ์ด ์ ์ธ๋๋ค.
SELECT ์ํ3.์ํ๋ช
, ์ฌ๊ณ ์.์ฌ๊ณ ์
FROM ์ํ3 INNER JOIN ์ฌ๊ณ ์
ON ์ํ3.์ํ์ฝ๋ = ์ฌ๊ณ ์.์ํ์ฝ๋
WHERE ์ํ3.์ํ๋ถ๋ฅ = '์๋ฃํ';
์์ 7-15) ์ธ๋ถ๊ฒฐํฉ์ผ๋ก ์ํ์ฝ๋ 0009์ธ ์ํ๋ ๊ฒฐ๊ณผ์ ํฌํจํ๊ธฐ
SELECT ์ํ3.์ํ๋ช
, ์ฌ๊ณ ์.์ฌ๊ณ ์
FROM ์ํ3 LEFT JOIN ์ฌ๊ณ ์
ON ์ํ3.์ํ์ฝ๋ = ์ฌ๊ณ ์.์ํ์ฝ๋
WHERE ์ํ3.์ํ๋ถ๋ฅ = '์๋ฃํ';
Point: LEFT JOIN, RIGHT JOIN์ผ๋ก ์ธ๋ถ๊ฒฐํฉ์ ํ ์ ์๋ค.
- ๊ตฌ์๋ฐฉ๋ฒ์์์ ์ธ๋ถ๊ฒฐํฉ๊ณผ ํ์ค SQL
์์ 7-16) Oracle์์ ๊ตฌ์ ์ธ๋ถ ๊ฒฐํฉ์ผ๋ก 0009์ ์ํ์ ๊ฒฐ๊ณผ์ ํฌํจํ๊ธฐ
๊ตฌ์ ๊ฒฐํฉ๋ฐฉ๋ฒ์๋ WHERE๊ตฌ๋ก ๊ฒฐํฉ ์กฐ๊ฑด์ ์ง์ ํ๊ณ ์ธ๋ถ๊ฒฐํฉ์ผ๋ก ์งํํ๊ณ ์ถ์ ๊ฒฝ์ฐ (+) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค. (Oracle)
SELECT ์ํ3.์ํ๋ช
, ์ฌ๊ณ ์.์ฌ๊ณ ์
FROM ์ํ3, ์ฌ๊ณ ์
WHERE ์ํ3.์ํ์ฝ๋ = ์ฌ๊ณ ์.์ํ์ฝ๋ (+) -- left join
AND ์ํ3.์ํ๋ถ๋ฅ = '์๋ฃํ';
ํ์ฌ๋ ํ์คํ๋ก ์ธํด ๋ด๋ถ๊ฒฐํฉ์ INNER JOIN, ์ธ๋ถ๊ฒฐํฉ์ LEFT JOIN์ด๋ RIGHT JOIN์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ๋ค.
Point: ๊ตฌ์ ๊ฒฐํฉ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ์๋๋ค.
33๊ฐ ๊ด๊ณํ ๋ชจ๋ธ
33.1 ๊ด๊ณํ ๋ชจ๋ธ
Point: ๋ฆด๋ ์ด์ ์ ํ ์ด๋ธ์ ๋งํ๋ค.
33.2 ๊ด๊ณํ ๋ชจ๋ธ๊ณผ SQL
1. ํฉ์งํฉ (Union)
2. ์ฐจ์งํฉ (Difference)
3. ๊ต์งํฉ (Intersection)
4. ๊ณฑ์งํฉ (Cartesian product)
5. ์ ํ (Selection)
6. ํฌ์ (Projection)
7. ๊ฒฐํฉ (Join)