[D+3] ์์ ๋ณด๋ค ์ฌ์ด SQL(3) - ๋ฐ์ดํฐ ํธ์ง/๊ฐ๊ณต, ์กฐ๊ฑด๋ฌธ (REPLACE, SUBSTRING, CONCAT, IF, CASE)
โ๏ธSTUDY INDEX
1. SQL ๋ฐ์ดํฐ ํธ์ง/๊ฐ๊ณต (replace, substring, concat)
2. ์กฐ๊ฑด๋ฌธ (if ์กฐ๊ฑด, ์กฐ๊ฑด์ ์ถฉ์กฑํ ๋, ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ๋ชปํ ๋)
3. ๋ค์ค ์กฐ๊ฑด๋ฌธ (case when ~ then, else ~ end)
4. select ๋ฌธ์์ ์์ฃผ ๋ฐ์ํ๋ ์ค๋ฅ ํด๊ฒฐ๋ฒ
1. SQL ๋ฐ์ดํฐ ํธ์ง/๊ฐ๊ณต (replace, substring, concat)
SQL์์ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ๋ฐ์ดํฐ๋ก ๊ต์ฒด(replace)ํ๊ฑฐ๋
ํ์ํ ๋ฐ์ดํฐ๋ง ์๋ผ(substring) ์ํ๋ ํํ๋ก ๊ฐ๊ณต(concat) ํ๋ ํจ์๋ฅผ ์๋ ค ๋๋ฆด๊ฒ์.
ํจ์๋ช ๊ณผ ์ฌ์ฉ๋ฒ | ์๋ฏธ | ์์ |
replace (๋ฐ๊ฟ ์ปฌ๋ผ, ํ์ฌ ๊ฐ, ๋ฐ๊ฟ ๊ฐ) | ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ | #์์ผ๊ตฌ๋ฅผ ์ํ๊ตฌ๋ก ๋ณ๊ฒฝ select replace (addr, '์์ผ๊ตฌ', '์ํ๊ตฌ') from customers where addr like '%์์ผ๊ตฌ%' |
substr (์กฐํ ์ปฌ๋ผ, ์์ ์์น, ๊ธ์ ์) | ์ํ๋ ๋ฌธ์๋ง ๋จ๊ธฐ๊ธฐ ๋๋ ํ์ ์๋ ๋ฌธ์ ์๋ฅด๊ธฐ |
#์ฃผ์ ์ ์ฒด๊ฐ ์๋ ์๋๋ง ๋์ค๊ฒ ์์ select substr(addr, 1, 2) "์๋" from customers where addr like '%์์ธํน๋ณ์%' |
concat (๋ถ์ด๊ณ ์ถ์ ๊ฐ1, 2, 3 ...) | ์ฌ๋ฌ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ํฉ์น๊ธฐ | #์์ธ์ ์์์ ๋ช
์ '[์์ธ] ์์์ ๋ช
'์ผ๋ก select concat (' [ ', substr(addr, 1, 2) ,' ] ', restaurant_name) as '๋ฐ๋ ์์์ ๋ช ' from food_orders where addr like '%์์ธ%' |
* concat์๋ ์ปฌ๋ผ, ๋ฌธ์, ์ซ์, ํน์ ๋ฌธ์๋ฅผ ๋ถ์ผ ์ ์์ด์.
* %๋ 0๊ฐ ์ด์์ ์์์ ๋ฌธ์์ด์ ๋ํ๋ด์.
๊ทธ๋์ ์ฐพ๊ณ ์ ํ๋ ๋ฌธ์์ ์๋ค์ ๋ถ์ด๋ฉด, %์์ผ๊ตฌ%๋ฅผ ํฌํจํ ๋ชจ๋ ์ฃผ์๋ฅผ ์ฐพ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋ฉ๋๋ค.
2. ์กฐ๊ฑด๋ฌธ (if ์กฐ๊ฑด, ์กฐ๊ฑด์ ์ถฉ์กฑํ ๋, ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ๋ชปํ ๋)
์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ํฌ๋งท์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ ์ ํฉ๋๋ค.
๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ๋ฐฉ๋ฒ์ IF ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฏธ ์ธ๋ฑ์ค ์ด๋ฆ์์ ์ฌ์ฉ๋ฒ์ด ์์ฑ๋์ด ์์ด์, ๊ฐ์ธ์ ์ผ๋ก ์ด๋ ค์ ๋ ์ค์ต ์์ ๊ฐ์ ธ์์ต๋๋ค.
์ฌ๋ฏธ์๋ ์ ์ IF ๋ฌธ์ด ๋จ๋ ์ผ๋ก ๋์ค๊ธฐ๋ ํ๊ณ ,
๋ค๋ฅธ ํจ์ ์์ ๋ค์ด๊ฐ์๋ ์ธ ์ ์๋ค๋ ์ ์ด์์ต๋๋ค.
์๋ ์ค์ต์ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์ง๊ธฐ ๋ณด๋ค๋ ๋ฌธ๋ฒ์ ์ดํดํ๊ณ ๋์ด๊ฐ๋ ์ฉ์ผ๋ก๋ง ์๊ฐํ๋ฉด ์ข์ ๋ฏํฉ๋๋ค.
์๋๋ฉด ์์ง SQL 3์ผ ์ฐจ์ธ ์ ์๊ฒ ์กฐ๊ธ ์ด๋ ต๊ทธ๋ฑ์ ... ๐๐
์ธ์ ๊ฐ ๋ช ์ญ ์ค์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ ์ง๋ณด๊ฒ ์ต๋๋ค.
#์๋ชป๋ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์์ ํ์ฌ, ๋๋ฉ์ธ ๋ณ ๊ณ ๊ฐ์ ์์ ํ๊ท ์ฐ๋ น์ ๊ตฌํ๋ ์ค์ต
select substring(if(email like '%gmail%', replace(email, 'gmail', '@gmail'), email), 10) "๋๋ฉ์ธ",
count(customer_id) "๊ณ ๊ฐ ์",
avg(age) "ํ๊ท ์ฐ๋ น"
from customers
group by 1
3. ๋ค์ค ์กฐ๊ฑด๋ฌธ (case when ~ then, else ~ end)
์์๋ง ๋ด๋ ์ฌ๋ฌ ํจ์๊ฐ ๊ฒน์ณ์ง๋ฉด ๋ฒ์จ ๋ณต์กํด ๋ณด์ด์ฃ ?
์ฌ๋ฌ ๋ฒ์ IF ๋ฌธ์ ์์ฑํ ํ์ ์์ด 2๊ฐ ์ด์์ ์กฐ๊ฑด์ ์ง์ ํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก Case ๋ฌธ์ ๋๋ค!
๋ง์น 2์ผ ์ฐจ์ group by๋ฅผ ์๊ฒ ๋์์ ๋์ ๊ฐ์ ๊ธฐ์จ์ ๋๋ค๐
์๋ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ๊ฐ๋จํ ์ ์ฉ ์์ ์๊ฐ๋๋ฆฝ๋๋ค.
#CASE๋ฌธ ์ฌ์ฉ ๋ฐฉ๋ฒ
case when ์กฐ๊ฑด1 then ๊ฐ(์์)1
when ์กฐ๊ฑด2 then ๊ฐ(์์)2
else ๊ฐ(์์)3
end
#์ฐ๋ น๋๋ณ๋ก ๊ณ ๊ฐ ๋ถ๋ฅ ๋ง๋ค๊ธฐ
SELECT name,
gender,
age,
case when age >= 40 then '40๋ ์ด์'
when age between 30 and 39 then '30๋'
when age between 20 and 29 then '20๋'
when age between 10 and 19 then '10๋'
when age between 0 and 9 then '10๋ ๋ฏธ๋ง' end '์ฐ๋ น๋'
FROM customers
4. SELECT ๋ฌธ์์ ์์ฃผ ๋ฐ์ํ๋ ์ค๋ฅ ํด๊ฒฐ๋ฒ
๋ง์ง๋ง์ผ๋ก select ๋ฌธ์์ ์์์ ์ด๋ณด๊ฐ ๊ฒช์ด ์ฌ์ด ์ค๋ฅ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๊ฐํด๋๋ฆฝ๋๋ค.
์ด๊ฑด 100% ์ ๊ฒฝํ์์ ๋์จ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ ์ ๊ฐ์ ์์ค์ ๊ฐ๊ณ ๊ณ์ ๋ถ๊ป์๋ ๋ง์ด ๊ณต๊ฐํ์ค ๊ฑฐ๋ผ ์๊ฐํด์ ใ ใ
- select ์ ์ปฌ๋ผ & ํจ์ ๋ค์ , ์ฝค๋ง๋ฅผ ์ฐ์ง ์์์ ๋
ํจ์๋ ์คํ๊ฐ ์๋ ๊ฒ ๊ฐ์๋ฐ ๋์ฒด ์!! ์ค๋ฅ๊ฐ ๋๋์ง ๊ถ๊ธํ๋ค๋ฉด ์ฝค๋ง๋ฅผ ํ์ธํด ๋ณด์ธ์. - table์ ์๋ ์ปฌ๋ผ์ select ๋ฌธ์ ๋ถ๋ ์ ๋
๊ฐ๋ from ํ ์ด๋ธ์ ์๋ ์ปฌ๋ผ์ ๊ฐ์ ธ์ฌ ๋๊ฐ ์๋๋ฐ, ์ด๋ฌ๋ฉด ์ค๋ฅ ๋ฉ๋๋ค!
์ ๋ ํ์ฌ ์๋ธ ์ฟผ๋ฆฌ ๊ฐ๋ ์ ๋ํด ๋ฐฐ์ฐ๊ณ ์๋๋ฐ, ์ฟผ๋ฆฌ ์์ ์ฟผ๋ฆฌ๋ฅผ ์ง๋ค ๋ณด๋ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋๋๋ผ๊ณ ์. - ์ปฌ๋ผ ํน์ ํจ์ ๋ฑ์ ์คํ๊ฐ ์์ ๋
๊ทธ๋ฆฌ๊ณ ์ ๋ด์ฉ์ ํ์ธํ๋๋ฐ๋ ์คํ๋ฅผ ์ง์ง ๋ชจ๋ฅด๊ฒ ๊ฑฐ๋ ๋น ๋ฅธ ๋๋ฒ๊น ์ ์ํ์๋ ๋ถ๋ค์
์๋ฌป๋ฐ ChatGPTํํ ๋ฌผ์ด๋ณด๋๊ฒ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ์ ํํฉ๋๋ค ใ ใ ์ ๋ ํ ๋ฉ์ดํธ์ด์ ์ ์ผ ์น์ ํ ์ ์๋์ ๋๋ค!
๋ํ๊ต ๊ต์ ์์ ์ ๋ฃ๋ ์์ ์ Chat GPT๊ฐ ์์ด ํ์ด์ฌ์ ์ค๋ ํฌ๊ธฐํ๋ ๊ธฐ์ต์ด ๋๋ค์.
๋ง์ฝ ๊ทธ๋ ์ด ์น๊ตฌ๊ฐ ์์๋ค๋ฉด, ์ข ๋ ์์ํ๊ฒ ์ธ์ด๋ฅผ ๋ฐฐ์ธ ์ ์์ง ์์์๊น ์๊ฐํด์!
์ค๋์ ๊ณต๋ถ๋ ์ฌ๊ธฐ๊น์ง์ ๋๋ค.
์์ง SQL์ ์์ํ ์ง๋ 3์ผ๋ฐ์ ๋์ง ์์์ง๋ง
์ผ๋ฅธ ์ ๋ฐฐ์์ ์๋ฏธ ์๋ ๋ฐ์ดํฐ ๋ถ์์ ํด๋ณด๊ณ ์ถ์ด์.
์์ฌ์ ๋นํด ๋๋ฌด ๊ท์ฝ๊ณ ํ์ ํ ์์ค์ ๊ฐ๊ณ ์์ง๋ง,
์ฌํด 9์ ์์ ๋ฐ์ดํฐ ๋ถ์ & ์๊ฐํ๊น์ง ๋ง์คํฐํ ๊ฑฐ์์๐