SQL ์๋ฆฌ์ฆ (5์ฅ) ๐ชด
<SQL ์ฒซ๊ฑธ์> ์ ๋ณด๊ณ ์ง์ ํ์ตํ๊ณ ๊ธฐ๋กํ๋ ํฌ์คํธ! ๐ฅ
DATABASE ๋ง์คํฐ๋ฅผ ๊ฟ๊พธ๋ฉฐ...๐ฅ
๐ 5์ฅ ์ง๊ณ์ ์๋ธ์ฟผ๋ฆฌ
๐ 20๊ฐ COUNT๋ก ํ ๊ฐ์ ๊ตฌํ๊ธฐ
- ์ค์ ์ฐ์ต์ ์ํด ์ง๋ ํ๋ก์ ํธ์๋ hoxylush DB๋ฅผ ๊ฐ์ง๊ณ ์ฐ์ต! ๐ฆ
- ๋ํ์ ์ธ ์ง๊ณํจ์๋ 5๊ฐ! COUNT, SUM, AVG, MIN, MAX
- SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ ๋ถ๋ฆฌ๋ '๋ฐ์ดํฐ ์งํฉ'์ ๋ค๋ฃจ๋ ์ธ์ด. ์ด ๊ฐ์ ์งํฉ์ ๊ฐ์๋ ํฉ๊ณ๊ฐ ๊ถ๊ธํ๋ค๋ฉด SQL์ด ์ ๊ณตํ๋ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ๊ฒ ๊ตฌํ ์ ์์!
- COUNT๋ก ํ ๊ฐ์ ๊ตฌํ๊ธฐ
- SQL์ ์งํฉ์ ๋ค๋ฃจ๋ ์ง๊ณํจ์๋ฅผ ์ ๊ณตํจ! -> ์ธ์๋ก '์งํฉ'์ ์ง์ ํจ!
๐ select count(*) from locations; ๐
-> 16๊ฐ์ ํ ๋ฐํ
- ์ง๊ณํจ์์ ํน์ง์ ๋ณต์์ ๊ฐ(์งํฉ)์์ ํ๋์ ๊ฐ์ ๊ณ์ฐํด๋ด๋ ๊ฒ.
- where ๊ตฌ ์ง์ ํ๊ธฐ
๐ select count(*) from locations where name LIKE ='%์ญ%'; ๐
# locations ํ
์ด๋ธ์์ '์ญ'์ด ๋ค์ด๊ฐ์๋ ํ๋ค๋ง ์ถ์ถํด์ ๋ช๊ฐ์ธ์ง ์ธ์ด๋ณด๊ธฐ!
# ์์์ like ๋ฐฐ์ด๊ฑฐ ์์ฉํ๋๋ฐ ใ
ใ
๋๋ฐ์ฐ ์ง์ง ๋์ด..
- ์ง๊ณํจ์์ NULL ๊ฐ
- COUNT์ ์ธ์๋ก ์ด๋ช ์ ์ง์ ํ ์ ์์. ์ด๋ช ์ ์ง์ ํ๋ฉด ๊ทธ ์ด์ ํํด์ ํ์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์์! ํนํ, '*'๋ฅผ ์ธ์๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ COUNT ํจ์ ๋ฟ!
- ์ฌ๊ธฐ์! ๐NULL๊ฐ์ ์ด๋ป๊ฒ ์ทจ๊ธํ ๊ฒ์ธ๊ฐ!!!!๐ En general, SQL์์๋ NULL๊ฐ์ ๊ณ ๋ คํด์ผํจ. ์ง๊ณํจ์๋ ์งํฉ ์์ NULL๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ ์ธํ๊ณ ์ฒ๋ฆฌํจ.
- NULL์ด ์๋ ์ด๋ช
์ ์ธ๊ธํด์ count๋ช
๋ น์ด๋ก ๋ถ๋ฌ๋ด๋ฉด NULL๊ฐ์ ์ ์ธํ๊ณ ๊ณ์ฐ๋จ. ํ์ง๋ง count(*)์ ๊ฒฝ์ฐ ๋ชจ๋ ์ด์ ํ์๋ฅผ ์นด์ดํธํ๊ธฐ ๋๋ฌธ์ NULL๊ฐ์ ์
์ ๋ค์ด๊ฐ๋ค.
- ์๋๋ฉด phone_number์๋ null๊ฐ์ด 19๊ฐ๋ ๋๊ธฐ๋๋ฌธ์ ์ด๊ฑธ ๋ค ์ ํ๊ณ 8๊ฐ๋ง ์นด์ดํธ๋ผ์ ๋์ค๋ ๊ฒ!
- DISTINCT๋ก ์ค๋ณต์ ๊ฑฐ
- ์งํฉ ์์ ์ค๋ณต๋ ๊ฐ์ด ์๋์ง ์ฌ๋ถ๊ฐ ๋ฌธ์ ๋ ๋๋ ์์!
-> ์ด๋ฐ์์ผ๋ก ์ ๋ฆ์ญ์ด ๋๊ฐ๊ฐ ์ค๋ณต๋จ! ๊ทธ๋ด ๋ ์ฌ์ฉํ๋ ๊ฒ์ด DISTINCT! - DISTINCT๋ ์์ฝ์ด๋ก ์ด๋ช ์ด ์๋. select๊ตฌ์์ distinct๋ฅผ ์ง์ ํ๋ฉด ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ฐํ. ์ค๋ณต ์ฌ๋ถ๋ select๊ตฌ์ ์ง์ ๋ ๋ชจ๋ ์ด์ ๋น๊ตํด ํ๋จ!
๐ select all name from locations; ๐
๐ select distinct name from locations; ๐
์ ๊ธฐํด...! ๐ฆ
- ์ง๊ณํจ์์์ DISTINCT
- SQL์์๋ NULL์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ฌด์๋ณด๋ค ์ค์!
- ๊ทธ๋ ๋ค๋ฉด !!! ์ด์์ NULL๊ฐ๋ ์ ์ธํ๊ณ , ์ค๋ณตํ์ง์๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ ์๋ ์์๊น?
-> ์ฐ๋ฆฌ๋ ์ง๊ณํจ์์ ์ธ์๋ก DISTINCT๋ฅผ ์ฌ์ฉํ ์ ์์ด!
๐ select count(all phone_number), count(distinct phone_number) from users; ๐
# count all๋ก phone_number์ null๊ฐ ์ ๊ฑฐ,
# distinct์์ phone_number์ ์ค๋ณต๊ฐ ์ ๊ฑฐ + null ์ ๊ฑฐ!
- ๋ค์ ๋งํด count(all...)์ null๊ฐ๋ง ์ ๊ฑฐํด์ฃผ๊ณ , count(distinct...)๋ ์ค๋ณต๊ฐ์ ๊ฑฐ+null์ ๊ฑฐ๋ผ๋ ๊ฒ !
๐ 21๊ฐ COUNT ์ด์ธ์ ์ง๊ณํจ์
- ์ง๊ณํจ์๋ COUNT๋ง ์๋ ๊ฒ์ด ์๋์ผ! SUM ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํด ์งํฉ์ ํฉ๊ณ์น๋ฅผ ๊ตฌํ ์ ์์!
- ์ต์๊ฐ, ์ต๋๊ฐ์ ์ฐพ๋ ๊ฒฝ์ฐ์๋ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํด ์ฒ๋ฆฌํ ์ ์๋ธ!
- SUM์ผ๋ก ํฉ๊ณ ๊ตฌํ๊ธฐ
๐ select sum*age) from owners; ๐
- SUM ์ง๊ณํจ์์ ์ง์ ๋๋ ์งํฉ์ ์์นํ ๋ฟ! ๋ฌธ์์ดํ์ด๋ ๋ ์ง์๊ฐํ์ ์งํฉ์์๋ ํฉ๊ณ๋ฅผ ๊ตฌํ ์ ์์จ...
- SUM ์ง๊ณํจ์๋ COUNT์ ๋ง์ฐฌ๊ฐ์ง๋ก NULL๊ฐ์ ๋ฌด์ํจ. NULL๊ฐ์ ์ ๊ฑฐํ ๋ค ํฉ๊ณ๋ฅผ ๋.
- AVG๋ก ํ๊ท ๋ด๊ธฐ
- ์๊น ์์์ ๊ตฌํ SUM์ ๊ฐ์๋ก ๋๋๋ฉด ํ๊ท ! -> SUM / COUNT
- ํ์ง๋ง ๊ตณ์ด, sum, count ์ฐ์ง ์๋๋ผ๋ AVG๋ผ๋ ์ง๊ณํจ์๋ฅผ ํตํด ํ๊ท ๊ฐ์ ๊ตฌํ ์ ์์!
๐ select avg(age), sum(age)/count(age) from owners; ๐
- ๊ทผ๋ฐ ๊ฐ๋จํ๊ฒ ์๋ ๊ฒ๋งํด๋ ๋์ด!
- AVG ์ง๊ณํจ์๋ NULL๊ฐ์ ๋ฌด์. ์ฆ, NULL๊ฐ์ ์ ๊ฑฐํ ๋ค ํ๊ท ๊ฐ์ ๊ณ์ฐ.
- NULL์ 0์ผ๋ก ๊ฐ์ฃผํด์ ํ๊ท ์ ๋ด๊ณ ์ถ๋ค๋ฉด case๋ฅผ ์ฌ์ฉํด์ NULL์ 0์ผ๋ก ๋ณํํ ๋ค AVG ์ฌ์ฉํ๊ธฐ!
- MIN, MAX๋ก ์ต์๊ฐ, ์ต๋๊ฐ ๊ตฌํ๊ธฐ
- MIN, MAX๋ ์ง๊ณํจ์! ์ด๋ค ํจ์๋ ๋ฌธ์์ดํ๊ณผ ๋ ์ง์๊ฐํ์๋ ์ฌ์ฉ๊ฐ๋ฅ!
- NULL๊ฐ์ ๋ฌด์ํ๋ ๊ธฐ๋ณธ๊ท์น์ ๋ค๋ฅธ ์ง๊ณํจ์์ ๊ฐ์!
๐ select min(running_time), max(running_time), min(release_date), max(release_date) from movies; ๐
- ์ ๊ธฐํ๋ค! ์ง์ง ๋ ์ง์๊ฐํ์๋ ์ต์๊ฐ, ์ต๋๊ฐ์ ๊ตฌํ ์ ์๋ค๋ ๐ฆ
๐ 22๊ฐ ๊ทธ๋ฃนํ - GROUP BY
- GROUP BY๋ฅผ ์ฌ์ฉํด ๊ทธ๋ฃนํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋ ์๊ฐ ๐ฑ
๐ select * from ํ
์ด๋ธ๋ช
group by ์ด1, ์ด2, ... ๐
- group by๋ก ๊ทธ๋ฃนํ
- ๊ทธ๋ฃน์ผ๋ก ๋๋ ๋ GROUP BY ๊ตฌ๋ฅผ ์ฌ์ฉ!
- tickets table๋ก group์ ๋๋ ๋ด์ผ์ง!
๐ select seat_remain from tickets group by seat_remain; ๐
-
group by ๊ตฌ์ ์ด์ ์ง์ ํ์ฌ ๊ทธ๋ฃนํํ๋ฉด ์ง์ ๋ ์ด์ ๊ฐ์ด ๊ฐ์ ํ์ด ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์! select ๊ตฌ์์ seat_remain ์ด์ ์ง์ ํ์ผ๋ฏ๋ก ๊ทธ๋ฃนํ๋ seat_remain ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๋ ๊ฒ!
-
group by ๋ฅผ ์ง์ ํด ๊ทธ๋ฃนํํ๋ฉด distinct์ ๊ฐ์ด ์ค๋ณต์ ์ ๊ฑฐํ๋ ํจ๊ณผ๊ฐ ์์!
-
๐ ๊ทธ๋ ๋ค๋ฉด! distinct๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ group by๋ก ๊ทธ๋ฃนํํ๋ ๊ฒ์ ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น? ๐
-> group by ๊ตฌ๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ์๋ ์ง๊ณํจ์์ ํจ๊ป ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ณ ์๋ฏธ๊ฐ ์์ด.
-> group by ๊ตฌ๋ก ๊ทธ๋ฃนํ๋ ๊ฐ๊ฐ์ ๊ทธ๋ฃน์ด ํ๋์ ์งํฉ์ผ๋ก์ ์ง๊ณํจ์์ ์ธ์๋ก ๋๊ฒจ์ง๊ธฐ ๋๋ฌธ. -
group by๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ?
-> ์ ํฌ์ ์ผ๋ณ ๋งค์ถ ๋ฐ์ดํฐ๊ฐ ์ค์ ํ๋งค ๊ด๋ฆฌ์์คํ ์ ์ ์ก๋์ด ์ ํฌ๋ณ ๋งค์ถ์ค์ ์ ์ง๊ณํด ์ด๋ค ์ ํฌ๊ฐ ๋งค์ถ์ด ์ฌ๋ผ๊ฐ๋์ง, ์ด๋ค ์ํ์ด ์ธ๊ธฐ๊ฐ ์๋์ง ๋ฑ์ ๋ถ์ํ ๋.
-> ์ฌ๊ธฐ์ ์ ํฌ๋ณ, ์ํ๋ณ, ์๋ณ, ์ผ๋ณ ๋ฑ ํน์ ๋จ์๋ก ์ง๊ณํ ๋ group by๋ฅผ ์์ฃผ ์ฌ์ฉ.
- HAVING ๊ตฌ๋ก ์กฐ๊ฑด ์ง์
- ์ง๊ณํจ์๋ where ๊ตฌ์ ์กฐ๊ฑด์์์๋ ์ฌ์ฉํ ์ ์์.
- seat_remain ์ด์ ๊ทธ๋ฃนํํ์ฌ ํ ๊ฐ์๊ฐ ํ๋๋ง ์กด์ฌํ๋ ๊ทธ๋ฃน์ ๊ฒ์ํ๊ณ ์ถ์์ง๋ง ์๋ฌ๊ฐ ๋ฐ์! ์๋ฌ๊ฐ ๋ฐ์ํ ์ด์ ๋? group by์ where๊ตฌ์ ๋ด๋ถ์ฒ๋ฆฌ ์์์ ๊ด๊ณ๊ฐ ์์!
- ์ฆ, where ๊ตฌ๋ก ํ์ ๊ฒ์ํ๋ ์ฒ๋ฆฌ๊ฐ group by๋ก ๊ทธ๋ฃนํํ๋ ์ฒ๋ฆฌ๋ณด๋ค ์์์ ์์๊ธฐ ๋๋ฌธ! (select ๊ตฌ์์ ์ง์ ํ ๋ณ๋ช ์ where ๊ตฌ์์ ์ฌ์ฉํ ์ ์์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ทธ๋ฃนํ๊ฐ ํ์ํ ์ง๊ณํจ์๋ where ๊ตฌ์์ ์ง์ ํ ์ ์์!)
๐ค ๋ด๋ถ์ฒ๋ฆฌ์์: where๊ตฌ -> group by ๊ตฌ -> select ๊ตฌ -> order by ๊ตฌ
- where ๊ตฌ์์๋ ์ง๊ณํจ์(count, sum, avg, min, max)๋ฅผ ์ฌ์ฉํ ์ ์์!
- ๊ทธ๋ผ ์ง๊ณํ ๊ฒฐ๊ณผ์์ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ ๋ฐ๋ก ๊ฑธ๋ฌ๋ด๋ ค๋ฉด? ๐ฑ HAVING ๊ตฌ๋ฅผ ํ์ฉ! ๐ฑ
- Having๊ตฌ๋ group by ๊ตฌ ๋ค์ ๊ธฐ์ , where ๊ตฌ์ ๋์ผํ๊ฒ ์กฐ๊ฑด์์ ์ง์ ํ ์ ์์.
- ์กฐ๊ฑด์์๋ ๊ทธ๋ฃน๋ณ๋ก ์ง๊ณ๋ ์ด์ ๊ฐ์ด๋ ์ง๊ณํจ์์ ๊ณ์ฐ๊ฒฐ๊ณผ๊ฐ ์ ๋ฌ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋จ.
- ์์ where๊ตฌ์ ๋ฃ์ด์ฃผ์๋ ์กฐ๊ฑด์(์๋ฌ๋ ๊ฒ)์ having ๊ตฌ๋ฅผ ํตํด ๋ฐ๊ฟ๋ณด๊ธฐ!
-> having ๊ตฌ์ ์ง๊ณํจ์๋ฅผ ๋ฃ์ด์ค์ผ๋ก์จ ์ํ๋ ๊ฐ์ ์ถ๋ ฅํ ์ ์์!
๐ค having ๊ตฌ์ ๋ด๋ถ์ฒ๋ฆฌ ์์: where ๊ตฌ -> group by ๊ตฌ -> having ๊ตฌ -> select ๊ตฌ -> order by ๊ตฌ
- select ๊ตฌ๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋๋ฏ๋ก having๊ตฌ์์ ๋ณ๋ช ์ฌ์ฉ ๋ถ๊ฐ.
- ์๋ฅผ ๋ค์ด, count์ total์ด๋ผ๋ ๋ณ๋ช ์ ๋ถ์ด๋ฉด, order by๊ตฌ์์๋ ์ฌ์ฉ๊ฐ๋ฅ, ํ์ง๋ง group by๊ตฌ๋ having ๊ตฌ์์๋ ์ฌ์ฉ ๋ถ๊ฐ.
- ๋ณต์์ด์ ๊ทธ๋ฃนํ
- group by ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ! -> group by์ ์ง์ ํ ์ด ์ด์ธ์ ์ด์ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ ์ฑ select ๊ตฌ์ ๊ธฐ์ ํด์๋ ์๋จ!
- ๋ฌด์จ๋ง์ด๋๋ฉด
~
![](https://media.vlpt.us/images/majaeh43/post/024b6d02-563a-4cae-896d-7f299a0501ed/image.png)
- group by์์ ์ง์ ํ ์ด์ seat_remain์ด๊ณ , ๊ทธ ๋ฐ์ ๋๋จธ์ง ์ด(price, departure_time์ด)์ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ์ง ์์์ผ๋ select ๊ตฌ์ ๊ธฐ์ ํด์๋ ์๋๋ค๋ ๋ง !
- ์๋ ๊ฒ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์งํฉ์ ํ๋์ ๊ฐ์ผ๋ก ๊ณ์ฐ๋๋ฏ๋ก ๊ทธ๋ฃน๋ง๋ค ํ๋์ ํ์ ์ถ๋ ฅ ๊ฐ๋ฅ ! ์ด๋ฐ์์ ์ฟผ๋ฆฌ๋ก๋ ๋ฌธ์ ์์ด ์ถ๋ ฅ ๊ฐ๋ฅ!
-> group by ์์ ์ง์ ํ ์ด ์ด์ธ์ ์ด์ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ ์ฑ select ๊ตฌ์ ์ง์ ํ ์ ์์!
- ์ด๋ ๊ฒ ๋ฏธ๋ฆฌ group by์์ ์ง์ ํ ์ด์ธ ๊ฒฝ์ฐ์๋ select ๊ตฌ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ!
- ๊ฒฐ๊ด๊ฐ ์ ๋ ฌ
- group by๋ก ๊ทธ๋ฃนํํด๋ ์คํ๊ฒฐ๊ณผ ์์๋ฅผ ์ ๋ ฌํ ์๋ ์๋น! -> ์ด๋ด ๋๋ order by ๊ตฌ๋ฅผ ์ฌ์ฉํด ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ ์ ์์! group by ๊ตฌ๋ก ๊ทธ๋ฃนํํ ๊ฒฝ์ฐ์๋ order by ๊ตฌ๋ฅผ ์ฌ์ฉํด ์ ๋ ฌํ ์ ์์!
-> ์๋ ๊ฒ sum(price)๋ก ์ ๋ ฌํด์ฃผ๋ ๊น๋๋ฐ๋ก desc ์ํด์ฃผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ asc!
๐ 23๊ฐ ์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ๋ select ๋ช ๋ น์ ์ํ ๋ฐ์ดํฐ ์ง์๋ก, ์๋ถ๊ฐ ์๋ ํ๋ถ์ ๋ถ์์ ์ธ ์ง์๋ฅผ ์๋ฏธํจ. (๋ฌด์จ์๋ฆฌ์ผ๊นใ ...? ๐)
- ์๋ธ์ฟผ๋ฆฌ๋ SQL ๋ช ๋ น๋ฌธ ์์ ์ง์ ํ๋ ํ๋ถ select ๋ช ๋ น์ผ๋ก ๊ดํธ๋ก ๋ฌถ์ด ์ง์ ํจ!
- ์๋ธ์ฟผ๋ฆฌ๋ SQL ๋ช ๋ น์ WHERE ๊ตฌ์์ ์ฃผ๋ก ์ฌ์ฉ! where ๊ตฌ๋ select, delete, update ๊ตฌ์์ ์ฌ์ฉํ ์ ์๋๋ฐ ์ด๋ค ์ค ์ด๋ค ๋ช ๋ น์์๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์!
- delete์ where๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
- owners table์ผ๋ก ์ฐ์ต~! ๐ฆ
- ์ฒซ๋ฒ์งธ ํ์ ์ญ์ ํด๋ณด์ฅ. ๋๊ฐ๋ด๋ ์ฒซ๋ฒ์งธ ํ์ age๊ฐ ๊ฐ์ฅ ์๋ค.
๐ delete from owners where name = '๋ฐ์ํ'; ๐
- ์ญ์ ์๋ฃ ! ๊ทผ๋ฐ ์์ ๋ฐฉ๋ฒ์ฒ๋ผ age๊ฐ ๊ฐ์ฅ ์์ ํ์ด ์ด๋ค ํ์ธ์ง ์๋๋ ์ด๋ ๊ฒ ๋ฐ๋ก ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ฐ, ๊ทธ๋ ์ง ์์ ๋๋ ์ด๋ป๊ฒ ์ฐพ์์ ์ญ์ ํ ์ ์์๊น?? min์ ์จ์ ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ฐ ํ ๋ฒ ํด๋ณผ๊น...? ๐ฆ
- (๋ฐฉ๊ธ insert into๋ฅผ ํตํด id=4์ธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ์๋น!)์ด์ id=2์ธ ๊ฐ(age๊ฐ ์ต์์ธ ๊ฐ)์ ์ญ์ ํด๋ณผ๊น?
- ์ฌ๊ธฐ์ id=2์ธ ํ์ age ๊ฐ์ด ๊ฐ์ฅ ์ ๋ค. ์ด select ๋ช ๋ น์ delete ๋ช ๋ น์ where ๊ตฌ์์ ์ฌ์ฉํ๋ฉด ํ๋์ delete ๋ช ๋ น์ผ๋ก ์ํ๋ ํ์ ์ญ์ ํ ์ ์์!
๐ delete from owners where age = (select min(age) from owners); ๐
# (select min(age) from owners) ์ด๋ถ๋ถ์ด ์๋ธ์ฟผ๋ฆฌ ํํ.
- ์ด๋ฐ ์ค๋ฅ๊ฐ ๋จ๋๋ฐ! ๊ทธ ์ด์ ๋? ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐฑ์ ํ ๊ฒฝ์ฐ ๋์ผํ ํ ์ด๋ธ์ ์๋ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ผ๋ค..?^^
- ์๋ฌ ๋ฐ์ ์์ํค๊ณ ์คํํ๋ ค๋ฉด ์์ ํ ์ด๋ธ์ ๋ง๋ค๊ณ ์ฒ๋ฆฌํ๋ฉด ๋๋ค๊ณ ํจ !
- ์ค์นผ๋ผ ๊ฐ
- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ ๊ทธ select ๋ช ๋ น์ด ์ด๋ค ๊ฐ์ ๋ฐํํ๋์ง ์ฃผ์ํ ํ์๊ฐ ์์!
- ์ฌ๋ฌ๊ฐ์ง ํจํด ์ค์์๋ ๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ง๊ฐ ์ผ๋ฐ์ ์ธ ์๋ธ์ฟผ๋ฆฌ ํจํด !
1) ํ๋์ ๊ฐ์ ๋ฐํํ๋ ํจํด
๐ select min(running_time) from movies; ๐
2) ๋ณต์์ ํ์ด ๋ฐํ๋์ง๋ง ์ด์ ํ๋์ธ ํจํด
๐ select running_time from movies; ๐
3) ํ๋์ ํ์ด ๋ฐํ๋์ง๋ง ์ด์ด ๋ณต์์ธ ํจํด
๐ select min(release_date), max(running_time) from movies; ๐
4)๋ณต์์ ํ, ๋ณต์์ ์ด์ด ๋ฐํ๋๋ ํจํด
๐ select release_date, running_time from movies; ๐
-> select ๋ช ๋ น์ด ํ๋์ ๊ฐ๋ง ๋ฐํํ๋ ๊ฒ์ '์ค์นผ๋ผ ๊ฐ์ ๋ฐํํ๋ค'๊ณ ํ๋ค!
- ์ค์นผ๋ผ ๊ฐ์ ๋ฐํํ๋ select ๋ช ๋ น์ ํน๋ณ ์ทจ๊ธํ๋ ์ด์ ๋ ์๋ธ์ฟผ๋ฆฌ๋ก์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ธฐ๋๋ฌธ!
- select ๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
- ์์์์ฒ๋ผ where๊ตฌ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํจ. ๊ทธ ๋ฐ์๋ ์๋ธ์ฟผ๋ฆฌ๋ select๊ตฌ, update์ set๊ตฌ ๋ฑ ๋ค์ํ ๊ตฌ ์์์ ์ง์ ๊ฐ๋ฅ.
- select ๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ ๋๋ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๊ฐ ํ์ํจ!
๐ select
(select count(*) from movies) AS sql1,
(select count(*) from actors) AS sql2; ๐
-> ๊ฐ ํ
์ด๋ธ์ ํ ๊ฐ์๋ฅผ ๊ฐ ์๋ธ์ฟผ๋ฆฌ๋ก ๊ตฌํด๋ด.
- ๋งจ ์์ชฝ select ๋ช ๋ น์๋ from ๊ตฌ๊ฐ ์๋ค. MySQL ๋ฑ์์๋ ์ค์ ๋ก FROM ๊ตฌ๋ฅผ ์๋ต๊ฐ๋ฅ.
- SET ๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
- update์ set ๊ตฌ์์๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์! ํ์ง๋ง ๋ณ๋ก ๋ง์ด ์ฐ์ด์ง ์์...^^
- FROM ๊ตฌ์์ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ
- FROM ๊ตฌ์ ํ ์ด๋ธ ์ง์ ๋ง๊ณ ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ ์ ์์! ๊ดํธ๋ก select ๋ช ๋ น์ ๋ฌถ์ผ๋ฉด ๋จ!
- select๊ตฌ๋ set๊ตฌ์์๋ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํด์ผ ํ์ง๋ง from๊ตฌ์ ๊ธฐ์ ํ ๊ฒฝ์ฐ์๋ ์ค์นผ๋ผ ๊ฐ์ ๋ฐํํ์ง ์์๋ ๋จ!
๐ select * from (select * from movies) sq; ๐
- select ๋ช ๋ น ์์ select ๋ช ๋ น์ด ๋ค์ด์๋ ๊ฒ์ฒ๋ผ ๋ณด์. ์ด๊ฑธ '๋ค์คํฐ๋(nested) ๊ตฌ์กฐ', ๋๋ '์ค์ฒฉ๊ตฌ์กฐ'๋ '๋ดํฌ๊ตฌ์กฐ'๋ผ ๋ถ๋ฆใ ! sq๋ ํ ์ด๋ธ์ ๋ณ๋ช ์.
- insert๋ช ๋ น๊ณผ ์๋ธ์ฟผ๋ฆฌ
- insert๋ช ๋ น๊ณผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์กฐํฉํด ์ฌ์ฉ๊ฐ๋ฅ. insert ๋ช ๋ น์๋ values๊ตฌ์ ์ผ๋ถ๋ก ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ values๊ตฌ ๋์ select ๋ช ๋ น์ ์ฌ์ฉํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์.
๐ 24๊ฐ ์๊ด ์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด delete ๋ช ๋ น๊ณผ select ๋ช ๋ น์ ๊ฒฐํฉํ ์ ์์! ์๋ธ์ฟผ๋ฆฌ์ ์ผ์ข ์ธ '์๊ด ์๋ธ์ฟผ๋ฆฌ'๋ฅผ exists ์ ์ด๋ก ์กฐํฉ์์ผ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์...!๐ฆ
- EXISTS ์ ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฐํํ๋ ๊ฒฐ๊ด๊ฐ์ด ์๋์ง๋ฅผ ์กฐ์ฌํ ์ ์์.. EXIST๋ ๋จ์ง ๋ฐํ๋ ํ์ด ์๋์ง๋ฅผ ํ์ธํด๋ณด๊ณ ๊ฐ์ด ์์ผ๋ฉด ์ฐธ, ์์ผ๋ฉด ๊ฑฐ์ง์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๊ผญ ์ค์นผ๋ผ ๊ฐ์ ๋ฐํํ ํ์๋ ์์ !
- EXISTS
- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๊ฒ์ํ ๋ '๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ์๋์ง' ํ๋ณํ๊ธฐ ์ํด ์กฐ๊ฑด์ ์ง์ ํ ์ ์์ !
๐ update movies SET title = '์์' where exists (select * from actors where first_name = '์ '); ๐
-> ^^ ์ ์ด๋ ๊ฒ ๋์์๊น....? ^^ ๋ถ๋ช
'์ '์ด๋ผ๋ ๋จ์ด๊ฐ ์์ผ๋ฉด title์ '์์'์ด๋ผ๊ณ ๋ฐ๊ฟ๋ฌ๋ผ๊ณ ๋ช
๋ น ๋ด๋ฆฐ๊ฑด๋ฐ ๋ค ๋ฐ๋์ด๋ฒ๋ ธ๋ค...?^^
-> actors ํ
์ด๋ธ์ ๋ชจ๋ ์ด ์ค์์, first_name์ด '์ '์ธ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ฉด, movies ํ
์ด๋ธ์ title์ '์์'์ด๋ผ๊ณ ๋ฐ๊ฟ์ค.... ์ด๋์ ์ค๋ฅ๊ฐ ๋ฌ์๊น... ใ
ใ
๋ณด๋ฅ....!
- NOT EXISTS
- '์์'์ ๊ฒฝ์ฐ, ํ์ด ์กด์ฌํ์ง ์๋ ์ํ๊ฐ ์ฐธ์ด ๋๋ฏ๋ก ์ด๋๋ NOT EXISTS๋ฅผ ์ฌ์ฉ.
-> '์ '์ด ์๊ธฐ๋๋ฌธ์ ์ด๋ค ๋ณํ๋ ์ผ์ด๋์ง ์์๋ค๊ณ ํ๋ค...
- ์๊ด ์๋ธ์ฟผ๋ฆฌ
- ์๋ธ์ฟผ๋ฆฌ์๋ ๋ช ๋ น ์์ ์ค์ฒฉ๊ตฌ์กฐ๋ก ๋ select ๋ช ๋ น์ด ์กด์ฌํจ.
๐ update movies SET title = '์์' where exists (select * from actors where first_name = '์ '); ๐
-
์ฌ๊ธฐ์ ๋ณด๋ค์ํผ first_name = '์ '์์ actor ํ ์ด๋ธ์ first_name ์ด๊ฐ์ด ๋ถ๋ชจ์ '์ ' ์ด๊ฐ๊ณผ ์ผ์นํ๋ ํ์ ๊ฒ์ํ๋ ๊ฒ์. ์ด๋ ๊ฒ ๋ถ๋ชจ ๋ช ๋ น๊ณผ ์์์ธ ์๋ธ ์ฟผ๋ฆฌ๊ฐ ํน์ ๊ด๊ณ๋ฅผ ๋งบ๋ ๊ฒ์ '์๊ด ์๋ธ์ฟผ๋ฆฌ'๋ผ ๋ถ๋ฆ
-
ํ ์ด๋ธ๋ช ๋ถ์ด๊ธฐ
๊ทธ๋ ๋ค๋ฉด, ๋ง์ฝ ๋ ์ด์ด ๋ชจ๋ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง๋ค๋ฉด? where first_name = first_name์ด๋ผ๋ฉด?
-> ๊ทธ๋ฌ๋ฉด ์ ๋์ํ์ง ์์ ๊ฒ์. ๊ทธ๋์ ์ฌ๊ธฐ์๋ ์ด์ด ์ด๋ ํ ์ด๋ธ์ ๊ฒ์ธ์ง ๋ช ์์ ์ผ๋ก ๋ํ๋ผ ํ์๊ฐ ์์! ์ด๋ช ์์ โฃ๏ธ'ํ ์ด๋ธ๋ช .'โฃ๏ธ์ ๋ถ์ด๊ธฐ๋ง ํ๋ฉด ๋จ!
- IN
- ์ค์นผ๋ผ ๊ฐ๋ผ๋ฆฌ ๋น๊ตํ ๋๋ '=' ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ. ๋ค๋ง ์งํฉ์ ๋น๊ตํ ๋๋ ์ฌ์ฉ ๋ชปํด!
- IN์ ์ฌ์ฉํ๋ฉด ์งํฉ ์์ ๊ฐ์ด ์กด์ฌํ๋์ง ์กฐ์ฌํ ์ ์์!
๐ ์ด๋ช
IN (์งํฉ) ๐
๐ where no = 3 or no = 5; ๐
- IN๊ณผ NULL
์ง๊ณํจ์์์๋ ์งํฉ ์์ NULL ๊ฐ์ ๋ฌด์ํ๊ณ ์ฒ๋ฆฌํ์. ํ์ง๋ง IN์์๋ ์งํฉ์์ NULL๊ฐ์ ๋ฌด์ํ์ง ์์~! ์ค์ํ๊ฑด NULL์ ๋น๊ตํ๋ ค๋ฉด IS NULL์ ์ฌ์ฉํด์ผํจ! ๋ํ, NOT IN์ ๊ฒฝ์ฐ, ์งํฉ ์์ NULL๊ฐ์ด ์์ผ๋ฉด ์ผ์ชฝ ๊ฐ์ด ์งํฉ ์์ ํฌํจ๋์ด ์์ง ์์๋ ์ฐธ์ ๋ฐํํ์ง ์์!
๐ฉ 5์ฅ ์ง๊ณ ํจ์๊น์ง๋ ๊ด์ฐฎ์๋๋ฐ ์ผ๊ธ์ผ๊ธ ์ด๋ ต๊ณ ํท๊ฐ๋ฆฌ๋ ๊ฒ๋ค์ด ์๊ธด๋ค. distinct ๋ผ๋๊ฐ having...^^ ์ค์นผ๋ผ ๋ค์ด๊ฐ๋ฉด์๋ถํฐ ๋๋ฎค ๋ฉ๋ถ.. ์ฐ์ต ๋ ํด์ผ์ง ใ ใ ์์ ์ต์ ๋๊น์ง! ํ์ด๋ต...! ๐ฉ
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(SQL ์๋ฆฌ์ฆ (5์ฅ) ๐ชด), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@majaeh43/SQL-์๋ฆฌ์ฆ-5์ฅ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค