๐Ÿ‘ฉ‍๐Ÿ’ป Learn programming/DB

[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 ํ…Œ์ด๋ธ”์˜ ํŠน์ • ํ•„๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ

 

select๋ฌธ ๊ฒฐ๊ณผ

 

โœ”๏ธ Where 

- select ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ์— ์กฐ๊ฑด ๊ฑธ์–ด์ฃผ๊ธฐ
- ์กฐ๊ฑด๋ฌธ์„ ๊ฑธ์–ด์ค„ ๋•Œ, ํ•„๋“œ๋ช…์ด๋‚˜ ํ…Œ์ด๋ธ” ๋ช…์ด ์•„๋‹Œ ๋ฌธ์ž์—ด๋กœ ์ธ์‹์‹œํ‚ค๊ธฐ ์œ„ํ•ด ' ' or " " ์„ ์‚ฌ์šฉ!
-- 1. orders ํ…Œ์ด๋ธ”์—์„œ ๊ฒฐ์ œ๋ฐฉ๋ฒ•์ด ์นด์นด์˜คํŽ˜์ด์ธ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ
select * from orders 
where payment_method = 'kakaopay'

-- 2. ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
select * from orders 
where payment_method = 'kakaopay' and course_title = "์•ฑ๊ฐœ๋ฐœ ์ข…ํ•ฉ๋นˆ"

 

๊ฒฐ๊ณผ 1
๊ฒฐ๊ณผ 2

โž• 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 = '๊น€**'

 

๊ฒฐ๊ณผ 1
๊ฒฐ๊ณผ 2
๊ฒฐ๊ณผ 3
๊ฒฐ๊ณผ 4

 

โž• ์ด์™ธ ์œ ์šฉํ•œ ๋ฌธ๋ฒ•

- ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ : 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

 

users ํ…Œ์ด๋ธ”
point_users ํ…Œ์ด๋ธ”
inner join ๊ฒฐ๊ณผ
left join ๊ฒฐ๊ณผ

 

โž• Join ์ข…๋ฅ˜

- CROSS JOIN : ์–‘ ํ…Œ์ด๋ธ”์˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ ์ถœ๋ ฅ
- INNER JOIN : ๋‘ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•œ ์กฐ์ธ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅ
- OUTER JOIN : JOIN ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์•„๋„ ๊ฒฐ๊ณผ ์ถœ๋ ฅ (LEFT, RIGHT)

 

์ถœ์ฒ˜ : https://dsin.wordpress.com/2013/03/16/sql-join-cheat-sheet/

 

 

โœ”๏ธ 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
)

 

๊ฒฐ๊ณผ 1
๊ฒฐ๊ณผ 2
๊ฒฐ๊ณผ 3

 

โœ”๏ธ 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'
)

 

 

* ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ•์˜์—์„œ ์ œ๊ณตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.