๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
DB

<TIL> / SQL ๋ฌธ๋ฒ• ์ด ์ •๋ฆฌ

by ๊ถŒ์Šพํ–„ 2023. 5. 14.

1์ฃผ์ฐจ

์ฟผ๋ฆฌ๋ฌธ : ์ฟผ๋ฆฌ๋Š” ์งˆ์˜๋ฅผ ๋œปํ•œ๋‹ค.(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธ!)
ํ…Œ์ด๋ธ” : ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์ ธ ์žˆ๋Š” ํ‘œ!(ํ•œ ๋งˆ๋””๋กœ, ์—‘์…€์˜ ์‹œํŠธ๋ช…์„ ์˜๋ฏธํ•œ๋‹ค.)


show tables : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์•ˆ์— ์žˆ๋Š” ํ…Œ์ด๋ธ”๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
                  * : ๋ชจ๋“  ํ•„๋“œ๋ผ๋Š” ๋œป.


     ex) select * from orders
     ->์ „์ฒด ํ…Œ์ด๋ธ” ์ค‘ orders ํ…Œ์ด๋ธ”์„ ๊ฐ€์ ธ์™€ ์ฃผ์„ธ์š”!

 

ํŠน์ • ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๊ณ  ์‹ถ์„ ๋•?
   -> ( *) ๋Œ€์‹ ์— ordersํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๊ฐ€์ง€๊ณ ์˜ค๊ณ  ์‹ถ์€ ํ•„๋“œ๋ช…์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
       (๊ฐ–๊ณ  ์˜ค๊ณ  ์‹ถ์€ ํ•„๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ๋Š” (,)๋ฅผ ์ด์šฉํ•ด์„œ ๋‚˜์—ดํ•œ๋‹ค.)


     ex) select order_no, payment_method from orders

 

์กฐ๊ฑด์„ ๊ฑฐ๋Š” where ๋ฌธ๋ฒ•.


๋ช…๋ฌธ๊ณ ๋ผ๋Š” 'ํ…Œ์ด๋ธ”'์—์„œ, 3ํ•™๋…„์ด๋ผ๋Š” 'ํ•„๋“œ' ์ค‘์—, '์ด๊ณผ'๋ฐ˜์ธ ๊ฐ’๋งŒ ๋ณด๊ณ ์‹ถ์„ ๋•Œ!
    ex) select * from ๋ช…๋ฌธ๊ณ 
          where 3ํ•™๋…„ = '์ด๊ณผ'
    (์ด๊ณผ์— ์ž‘์€๋”ฐ์›€ํ‘œ(')๊ฐ€ ๋ถ™๋Š” ์ด์œ  : (')๋Š” '๋ฌธ์ž์—ด'์ด๋ผ๋Š” ๋œป !!


    (')์ด ์—†์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋„ˆ๋„ ๋ฌด์—‡์„ ์ง€์นญํ•˜๋‹ˆ~? ๋ผ๊ณ  ์•Œ์•„๋“ค์Œ.
    ex) ๋ช…๋ฌธ๊ณ  = ํ…Œ์ด๋ธ” ์ง€์นญ
    3ํ•™๋…„ = ํ•„๋“œ๋ฅผ ์ง€์นญ
    ์ด๊ณผ = ํ•„๋“œ์•ˆ์— ์žˆ๋Š” ๋ฌธ์ž(๋ฐ์ดํ„ฐ ๊ฐ’)์ด๊ธฐ ๋•Œ๋ฌธ์— (')๋ฅผ ๋ถ™์—ฌ์„œ ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ!

 

and๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ !
๋ช…๋ฌธ๊ณ  3ํ•™๋…„ ์ค‘์—์„œ ์ด๊ณผ๋ฐ˜์˜ ์—ฌํ•™์ƒ์ธ ๊ฐ’์„ ๋ณด๊ณ  ์‹ถ์–ด์š” ~!
    ex) select * from ๋ช…๋ฌธ๊ณ 
          where 3ํ•™๋…„ = '์ด๊ณผ' and ์„ฑ๋ณ„ = '์—ฌ'

 

between์„ ์‚ฌ์šฉํ•  ๋•Œ !
where 3ํ•™๋…„ between 'a' and 'b' : ํ•„๋“œ ๋ฐ์ดํ„ฐ ์ค‘ 'a' ์™€ 'b' ์‚ฌ์ด์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅ

 

in์„ ์‚ฌ์šฉํ•  ๋•Œ !
where week in (1,3) : week ํ•„๋“œ ์ค‘ ๋ฐ์ดํ„ฐ๊ฐ€ 1 ๋˜๋Š” 3 ์ธ๊ฒƒ๋“ค๋งŒ ๊ฐ€์ง€๊ณ  ์™€๋ผ
  -> 1,3์— ์ž‘์€๋”ฐ์›€ํ‘œ(')๋ถ™์ง€์•Š์€ ์ด์œ  : ๋ฌธ์ž์—ด์ด ์ˆซ์ž์ผ ๊ฒฝ์šฐ๋Š” (')๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.
      ๋ฌธ์ž์ผ ๊ฒฝ์šฐ์—๋Š” (')๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.

= : ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค
<= : ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค
!= : ๊ฐ™์ง€ ์•Š๋‹ค

like์˜ ๋œป : ~์™€ ๊ฐ™์€
  %์˜ ๋œป : ์•ž ๋˜๋Š” ๋’ค์— ๋ญ๊ฐ€์žˆ๋˜ ๊ฐ„์—~


    ex) select * from users
          where email like '%kakao.com'


  -> usersํ…Œ์ด๋ธ”์—์„œ email์ด %(์•ž์— ๋ญ๊ฐ€์žˆ๋˜ ๊ฐ„๋ฐ) ๋’ค์—๊ฐ€ kakao.com์œผ๋กœ ๋๋‚˜๋Š”
      ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€๋ผ.

 

limit ์ˆซ์ž : ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ๋งŽ์€ ์ •๋ณด๋“ค ์ค‘์—์„œ ๊ทธ ์ค‘ ์ˆซ์ž๋งŒํผ ๋ณด๊ณ ์‹ถ์„๋•Œ ์‚ฌ์šฉ.


distinct : ๋‚˜์—ด๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๋“ค์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉ.


count : ๊ฐœ์ˆ˜๋ฅผ ์…€ ๋•Œ ์‚ฌ์šฉ.
     ex) select count(distinct(payment_method)) from orders
      -> ๊ฒฐ๊ณผ๊ฐ’(count์˜ ๊ฐ’)์ด ์ค‘๋ณต์„ ์ œ์™ธํ•˜๊ณ  '4'๋ผ๊ณ  ํ‘œ์‹œ๋œ๋‹ค. (kakaopay, card, taxbill, money)

 

