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๊ฐ์๋ฅผ ์๊ฐํ๋ฉด์, ์ผ์์์ ์ฌ์ฉ๋๋ ๋๋ถ๋ถ์ ๋ฌธ๋ฒ๋ค์ ๋ค๋ค๋ณด์๋ค.
๋ฌธ๋ฒ์ ์ ๋ฆฌํด๋๋ฉด ๋์ค์ ๋ด๊ฐ ํ์ํ ๋ ๋ฐ๋ก๋ฐ๋ก ํ๋ํ๋ ๊บผ๋ด์ฐ๊ธฐ์ ์ข์ ๊ฒ ๊ฐ์์ ์ด์ ๋ฆฌ๋ก ์ ๋ฆฌํด๋ณธ๋ค ใ ใ ใ ใ ใ
'DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[sequelize] : sequelize ๊ธฐ๋ณธ์ธํ (0) | 2023.07.13 |
---|---|
[SQL] : ์ ์ฝ์กฐ๊ฑด ์์๋ณด๊ธฐ. (0) | 2023.07.13 |
[SQL] : ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๋ฐ์ดํฐ ์์ฑํ๊ณ ์กฐํํด๋ณด๊ธฐ. (1) | 2023.07.13 |
[SQL] : ๊ตฌ์กฐํ๋ ์ฟผ๋ฆฌ ์ธ์ด = Structured Query Language (0) | 2023.07.13 |
<TIL> / SQL 1์ฃผ์ฐจ ๋ง๋ฌด๋ฆฌ ๊ฐ๋ฐ์ผ์ง / DBeaver(ํ๋ก๊ทธ๋จ) ์ฌ์ฉ๊ธฐ (0) | 2023.05.03 |