[๊ฐœ๋ฐœ์ผ์ง€]SQL(Left Join, Inner Join, Union)๐ŸŒŸ

๊น€ํ•˜์˜ยท2023๋…„ 4์›” 20์ผ

01.์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” Join

โœ…Join๋ž€?
๋‘ ํ…Œ์ด๋ธ”์˜ ๊ณตํ†ต๋œ ์ •๋ณด(key๊ฐ’)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์„œ ํ•œ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ๋ณด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

โ–ถex) user_id ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ users ํ…Œ์ด๋ธ”๊ณผ orders ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์„œ ํ•œ ๋ˆˆ์— ๋ณด๊ณ  ์‹ถ์–ด์š”!

โœ…์œ„ ์˜ˆ์‹œ์™€ ๊ฐ™์ด, ๋‘ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ํ•จ๊ป˜ ๋ณด๊ณ ์‹ถ์„ ๋•Œ ๋Œ€๋น„ํ•ด์„œ ๋ฌด์–ธ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ๋•Œ, user_id ์ฒ˜๋Ÿผ ๋™์ผํ•œ ์ด๋ฆ„๊ณผ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ•„๋“œ๋ฅผ ๋‘ ํ…Œ์ด๋ธ”์— ๋˜‘๊ฐ™์ด ๋‹ด์•„๋†“๋Š”๋‹ค.
์ด๋Ÿฐ ํ•„๋“œ๋ฅผ ๋‘ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์—ด์‡ ๋ผ๋Š” ์˜๋ฏธ๋กœ 'key'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

02.Left Join

โœ…SQL์—์„œ์˜ Join์€ ๋‘ ์ง‘ํ•ฉ ์‚ฌ์ด์˜ ๊ด€๊ณ„์™€ ๊ฐ™๋‹ค.
โ—Left Join์€ ์–ด๋””์— โ†’ ๋ญ๋ฅผ ๋ถ™์ผ๊ฑด์ง€, ์ˆœ์„œ๊ฐ€ ๋งค์šฐ ์ค‘์š”(์™ผ์ชฝ ์›์— ๋ถ™์ด๋Š”๊ฒƒ)โ—

โ–ถ์œ„์—์„œ A์™€ B๋Š” ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•œ๋‹ค.
๋‘˜ ์‚ฌ์ด์˜ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์€, A์™€ B์˜ key๊ฐ’์ด ์—ฐ๊ฒฐ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

โœ…ex) ์–ด๋–ค ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ ธ์žˆ์ง€๋งŒ, ์–ด๋–ค ๋ฐ์ดํ„ฐ๋Š” ๋น„์–ด์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฝ‰์ฐฌ ๋ฐ์ดํ„ฐ : ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ user_id ํ•„๋“œ๊ฐ’์ด point_users ํ…Œ์ด๋ธ”์— ์กด์žฌํ•ด์„œ ์—ฐ๊ฒฐํ•œ ๊ฒฝ์šฐ
๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ : ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ user_id ํ•„๋“œ๊ฐ’์ด point_users ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

โ–ถ๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, ํšŒ์›์ด์ง€๋งŒ ์ˆ˜๊ฐ•์„ ๋“ฑ๋ก/์‹œ์ž‘ํ•˜์ง€ ์•Š์•„ ํฌ์ธํŠธ๋ฅผ ํš๋“ํ•˜์ง€ ์•Š์€ ํšŒ์›

03.Inner Join

โ–ถ์—ฌ๊ธฐ์„œ A์™€ B๋Š” ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์œ„ ๊ทธ๋ฆผ์€ ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ต์ง‘ํ•ฉ์„ ์ด์•ผ๊ธฐ ํ•œ๋‹ค.

โœ…ex) select * from users u
inner join point_users p
on u.user_id = p.user_id;

โ–ถ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ๋น„์–ด์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค!
์ด์œ ๋Š”, ๊ฐ™์€ user_id๋ฅผ ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

04.๊ฒฐ๊ณผ๋ฌผ ํ•ฉ์น˜๊ธฐ! Union

โœ…A์ฟผ๋ฆฌ์™€ B์ฟผ๋ฆฌ๋ฅผ ํ•ฉ์ณ์„œ ๋ณด๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

โ–ถex)
(
select '7์›”' as month, c.title, c2.week, count() as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at < '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)
union all
(B
select '8์›”' as month, c.title, c2.week, count(
) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at >= '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week
)

โ—Union all์€ order by๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.โ—
โ—๋”ฐ๋ผ์„œ Union all์„ ์‚ฌ์šฉ ํ›„ ๋‚˜์ค‘์— order by๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.โ—

0๊ฐœ์˜ ๋Œ“๊ธ€