DATEDIFF( )
๐ ์ฐจ์ด ๊ตฌํ๋ ์
๐ datediff( '์์' , '๋')
๐ "์์" ์์ "๋" ์ ๋บ
select * from enrolleds_detail ed
where week = 1
and seen = true
and done = true
and datediff(done_date , seen_date) > 0
TIMESTAMPDIFF( )
๐ ์ฐจ์ด ๊ตฌํ๋ ์ . ์ฐจ์ด๋ฅผ ๊ตฌํ ๋จ์ ์ง์ ๊ฐ๋ฅ
๐ timestampdiff(๋จ์, '์์', '๋')
๐ "๋" ์์ "์์" ์ ๋บ
select timestampdiff(second, seen_date, done_date)
From enrolleds_detail ed
where done = true
and seen = true
and timestampdiff(second, seen_date, done_date) > 0
๐ ๊ตฌ๋ถ์๋ year, month, week, day, hour, minute, second ๋ฑ ์ด ์๋ค.
DATEDIFF( ) / TIMESTAMPDIFF( ) ์์
CURDATE( )
๐ ์ง๊ธ ์๊ฐ ๋ถ๋ฌ์ค๋ ์ .
๐ current date์ ์ฝ์
select enrolled_detail_id,
ADDDATE(CURDATE(), 1),
done_date,
DATEDIFF(ADDDATE(CURDATE(), 100), done_date)
from enrolleds_detail ed
where done = true
and seen = true
ADDDATE( ๋์, ๋ํ ๋ ์ง )
๐ ๋ ์ง์ ์ํ๋ ๋งํผ ๋ํ๊ฑฐ๋ ๋บ ์ ์๋ค.
SUBSTRING_INDEX( )
๐ ๋ฌธ์์ด ์กฐ๊ฐ๋ด๊ธฐ
๐ SUBSTRING_INDEX(ํ๋ ์ด๋ฆ, '๋ฌด์์ ๊ธฐ์ค์ผ๋ก ์ชผ๊ฐค๊ฑด์ง', ๋ช๋ฒ์งธ ์กฐ๊ฐ ๊ฐ์ ธ์ฌ๊ฑด์ง)
๐ ๋์ ์ซ์๊ฐ -1 ์ด๋ผ๋ฉด, ๋ง์ง๋ง๊บผ ๋ณด์ฌ๋ฌ๋ผ๋ ๋ง.
select name,
email,
SUBSTRING_INDEX(email, '@',1)
from users
SUBSTRING( )
๐ ๋ฌธ์์ด ์๋ฅด๊ธฐ
๐ SUBSTRING (ํ๋ ์ด๋ฆ, '์์์์น', '๋ช๊ฐ ์๋ฅผ๊ฑด์ง')
๐ ์์์์น๊ฐ 1์ด๋ผ๋ฉด ์ฒ์๋ถํฐ ์๋ฅธ๋ค๋ ์๋ฏธ. (์๋ฐ์คํฌ๋ฆฝํธ ๋ ํท๊ฐ๋ฆฌ์ง ๋ง๊ธฐ.)
select order_no,
created_at ,
substring(created_at, 1,10)
From orders o

case ~ then ~ esle ~ end
๐ ์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ ๊ฒ, ์ ๋ฐ ๊ฒฝ์ฐ ์ ๋ ๊ฒ
๐ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ํ๋ ๊ฐ์ ์ถ๋ ฅ
๐ case when ์กฐ๊ฑด then ์ํ๋ ๊ฒฐ๊ณผ esle ์ํ๋ ๊ฒฐ๊ณผ end as ํ๋์ด๋ฆ๋ถ์ฌ์ฃผ๊ธฐ
select pu.user_id, pu.point,
case when pu.point > 10000 then '์ ํ๊ณ ์์ด์!'
else '์กฐ๊ธ๋ง ๋ ํ์ดํ
!'end as msg
from point_users pu
case๋ฌธ, with๋ฌธ, subquery ๋ณตํฉ ์์
with table1 as
(
select a.lv, count(* ) from
(
select pu.user_id, pu.point,
case when pu.point > 10000 then '1๋ง ์ด์'
when pu.point > 5000 then '5์ฒ ์ด์'
else '5์ฒ ๋ฏธ๋ง' end as lv
from point_users pu
)a
group by a.lv
)
select a.lv, count(*) from table1 a
group by a.lv
์ผ๋จ ๋ด๋ถ ์๋ธ์ฟผ๋ฆฌ ๋จผ์ ๋ด์ผํ๋ค.
select pu.user_id, pu.point,
case when pu.point > 10000 then '1๋ง ์ด์'
when pu.point > 5000 then '5์ฒ ์ด์'
else '5์ฒ ๋ฏธ๋ง' end as lv
from point_users pu
point_users ๋ผ๋ ํ ์ด๋ธ์์ user_id, point ํ๋๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ,
๋ง์ฝ ์ด๋ฐ๊ฒฝ์ฐ๋ผ๋ฉด
point > 10000
๊ทธ๋ ๋ค๋ฉด '1๋ง ์ด์' ์ด๋ผ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๊ณ ,
๋ง์ฝ ์ด๋ฐ ๊ฒฝ์ฐ๋ผ๋ฉด
point > 5000
๊ทธ๋ ๋ค๋ฉด '5์ฒ ์ด์' ์ด๋ผ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๊ณ ,
๊ทธ๊ฒ ์๋๋ผ๋ฉด
'5์ฒ ๋ฏธ๋ง' ์ด๋ผ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค.
end ๋
๊ทธ๋ฆฌ๊ณ ์ด ๋ฐ์ดํฐ๋ค์ ์ด๋ฆ์ lv๋ก ํ ๊ป.

๊ทธ๋ฆฌ๊ณ ๋ฐฉ๊ธ ๋ง๋ ์ด ์ฟผ๋ฆฌ๋ฌธ์ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฌธ์ from ์ ์ ๋ฃ์ด์ ์ด๋ฏธ ์๋ ํ ์ด๋ธ ์ฒ๋ผ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ณด๊ธฐ ํ๋๋๊น with table1 as () ๋ฅผ ์ด์ฉํด ์ ๋ฆฌ.
'SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL Subquery / with table1 as / distinct (0) | 2023.09.24 |
---|---|
SQL ํ ์ด๋ธ ๋ถ์ด๊ธฐ inner join / left join / NULL (0) | 2023.09.23 |
sql ๊ธฐ์ด + group by / order by / where ์ค๋ณต (0) | 2023.09.23 |
SQL limit / distinct / count (0) | 2023.09.20 |
SQL where/ between and / like '%' / in() / != ์ด๊ฑฐ ์ ์ธํ๊ณ ๋ณด์ฌ์ค (0) | 2023.09.20 |