<**1์ฃผ์ฐจ ๋‚ด์šฉ์„ ์ด์šฉํ•œ ๋ฌธ์ œ ๋ฐ ๋‹ต์•ˆ**>

 

Q. ๋„ค์ด๋ฒ„ ์ด๋ฉ”์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ, ์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜์„ ์‹ ์ฒญํ–ˆ๊ณ ,

     ๊ฒฐ์ œ๋Š” ์นด์นด์˜คํŽ˜์ด๋กœ ์ด๋ค„์ง„์ฃผ๋ฌธ๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๊ธฐ

 

A. select * from orders
    where email like '%@naver.com' and course_title = '์›น๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜' and
    payment_method = 'kakaopay'

2์ฃผ์ฐจ

group by : ๋™์ผํ•œ ๋ฒ”์ฃผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„๋“œ๋ณ„๋กœ ๋ฌถ์–ด์ฃผ๋Š”. (~๋ณ„ ์ด ๋‚˜์˜ค๋ฉด ๋Œ€๊ฐœ group by)
order by : ๊น”๋”ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ,๋‚˜์—ด ํ•ด์ฃผ๋Š”.

 

max : ์ตœ๋Œ€๊ฐ’
min : ์ตœ์†Ÿ๊ฐ’
sum : ํ•ฉ๊ณ„
avg : ํ‰๊ท 


round : ์†Œ์ˆ˜์  ์ •๋ฆฌ

round๋ฅผ ์ด์šฉํ•ด์„œ ์†Œ์ˆซ์  ์ •๋ฆฌ๋ฅผ ํ•ด์ค„ ๋•Œ!
    ex) select week, round(avg(likes),2) from checkins

          group by week

 

order by๋กœ ์ •๋ ฌ ํ›„ ๋ณด๋‹ค ๋” ๋ณด๊ธฐ์ข‹๊ฒŒ ์ •๋ ฌ์‹œํ‚ค๋Š” ๋‹จ์–ด๋“ค
desc : ๋‚ด๋ฆผ์ฐจ์ˆœ
asc : ์˜ค๋ฆ„์ฐจ์ˆœ

 

<**2์ฃผ์ฐจ ๋‚ด์šฉ์„ ์ด์šฉํ•œ ๋ฌธ์ œ ๋ฐ ๋‹ต์•ˆ**>

 

Q. ๋„ค์ด๋ฒ„ ์ด๋ฉ”์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์•ฑ๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜์„ ์‹ ์ฒญํ•œ ์ฃผ๋ฌธ์˜ ๊ฒฐ์ œ์ˆ˜๋‹จ๋ณ„ ์ฃผ๋ฌธ๊ฑด์ˆ˜ ์„ธ์–ด๋ณด๊ธฐ

 

A. select payment_method, count(*) as cnt from orders
    where email like '%@naver.com' and course_title = '์•ฑ๊ฐœ๋ฐœ ์ข…ํ•ฉ๋ฐ˜'
    group by payment_method

3์ฃผ์ฐจ

join์ด๋ž€? : ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ณตํ†ต๋œ ์ •๋ณด(ํ•„๋“œ or key๊ฐ’)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์„œ ํ•œ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ๋ณด๋Š” ๊ฒƒ!

 

join์„ ์‚ฌ์šฉํ•  ๋•Œ

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

          (์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜๋Š”๊ฒƒ๋„ ๊ฐ€๋Šฅ)

 

join์˜ ์ข…๋ฅ˜ : left join, inner join

left join : ํ•ฉ์ง‘ํ•ฉ
inner join : ๊ต์ง‘ํ•ฉ (์ฃผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋จ.)

 

alias : ๋ณ„์นญ์ด๋ž€ ๋œป.
as ~ : as ๋’ค์—์˜ค๋Š” ๋ฌธ์ž๋ฅผ as ์•ž์˜๊ฒƒ์˜ ๋ณ„์นญ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค„ ๋•Œ ์‚ฌ์šฉ.
     ex) select count() as cnt from orders o

      -> as๋’ค์— ๋ถ™์€ cnt๊ฐ€ count()์˜ ๋ณ„์นญ์ด ๋œ ๊ฒƒ!  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ orders ๋’ค์˜ o๋„ orders์˜ ๋ณ„์นญ์ด๋ผ๋Š” ๋œป์œผ๋กœ ํ‘œ์‹œ.

 

alias(๋ณ„์นญ) ์–ธ์ œ์“ฐ๋‚˜์š”??

   ->orders๋ผ๋Š” ํ…Œ์ด๋ธ”์—๋„ user_id๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๊ณ ,
      users๋ผ๋Š” ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—๋„ user_id๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์„ ๋•Œ,
      ์–ด๋–ค ํ…Œ์ด๋ธ”์˜ user_id์ธ์ง€ ๊ตฌ๋ถ„ ์‹œ์ผœ์ค„ ๋•Œ ์‚ฌ์šฉ.

 

    ex) select o.user_id, u.email, count(*) as cnt from orders o
          inner join users u on o.user_id = u.user_id
          group by o.user_id

 

union all : ์ฟผ๋ฆฌ๋ฌธ๊ณผ ์ฟผ๋ฆฌ๋ฌธ์„ ์ด์„๋•Œ ์‚ฌ์šฉ.
union์€ order by๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
๊ทธ๋ž˜์„œ ํ•ฉ์น  ์ฟผ๋ฆฌ๋ฌธ์—์„œ order by๋ฅผ ๋นผ์ค˜๋„ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

 

order by ๋ฅผ ์ ์šฉ์‹œํ‚ฌ๋ ค๋ฉด?

    -> union all๋กœ ์ฟผ๋ฆฌ๋ฌธ์„ ํ•ฉ์นœ ํ›„ order by๋ฅผ ์จ์•ผ ์ ์šฉ์ด ๋จ.
ex)
(
select '7์›”' as month, c1.title, c2.week, count() as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at < '2020-08-01'
group by c1.title, c2.week
)
union all
(
select '8์›”' as month, c1.title, c2.week, count() as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
)

 

<**3์ฃผ์ฐจ ๋‚ด์šฉ์„ ์ด์šฉํ•œ ๋ฌธ์ œ ๋ฐ ๋‹ต์•ˆ**>

 

Q. enrolled_id๋ณ„ ์ˆ˜๊ฐ•์™„๋ฃŒ(done=1)ํ•œ ๊ฐ•์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ์–ด๋ณด๊ณ , ์™„๋ฃŒํ•œ ๊ฐ•์˜ ์ˆ˜๊ฐ€ ๋งŽ์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•ด๋ณด๊ธฐ.

     user_id๋„ ๊ฐ™์ด ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

A. select e.enrolled_id, user_id, count(done) as done from enrolleds e
    inner join enrolleds_detail ed on e.enrolled_id = ed.enrolled_id
    where done=1
    group by e.enrolled_id
    order by done desc

4์ฃผ์ฐจ

subquery๋ž€? : ์ฟผ๋ฆฌ ์•ˆ์˜ ์ฟผ๋ฆฌ (์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ)
subquery๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ž์‹ ์ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.


