โ Join๋?
๋ ํ ์ด๋ธ์ ๊ณตํต๋ ์ ๋ณด(key๊ฐ)๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ด๋ธ์ ์ฐ๊ฒฐํด์ ํ ํ ์ด๋ธ์ฒ๋ผ ๋ณด๋ ๊ฒ์ ์๋ฏธํ๋ค.
โถex) user_id ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก users ํ ์ด๋ธ๊ณผ orders ํ ์ด๋ธ์ ์ฐ๊ฒฐํด์ ํ ๋์ ๋ณด๊ณ ์ถ์ด์!
โ ์ ์์์ ๊ฐ์ด, ๋ ํ ์ด๋ธ์ ์ ๋ณด๋ฅผ ์ฐ๊ฒฐํด์ ํจ๊ป ๋ณด๊ณ ์ถ์ ๋ ๋๋นํด์ ๋ฌด์ธ๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๊ฐ ์์ ๋, user_id ์ฒ๋ผ ๋์ผํ ์ด๋ฆ๊ณผ ์ ๋ณด๊ฐ ๋ด๊ธด ํ๋๋ฅผ ๋ ํ ์ด๋ธ์ ๋๊ฐ์ด ๋ด์๋๋๋ค.
์ด๋ฐ ํ๋๋ฅผ ๋ ํ ์ด๋ธ์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ด์ ๋ผ๋ ์๋ฏธ๋ก 'key'๋ผ๊ณ ๋ถ๋ฅธ๋ค.
โ SQL์์์ Join์ ๋ ์งํฉ ์ฌ์ด์ ๊ด๊ณ์ ๊ฐ๋ค.
โLeft Join์ ์ด๋์ โ ๋ญ๋ฅผ ๋ถ์ผ๊ฑด์ง, ์์๊ฐ ๋งค์ฐ ์ค์(์ผ์ชฝ ์์ ๋ถ์ด๋๊ฒ)โ

โถ์์์ A์ B๋ ๊ฐ๊ฐ์ ํ
์ด๋ธ์ ์๋ฏธํ๋ค.
๋ ์ฌ์ด์ ๊ฒน์น๋ ๋ถ๋ถ์, A์ B์ key๊ฐ์ด ์ฐ๊ฒฐ๋๋ ๋ถ๋ถ์ด๋ค.
โ ex) ์ด๋ค ๋ฐ์ดํฐ๋ ๋ชจ๋ ํ๋๊ฐ ์ฑ์์ ธ์์ง๋ง, ์ด๋ค ๋ฐ์ดํฐ๋ ๋น์ด์๋ ํ๋๊ฐ ์์ต๋๋ค.
๊ฝ์ฐฌ ๋ฐ์ดํฐ : ํด๋น ๋ฐ์ดํฐ์ user_id ํ๋๊ฐ์ด point_users ํ ์ด๋ธ์ ์กด์ฌํด์ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ
๋น์ด์๋ ๋ฐ์ดํฐ : ํด๋น ๋ฐ์ดํฐ์ user_id ํ๋๊ฐ์ด point_users ํ ์ด๋ธ์ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ
โถ๋น์ด์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ํ์์ด์ง๋ง ์๊ฐ์ ๋ฑ๋ก/์์ํ์ง ์์ ํฌ์ธํธ๋ฅผ ํ๋ํ์ง ์์ ํ์
โถ์ฌ๊ธฐ์ A์ B๋ ๊ฐ๊ฐ์ ํ
์ด๋ธ์ ์๋ฏธํฉ๋๋ค.
์ ๊ทธ๋ฆผ์ ๋ ํ
์ด๋ธ์ ๊ต์งํฉ์ ์ด์ผ๊ธฐ ํ๋ค.
โ ex) select * from users u
inner join point_users p
on u.user_id = p.user_id;
โถ์ ์์์์๋ ๋น์ด์๋ ํ๋๊ฐ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ค!
์ด์ ๋, ๊ฐ์ user_id๋ฅผ ๋ ํ
์ด๋ธ์์ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
โ 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๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.โ