-
[SQL] ์ง๊ณ ํจ์๋ฅผ ์ฐ๊ธฐ ์ด๋ ค์ธ ๋ over()์ ์๋ธ ์ฟผ๋ฆฌ ์ค ๋ญ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?Computer Science/Database 2023. 10. 13. 17:52728x90
๐์์
MySQL์์ world database๋ฅผ ์ฌ์ฉํด ์ฟผ๋ฆฌ๋ฅผ ๋ฑ๋ ๊ฑฐ๋ฆฌ๋ ์ค ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์์๋ค.
์ด๋ค ๋ฐ์ดํฐ์ ๋ํ ์กฐํ๋ฅผ ํด์ผํ ๋ ๊ฐ ํํ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ฉด์ ํํ์ด ์ํ ๊ทธ๋ฃน์ ํ๊ท ๊ฐ์ ํ์ธํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์๋๋ฐ (์๋ฅผ ๋ค์๋ฉด ์ ์ฒด ํ์์ ์กฐํํ ๋ ํ์์ด ์ํ ๋ฐ์ ํ๊ท ํค๋ฅผ ํจ๊ป ์กฐํํ๊ณ ์ถ์ ๊ฒฝ์ฐ...)
์ฌ๊ธฐ์ over์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์๊ฒ๋ ์ ์ ์์ฑํด๋ณด๋ ค๊ณ ํ๋ค.
๐งฉ ์๋ธ ์ฟผ๋ฆฌ์ OVER()
- ๋ณธ๋ฌธ์ ๋ค์ด๊ฐ๊ธฐ ์ ์๋ธ ์ฟผ๋ฆฌ์ OVER() ๊ฐ ๋ฌด์์ธ์ง ์์๋ณด์
์๋ธ ์ฟผ๋ฆฌ
- ์๋ธ ์ฟผ๋ฆฌ๋ SQL ์ฟผ๋ฆฌ ๋ด์์ ๋ค๋ฅธ SQL ์ฟผ๋ฆฌ์ ์ผ๋ถ๋ก ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ์ด๋ค.
- ์ฆ, ํ๋์ ์ฟผ๋ฆฌ ์์ ๋ค๋ฅธ SQL ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋๋ ๊ฒ!
์๋ฅผ ๋ค์ด, ๋์ ํ ์ด๋ธ์์ ์ ์ฒด ์ธ๊ตฌ ํ๊ท ์ด์์ ๋์๋ฅผ ์กฐํํ๋ ๊ตฌ๋ฌธ์ด๋ค.
SELECT name, population FROM city WHERE population > ( SELECT AVG(population) FROM city );
์ด์ฒ๋ผ where ์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋์ด ์๋ธ ์ฟผ๋ฆฌ์์ ์ ์ฒด ์ธ๊ตฌ์ ํ๊ท ์ ๋ฐํํ๋๋ก ํ๋ค.
์ด๋ ๊ฒ ์๋ธ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ด์ ๋ค์ ์์น์์ ์ฌ์ฉ๋ ์ ์๋ค.
- WHERE ์
- ์์์ ๋ดค๋ ์์์ฒ๋ผ where ์ ๋ด์์ ๋ฉ์ธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋ง ํ๋๋ฐ ์ฌ์ฉ๋๋ค.
- FROM ์
- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ JOINํ๊ฑฐ๋ ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ ํจ๊ป ์ฟผ๋ฆฌํ ์ ์๋ค.
- SELECT ์
- ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ์ธ ์ฟผ๋ฆฌ์ SELECT ์ ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ํ์ํ ์ ์๋ค.
- HAVING ์
- GROUP BY์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๋๋ฐ ์ฌ์ฉ๋ ์ ์๋ค.
์๋ธ ์ฟผ๋ฆฌ์ ๋ชฉ์
- ๋ฐ์ดํฐ ํํฐ๋ง
- ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ค.
- ๋ฐ์ดํฐ ๊ฒ์
- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ค๋ฅธ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค.
- ๋ฐ์ดํฐ ์ง๊ณ
- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์์ ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฝ๋ ์ ๋ณด๋ฅผ ์ป๋๋ค.
OVER() ํจ์
- SQL์ ์๋์ฐ ํจ์์ ํจ๊ป ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ์ด๋ค.
- ์๋์ฐ ํจ์๋ ๋ฐ์ดํฐ ์ง๊ณ ๋ฐ ๋ถ์ ์์ ์ ์ํํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ,
- ๋ฐ์ดํฐ ์งํฉ์ ์ฌ๋ฌ ๋ถ๋ถ( ์ฐฝ ๋๋ ์๋์ฐ)์ผ๋ก ๋๋์ด ๊ฐ ๋ถ๋ถ์ ๋ํ ๊ณ์ฐ์ ์ํํ๋ค.
- OVER() ๊ตฌ๋ฌธ์ ์๋์ฐ ํจ์์ ํํฐ์ ๋ ๋ฐ ์ ๋ ฌ(์ ๋ ฌ ์์)์ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ค.
<์๋์ฐ ํจ์>() OVER ( [PARTITION BY <ํํฐ์ ์ด ๋ชฉ๋ก>] [ORDER BY <์ ๋ ฌ ์ด ๋ชฉ๋ก>] [<๊ธฐํ ์ต์ >] )
- ์๋์ฐ ํจ์
- count, sum, avg, row_number ๋ฑ๊ณผ ๊ฐ์ ์๋์ฐ ํจ์
- partition by
- ๋ฐ์ดํฐ๋ฅผ ํํฐ์ ์ผ๋ก ๋๋๊ธฐ ์ํ ์ด ๋ชฉ๋ก
- ๋์ผํ ํํฐ์ ๋ด์์ ์๋์ฐ ํจ์ ์๋
- order by
- ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๊ธฐ ์ํ ์ด ๋ชฉ๋ก
- ์ ๋ ฌ ์์
- ๊ธฐํ์ต์
- ํ์์ ๋ฐ๋ผ ์ถ๊ฐ ์ต์ ์ง์
์๋ฅผ ๋ค์ด ๋์ ์ธ๊ตฌ์ ํ๊ท ๊ณผ ๊ฐ ๋์๋ฅผ ๋น๊ตํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด๋ณด์
SELECT name, population, AVG(population) OVER () AS global_avg_population FROM city;
- OVER()๋ฅผ ํตํด ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ง๊ณํ ์ ์๋ค.
๐งฉ ์๋ธ ์ฟผ๋ฆฌ VS OVER()
๋ฌธ์
MySQL์์ ์ ๊ณตํ๋ World DB์์ country์์ ๊ตญ๊ฐ๋ณ๋ก gnp์ ํจ๊ป ์ ์ธ๊ณ ํ๊ท , ๋๋ฅ๋ณ ํ๊ท ์ ํจ๊ป ์กฐํํด๋ผ!
์๋ธ ์ฟผ๋ฆฌ ์ฌ์ฉ
select continent, name, gnp, ( select avg(gnp) from country p ) as "์ ์ธ๊ณ ํ๊ท ", ( select avg(gnp) from country p where c.continent = p.continent ) as "๋๋ฅ ํ๊ท " from country c order by continent;
OVER() ์ฌ์ฉ
use world; select continent, name, gnp, avg(gnp) over() '์ ์ธ๊ณ ํ๊ท ', avg(gnp) over( partition by continent ) '๋๋ฅ๋ณ ํ๊ท ' from country;
ํ๋กํ์ผ๋ง์ ํตํ ์ฒ๋ฆฌ ์๋ ํ์ธ
ํ๋กํ์ผ๋ง ์ค์ ํ์ธ
SET profiling = 1; -- ํ๋กํ์ผ๋ง ํ์ฑํ -- ์ฌ๊ธฐ์ ์ํํ๋ ค๋ ์ฟผ๋ฆฌ ์์ฑ SHOW PROFILES; -- ์คํ ์ค์ธ ํ๋กํ์ผ๋ง ํ๋ก์ธ์ค ๋ชฉ๋ก ํ์ธ -- ์คํ ์ค์ธ ํ๋กํ์ผ๋ง ํ๋ก์ธ์ค ID๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์ ๋ณด ํ์ธ SHOW PROFILE FOR QUERY query_id;
์ฒ๋ฆฌ ์๋
- 2๋ฒ์ ์๋ธ ์ฟผ๋ฆฌ ์ฌ์ฉํ ์ฟผ๋ฆฌ ์คํ
- 3๋ฒ์ OVER() ์ฌ์ฉํ ์ฟผ๋ฆฌ ์คํ
์ OVER()๋ฅผ ์ฌ์ฉํ์ ๋ ๋ ๋น ๋ฅผ๊น?
- OVER ํจ์๋ ์๋์ฐ ํจ์๋ฅผ ํ์ฉํด์ ํ๋ฒ์ ์ฟผ๋ฆฌ ์คํ์ผ๋ก ํ๊ท ์ ๊ณ์ฐํ๋ค.
- ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ ๊ฐ ํ์ ๋ํด ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ์กฐํ๋ ํํ์ ๊ฐ์๋งํผ ์คํ๋๋ค.
- OVER(partition by)๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ partition์ ๋ฐ๋ผ ์ง๊ณํ์ฌ ํ๊ท ์ ๊ณ์ฐํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ณด๋ค ๋น ๋ฅด๋ค
๐ ๊ฒฐ๋ก
- ์ง๊ณ์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ํ์ํ ๋๋ ์ต๋ํ OVER์ ์๋์ํจ์๋ฅผ ํ์ฉํ์!
728x90'Computer Science > Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kafka] ์ํ์น ์นดํ์นด(Apache Kafka)์ ๋ํด์ (1) 2023.12.20 [๋ฉ์์ง ํ] ๋ฉ์์ง ํ์ ๋ํด์ (๋ฉ์์ง ํ, MOM, ํน์ง, ์ด์ ๋ฑ) (0) 2023.12.10 [Redis] Redis์ ๋ํด์ (Redis๋, ํน์ง, ์์์ฑ, ์๋ฃ๊ตฌ์กฐ, ์ํคํ ์ฒ) (0) 2023.12.10 [SQL] JOIN ์ ๋ฆฌ (0) 2022.07.14 [SQL] DML (0) 2022.07.14