*subquery๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑ ์‹œ ํ•ญ์ƒ tab์„ ์‚ฌ์šฉํ•ด์„œ ์ค„์„ ์ž˜ ๋งž์ถฐ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
->ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ธฐ ์œ„ํ•จ.

 

subquery ์‚ฌ์šฉ ์ „ ์˜ˆ์‹œ.

 

ex)
select u.user_id, u.name, u.email from users u
inner join orders o on u.user_id = o.user_id
where o.payment_method = 'kakaopay'

 

์œ„์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฌธ์„ ์ด๋ฒˆ์—” subquery๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“  ์˜ˆ์‹œ.

 

ex)
select * from users
where user_id in (
select user_id from orders
where payment_method = 'kakaopay'
)

 

์œ„ ๋‘˜๋‹ค ๊ฒฐ๊ณผ๊ฐ’์€ ๊ฐ™๋‹ค.

 

with ๊ตฌ๋ฌธ

 

์‚ฌ์šฉ ์ „ ์˜ˆ์‹œ.

 

ex)

select c.title,
a.cnt_checkins,
b.cnt_total,
(a.cnt_checkins/b.cnt_total) as ratio
from
(
select course_id, count(distinct(user_id)) as cnt_checkins from checkins
group by course_id
) a
inner join
(
select course_id, count(*) as cnt_total from orders
group by course_id
) b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id

 

์œ„ ์ปค๋ฆฌ๋ฌธ์„

with๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ด„ํ˜ธ์•ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋“ค์„ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”(table1,2)๋กœ ๋งŒ๋“ค์–ด,

์ฟผ๋ฆฌ๋ฌธ ๋งจ์œ„์— with์ ˆ๋กœ ์ •๋ฆฌํ•œ ์˜ˆ์‹œ.

 

ex)

with table1 as (
select course_id, count(distinct(user_id)) as cnt_checkins from checkins
group by course_id
), table2 as (
select course_id, count(*) as cnt_total from orders
group by course_id
)

select c.title,
a.cnt_checkins,
b.cnt_total,
(a.cnt_checkins/b.cnt_total) as ratio
from table1 a
inner join table2 b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id

 

-> alias๋กœ ๋ณ„์นญ์„ ์ฃผ๋ฉด์„œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ์‚ฌ์šฉํ•ด with๋กœ ์ •๋ฆฌํ–ˆ๋”๋‹ˆ
ํ›จ์”ฌ ๋” ํ•œ ๋ˆˆ์— ๋ณด๊ธฐ ํŽธํ•œ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

SUBSTRING_INDEX(eamil,'@',1) : email์„ @์„ ๊ธฐ์ค€์œผ๋กœ ์ชผ๊ฐœ๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ๊ฒƒ๋งŒ ๋ณด์—ฌ์ค˜~
ex) inborn96

 

SUBSTRING_INDEX(eamil,'@',-1) : email์„ @์„ ๊ธฐ์ค€์œผ๋กœ ์ชผ๊ฐœ๋Š”๋ฐ, ๋’ค์—๊ฒƒ๋งŒ ๋ณด์—ฌ์ค˜~
ex) daum.net

 

SUBSTRING(created_at,1,8) : created_at์„ ๋ช‡ ๋ฒˆ์งธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, ๊ทธ ๋’ค๋กœ ๋ช‡ ๊ธ€์ž๊นŒ์ง€ ์ž๋ฅผ๊ฑด์ง€~ (8์€ ๊ฐœ์ˆ˜๋ฅผ ๋œปํ•จ.)

 

๊ทธ ์™ธ ์กฐ๊ฑด๋ฌธ

 

case when ~ then '์ž˜ ํ•˜๊ณ  ์žˆ์–ด์š”!'
else 'ํž˜๋‚ด์„ธ์š”!' end

 

์ด๋ ‡๊ฒŒ 1~4์ฃผ์ฐจ SQL๊ฐ•์˜๋ฅผ ์™„๊ฐ•ํ•˜๋ฉด์„œ, ์ผ์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ๋ฒ•๋“ค์„ ๋‹ค๋ค„๋ณด์•˜๋‹ค.

 

๋ฌธ๋ฒ•์„ ์ •๋ฆฌํ•ด๋‘๋ฉด ๋‚˜์ค‘์— ๋‚ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ฐ”๋กœ๋ฐ”๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ ๊บผ๋‚ด์“ฐ๊ธฐ์— ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ด์ •๋ฆฌ๋กœ ์ •๋ฆฌํ•ด๋ณธ๋‹ค ใ…Žใ…Žใ…Žใ…Žใ…Ž