๐ฉ๐ป Learn programming
[DB/SQL] SQL ๋ฌธ๋ฒ ์ด์ ๋ฆฌ
๋ฐ๊ตฅ์
2022. 5. 24. 20:19
๋ฐ์ํ
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฌ๋ฌ ์ฌ๋์ด ๊ฐ์ด ์ฌ์ฉํ ๋ชฉ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ํต!
- ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ CRUD ๊ธฐ๋ฅ์ ์ง์!
( C - Create ์์ฑ, R - Read ์ฝ๊ธฐ, U - Update ๋ณ๊ฒฝ, D - Delete ์ญ์ )
โ SQL
- Structured Query Language์ ์ฝ์!
- ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๊ณผ์ ์ธ 'R'์ ํธ๋ฆฌํ๊ธฐ ์ํด SQL์ ์ฌ์ฉ.
- ๋ฐ์ดํฐ๋ฅผ ์์ฝ๊ณ ๊น๋ํ๊ฒ ์ ๋ฆฌ/๋ถ์ํ๋ ๊ธฐ๋ฅ๋ ์ง์ํจ.
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ช ๋ ฅ์ด๋ฅผ ์์ฑํ๋ ๊ฒ์ 'SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค'๋ผ๊ณ ํจ.
โ๏ธ Select
- ๋ฐ์ดํฐ๋ฅผ ์ ํํด์ ๊ฐ์ ธ์จ๋ค.
- 1) ์ด๋ค ํ ์ด๋ธ์์ 2) ์ด๋ค ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ์ง๋ก ๊ตฌ์ฑ๋จ.
- ์๋์ ํ๊ฐ ํ ์ด๋ธ์ด๊ณ , ๋ ธ๋ ํ๊ด์์ด ํ๋๋ฅผ ๋ํ๋.
select * from user
-- user ํ
์ด๋ธ์ ๋ชจ๋ (*) ํ๋ ๊ฐ์ ธ์ค๊ธฐ
select user_id, name, email from user
-- user ํ
์ด๋ธ์ ํน์ ํ๋ ๊ฐ์ ธ์ค๊ธฐ
โ๏ธ Where
- select ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ์ ์กฐ๊ฑด ๊ฑธ์ด์ฃผ๊ธฐ
- ์กฐ๊ฑด๋ฌธ์ ๊ฑธ์ด์ค ๋, ํ๋๋ช ์ด๋ ํ ์ด๋ธ ๋ช ์ด ์๋ ๋ฌธ์์ด๋ก ์ธ์์ํค๊ธฐ ์ํด ' ' or " " ์ ์ฌ์ฉ!
-- 1. orders ํ
์ด๋ธ์์ ๊ฒฐ์ ๋ฐฉ๋ฒ์ด ์นด์นด์คํ์ด์ธ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
select * from orders
where payment_method = 'kakaopay'
-- 2. ์ฌ๋ฌ ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ๊ธฐ ์ํ ๋ฐฉ๋ฒ
select * from orders
where payment_method = 'kakaopay' and course_title = "์ฑ๊ฐ๋ฐ ์ข
ํฉ๋น"
โ Where ์ ๊ณผ ์์ฃผ ๊ฐ์ด ์ฐ๋ ๋ฌธ๋ฒ
- ๊ฐ์ง ์์ (!=)
- ๋ฒ์ (between ~ and ~)
- ํฌํจ (in)
- ํจํด, ๋ฌธ์์ด ๊ท์น (like)
-- 1. orders ํ
์ด๋ธ์์ ๊ฒฐ์ ๋ฐฉ๋ฒ์ด CARD๊ฐ ์๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
select * from orders
where payment_method != 'CARD'
-- 2. users ํ
์ด๋ธ์์ ๊ฐ์
์ผ์ด '8์1์ผ ~ 8์10์ผ'์ธ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
select * from users
where created_at between '2020-08-01' and '2020-08-11'
-- 3. users ํ
์ด๋ธ์์ ์ด๋ฉ์ผ์ด s๋ก ์์ํ๊ณ com์ผ๋ก ๋๋๋ฉด์ ์ฑ์ด ๊น์จ์ธ ์ ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
select * from users
where email like 's%com' and name = '๊น**'
โ ์ด์ธ ์ ์ฉํ ๋ฌธ๋ฒ
- ์ผ๋ถ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ธฐ : Limit
- ์ค๋ณต ๋ฐ์ดํฐ ์ ์ธํ๊ณ ๊ฐ์ ธ์ค๊ธฐ : Distinct
- ๋ช ๊ฐ์ธ์ง ์ซ์ ์ธ๋ณด๊ธฐ : Count
- ๋ณ์นญ ๊ธฐ๋ฅ : Alias (ํ ์ด๋ธ๋ช ๋ค์ ๋ณ์นญ ์ถ๊ฐ, ์ถ๋ ฅ๋ ํ๋์ ๋ณ์นญ ์ถ๊ฐ)
-- users ํ
์ด๋ธ์์ ํ์์ ์ฑ์จ ๊ฐฏ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ํ๋๋ช
์ cnt_fname์ด๋ผ๊ณ ํด์ฃผ๊ธฐ!
select count(distinct(name)) as cnt_fname from users;
โ ๋ฐ์ดํฐ ๋ถ์ํ๊ธฐ
- ๋ฐ์ดํฐ ๋ถ์์ ๋ชฉ์ : ์์ฌ์๋ ๋ฐ์ดํฐ์์ ์๋ฏธ๋ฅผ ๊ฐ๋ '์ ๋ณด'๋ก ๋ณํํ๋ ๊ฒ!
โ๏ธ Group by
- ๋์ผํ ๋ฒ์ฃผ๋ฅผ ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก ๋ฌถ์ด์, ๋ฒ์ฃผ๋ณ ํต๊ณ๋ฅผ ๋ด์ฃผ๋ ๊ฒ.
- ex) 1) ๊ฐ์ ์ฑ์จ์ ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก ๋ฌถ๊ณ , 2) ๊ฐ ์ฑ์จ์ ํ์์๋ฅผ ๊ตฌํ ์ ์์!
- Group by ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์ : from -> group by -> select
- count(๊ฐฏ์), min(์ต์๊ฐ), max(์ต๋๊ฐ), avg(ํ๊ท ), sum(ํฉ๊ณ) ๊ตฌํ๊ธฐ ๊ฐ๋ฅ !
-- users ํ
์ด๋ธ์์ ์ฑ์จ๋ณ user ์๋ฅผ ๊ตฌํ๊ธฐ
select name, count(*) from users
group by name
-- 1) users ํ
์ด๋ธ ์ ์ฒด ๊ฐ์ ธ์ค๊ธฐ (from)
-- 2) users ํ
์ด๋ธ ๋ฐ์ดํฐ์์ ๊ฐ์ name์ ๊ฐ๋ ๋ฐ์ดํฐ ํฉ์ณ์ฃผ๊ธฐ (group by)
-- 3) name์ ๋ฐ๋ผ ํฉ์ณ์ง ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ฐ ๋ช ๊ฐ๊ฐ ํฉ์ณ์ง ๊ฒ์ธ์ง ์ธ๋ฆฌ๊ธฐ (select)
โ๏ธ Order by
- ์ ๋ ฌํ๊ธฐ
- Order by ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์ : from -> group by -> select -> order by
- order by (๊ธฐ์ค ํ๋๋ช ) -> ์ค๋ฆ์ฐจ์ (asc)
- order by (๊ธฐ์ค ํ๋๋ช ) desc -> ๋ด๋ฆผ์ฐจ์ (descending์ ์ฝ์)
-- ์ฑ์จ๋ณ ํ์ ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
select name, count(*) from users
group by name
order by count(*) desc
โ where๊ณผ ํจ๊ป ์ฐ๋ฉด?
- ์ฟผ๋ฆฌ ์คํ๋๋ ์์: from → where → group by → select -> order by
-- '์น๊ฐ๋ฐ ์ข
ํฉ๋ฐ'์ฝ์ค์ ๊ฒฐ์ ๋ฐฉ๋ฒ ๋ณ ๊ฒฐ์ ๊ฑด์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
select payment_method, count(*) from orders
where course_title = "์น๊ฐ๋ฐ ์ข
ํฉ๋ฐ"
group by payment_method
order by count(*)
โ๏ธ Join
- ๋ ํ ์ด๋ธ์ ๊ณตํต๋ ์ ๋ณด(key๊ฐ)๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ด๋ธ์ ์ฐ๊ฒฐํด์ ํ ํ ์ด๋ธ์ฒ๋ผ ๋ณด๋ ๊ฒ.
- SQL์ Join์ ์์ ์ vlookup๊ณผ ๋์ผ.
โ๏ธ Inner join
- A์ B๋ ๊ฐ๊ฐ์ ํ ์ด๋ธ์ ์๋ฏธํ๊ณ , Inner join์ ๋ ํ ์ด๋ธ์ ๊ต์งํฉ
- A ํ ์ด๋ธ์ ํ๋์๋ ์์ง๋ง, B ํ ์ด๋ธ์ ํ๋์๋ ์๋ค๋ฉด, NULL ๊ฐ์ด ์๊น
- ์์) A ํ ์ด๋ธ์ด ์ ์ ํ ์ด๋ธ, B ํ ์ด๋ธ์ด ์ ์ ํฌ์ธํธ ํ ์ด๋ธ์ผ ๊ฒฝ์ฐ,
ํ์์ด์ง๋ง ์๊ฐ์ ๋ฑ๋ก/์์ํ์ง ์์ ํฌ์ธํธ๋ฅผ ํ๋ํ์ง ์์ ํ์์ธ ๊ฒฝ์ฐ!
-- users ํ
์ด๋ธ ๋ณด๊ธฐ
select * from users u
-- point users ํ
์ด๋ธ ๋ณด๊ธฐ
select * from point_users p
-- user_id๋ฅผ key ๊ฐ์ผ๋ก inner joinํ๊ธฐ
select * from users u
inner join point_users p
on u.user_id = p.user_id;
-- user_id๋ฅผ key ๊ฐ์ผ๋ก left joinํ๊ธฐ
select * from users u
left join point_users p
on u.user_id = p.user_id
โ Join ์ข ๋ฅ
- CROSS JOIN : ์ ํ ์ด๋ธ์ ๋ฐ์ ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ ์ถ๋ ฅ
- INNER JOIN : ๋ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅ
- OUTER JOIN : JOIN ์กฐ๊ฑด์ ๋ง์ง ์์๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ (LEFT, RIGHT)
โ๏ธ Union
- ํ๋๋ช ์ด ๊ฐ์ ํ ์ด๋ธ ์กฐํ ์, select๋ฅผ ๋ ๋ฒ ํ์ง ์๊ณ , ํ ๋ฒ์ ๋ชจ์์ ๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ.
- ํ ์ด๋ธ์ ํ๋๋ช ์ด ๋ฌด์กฐ๊ฑด ๊ฐ์์ผํจ!
- but, ๋ด๋ถ ์ ๋ ฌ์ด ๊นจ์ง (order by X)
-- 1. 7์ week๋ณ ์ฒดํฌ์ธ ์
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
-- 2. 8์ week๋ณ ์ฒดํฌ์ธ ์
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
-- 3. 7, 8์ week๋ณ ์ฒดํฌ์ธ ์
(
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
)
union all
(
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
)
โ๏ธ Subquery
- ์ฟผ๋ฆฌ ์์ ์ฟผ๋ฆฌ (์์ ์ฟผ๋ฆฌ ์์ ํ์ ์ฟผ๋ฆฌ)
-- Subquery ํํ
select u.user_id, u.name, u.email from users u
where u.user_id in (
select user_id from orders
where payment_method = 'kakaopay'
)
* ํฌ์คํ ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์์์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
๋ฐ์ํ