๐ฅ ๋ด์ผ๋ฐฐ์์บ ํ DA
231213 WED SQL๋ก ๊ฐ๊ณตํ๊ธฐ, ์กฐ๊ฑด๋ฌธ
ํํฝ
2023. 12. 17. 01:13
๊ณต๋ถ 2์ผ์ฐจ. ๊ฐ์๋ ํ๋๋ฐ์ ๋ฃ์ง ๋ชปํ์ง๋ง ์ฝ๋์นดํ๋ฅผ 10๊ฐ ํ์๋ค. ์ ๋ฒ,, ์๋ ๋๋ฌด ์ฌ๋ฐ๋๋ผ๊ณ ๐
Liked
- ์ฝ๋์นดํ๋ ํ๊ณ ๋์ ๋ค๋ฅธ ์ฌ๋์ด ์ ์ถํ ์ฝ๋๋ฅผ ๋ณด๋ ๊ฒ ์ ์ผ ์ฌ๋ฐ๋ค.
- ์ฑgpt ์ฌ์ฉ ์ด๋๋ก ์ ์ผ ์ผ๋ฌด์ง๊ฒ ์จ๋จน๋ ์ค์ด๋ค. ์ด ๋ถ๋ถ ์ดํด๊ฐ ์ ๋๋๊น ๋ค๋ฅธ ์ฌ๋ก๋ฅผ ๋ค์ด์ ๋ ์์ธํ๊ฒ ๋ค์ ์ค๋ช ํด ๋ฑ๋ฑ.
Lacked
- ์คํธ๋ ์นญ์ ํ์์ฑ์ ์ ๊ฐํ๋ค.
- ์ค์ต ์์ฃผ๋ก ์งํ๋์ด ์ด๋ก ์ ์ธ ๋ถ๋ถ์ด ์ข ๋ถ์กฑํ ๊ฒ ๊ฐ๋ค. ๊ฐ๋จํ ์๋ก, '๊ฐ'์ด๋ผ๊ณ ๋ถ๋ฌ๋ ๋๋์ง, '๋ฐ์ดํฐ'๋ผ๊ณ ๋ถ๋ฌ๋ ๋๋์ง, ์ข ์๋ฐํ ์๋ฉ์ ์ ์๊ฐ ์์ด ๊ฐ์ ๋ฃ๊ณ ๋ ธ์ ์ ํ๊ธฐํ ๋ ๋ฉ์นซํ๋ ์๊ฐ์ด ์๋ค.
Learned
1. SQL๋ก ๊ฐ๊ณตํ๊ธฐ
replace(์ปฌ๋ผ, ๋ฌธ์, ๋ฐ๊พผ ํ ๋ฌธ์) #๋์ฒดํ๋ค
substr(์ปฌ๋ผ, ์์ ์์น, ๊ธ์ ์) #๋ฌธ์์ด์ ์ผ๋ค
concat(๋ถ์ด๊ณ ์ถ์ ๊ฐ1, ๋ถ~๊ฐ2, ๋ถ~๊ฐ3, …) #์ฐ์์ํจ๋ค(concatenate)
์ง๊ด์ ์ด๋ค.
2. ์กฐ๊ฑด๋ฌธ
#if
if(์กฐ๊ฑด, ์กฐ๊ฑด ์ถฉ์กฑo ๊ฐ, ์กฐ๊ฑด ์ถฉ์กฑx ๊ฐ)
#case
case when ์กฐ๊ฑด1 then ๊ฒฐ๊ณผ1
when ์กฐ๊ฑด2 then ๊ฒฐ๊ณผ2
else ๊ทธ ์ธ ๊ฒฐ๊ณผ
end
์ฌ์ ๋ณด์ด์ง๋ง ๋ค์ ์ฝ๋๋ค์ฒ๋ผ ์์ด๊ณ ์์ด๋ฉด ํ๋ ๋๋ ์์ด ํท๊ฐ๋ฆฌ๊ธฐ ์ฝ๋ค.
3. ๋ฏน์ค๋งค์น
โ if๋ฌธ, substr๋ฌธ
SELECT substr(if(email like '%gmail%', replace(email, 'gmail', '@gmail'), email), 10) as "์ด๋ฉ์ผ ๋๋ฉ์ธ",
count(customer_id) "๊ณ ๊ฐ ์",
avg(age) "ํ๊ท ์ฐ๋ น"
# if๋ฌธ : email ์ด gmail์ ํฌํจํ ๋, gmail์ @gmail๋ก ์จ์ค.
# substr๋ฌธ : if๋ฌธ์ด ํด๋น๋๋ ์ปฌ๋ผ์์, 10๋ฒ์งธ ๋ฌธ์๋ถํฐ ์ถ๋ ฅํด์ค.
FROM customers
group by 1
โก if๋ฌธ, ์ฐ์ฐ์
SELECT case when delivery_time >30 then price*0.1*(if(addr like '%์์ธ%', 1.1, 1))
when delivery_time >25 then price*0.05*(if(addr like '%์์ธ%', 1.1, 1))
else 0 end as "๋ฐฐ๋ฌ์์๋ฃ"
# ๋ฐฐ๋ฌ ์๊ฐ์ด 25๋ถ ์ด๊ณผ 30๋ถ ์ดํ๋ฉด, ์์๋ฃ๋ ๊ฐ๊ฒฉ*0.05
# ๋ฐฐ๋ฌ ์๊ฐ์ด 30๋ถ ์ด๊ณผ๋ฉด, ์์๋ฃ๋ ๊ฐ๊ฒฉ*0.1
# ๋จ, ์ง์ญ์ด ์์ธ์ผ ๊ฒฝ์ฐ, ์ถ๊ฐ๋ก ๊ฐ๊ฒฉ*1.1
FROM food_orders
4. (์ฝ๋์นดํ ์ค ์๊ฒ ๋) having
- ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ ์คํธ ์ฐ์ต > GROUP BY > ๋๋ช ๋๋ฌผ ์ ์ฐพ๊ธฐ
- group by ์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ์ง๊ณ ํจ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ ํํฐ๋งํ๋๋ฐ ์ฌ์ฉ๋จ
- where vs having
- where ์ ์ ํ ๋จ์์ ์กฐ๊ฑด์ ํ์ธํ์ฌ ํน์ ํ์ ์ ํ
- having ์ ์ ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ์ ๋ํด ํน์ ์กฐ๊ฑด์ ๊ฑธ๊ณ ์ถ์ ๋ ์ฌ์ฉ
SELECT NAME,
COUNT(NAME) #๊ทธ๋ฃน๋ง๋ค ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋๋ฌผ์ด ๋ช ๋ง๋ฆฌ ์๋์ง ํ์ธ
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME # ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋๋ฌผ๋ค ๋ฌถ๊ธฐ
HAVING COUNT(NAME) >= 2 #COUNT ํจ์๋ก ์ผ ๊ฒฐ๊ณผ์์ ์ด๋ฆ์ด ๋ ๋ฒ ์ด์ ๋ํ๋ ๊ฒฝ์ฐ๋ง ์ ํ
ORDER BY NAME;
5. (์ฝ๋์นดํ ์ค ์๊ฒ ๋) limit
- ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ ์คํธ ์ฐ์ต > SELECT > ์์ n๊ฐ ๋ ์ฝ๋
- ๊ฒฐ๊ณผ ์งํฉ์ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์
- ๋๊ฐ SELECT ๋ฌธ์์ ์ฌ์ฉ๋๋ฉฐ, ๋ฐํ๋๋ ํ์ ์๋ฅผ ์ ํํ๋ ๋ฐ์ ์ฐ์
SELECT name
FROM ANIMAL_INS
ORDER BY datetime limit 1
- ๋๋ ์ฒ์์ ์๋ฌด ์๊ฐ ์์ด where ์ ์ min() ํจ์๋ฅผ ์ผ๋ค.
- min() ํจ์๋ ์๋ธ์ฟผ๋ฆฌ๋ ์กฐ๊ฑด์ ์์ ์ฌ์ฉ.
SELECT name
FROM animal_ins
WHERE min(datetime) #์ค๋ฅ
6. (์ฝ๋์นดํ ์ค ์๊ฒ ๋) ์๋ธ์ฟผ๋ฆฌ
- ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ ์คํธ ์ฐ์ต > SELECT > ์์ n๊ฐ ๋ ์ฝ๋
- ์ฟผ๋ฆฌ ์์ ์ฟผ๋ฆฌ
SELECT name
FROM animal_ins
WHERE datetime = (SELECT MIN(DATETIME) FROM ANIMAL_INS)
Longed for
- ํ์ด์ฌ ์ง๋๋ ํ๋ฑํ๋ฑ ๋๊ฐ๊ณ ์ถ๋ค.