๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
DB

๋ฐ์ดํ„ฐ ๋ถ„์„ํ•จ์ˆ˜ (์ง‘๊ณ„ํ•จ์ˆ˜, ๊ทธ๋ฃนํ•จ์ˆ˜, ์œˆ๋„์šฐํ•จ์ˆ˜)

by ๐Ÿ’œautumn 2020. 9. 8.

* SELECT๋ฌธ ํ•ด์„ ์ˆœ์„œ

   - GROUP BY๊ตฌ๋ฌธ์€ NULL ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ROW๋Š” ์ œ์™ธํ•˜๊ณ  ์‚ฐ์ถœ, WHERE์ ˆ ๋จผ์ € ์ˆ˜ํ–‰ ํ›„ ์‹คํ–‰ (๊ทธ๋ฃน๋ณ„ ์ง‘๊ณ„)

      : ๋˜ํ•œ GROUP BY ๋’ค์— ์˜ค๋Š” ์†์„ฑ๋ช…์€ ๋ฐ˜๋“œ์‹œ SELECT๋ฌธ์˜ ์ฐพ๋Š” ์†์„ฑ ์ค‘์— ์กด์žฌํ•ด์•ผํ•จ.

      : ์œˆ๋„์šฐํ•จ์ˆ˜์™€ ์ ˆ๋Œ€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

  - HAVING ๊ตฌ๋ฌธ์€ GROUP BY์— ๋Œ€ํ•œ ์กฐ๊ฑด์‹์„ ์„œ์ˆ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ

 

* ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ•จ์ˆ˜๋ž€?

  : ์ดํ•ฉ, ํ‰๊ท  ๋“ฑ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•ด ๋ณต์ˆ˜ํ–‰ ๊ธฐ์ค€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜

  : ๋ณต์ˆ˜ํ–‰์„ ๊ทธ๋ฃน๋ณ„๋กœ ๋ฌถ์–ด ๊ทธ๋ฃน๋‹น ๋‹จ์ผ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ

 

1. ์ง‘๊ณ„ํ•จ์ˆ˜(Aggragate Function)

   : ์—ฌ๋Ÿฌ ํ–‰ ๋˜๋Š” ํ…Œ์ด๋ธ” ์ „์ฒด ํ–‰์œผ๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜

   : NULL๊ฐ’์€ ์ œ์™ธํ•˜๊ณ  ์ง‘๊ณ„

์ง‘๊ณ„ํ•จ์ˆ˜ : (์ปฌ๋Ÿผ๋ช…)๊ธฐ์ž… ์„ค๋ช…
COUNT(*) ๋ณต์ˆ˜ ํ–‰์˜ ROW ๊ฐœ์ˆ˜
SUM(*) ๋ณต์ˆ˜ ํ–‰์˜ ํ•ด๋‹น ์ปฌ๋Ÿผ๊ฐ„ ํ•ฉ๊ณ„
AVG(*) ๋ณต์ˆ˜ ํ–‰์˜ ํ•ด๋‹น ์ปฌ๋Ÿผ๊ฐ„ ํ‰๊ท 
MAX(*) ๋ณต์ˆ˜ ํ–‰์˜ ํ•ด๋‹น ์ปฌ๋Ÿผ๊ฐ„ ์ตœ๋Œ€๊ฐ’
MIN(*) ๋ณต์ˆ˜ ํ–‰์˜ ํ•ด๋‹น ์ปฌ๋Ÿผ๊ฐ„ ์ตœ์†Œ๊ฐ’
STDDEV(*) ๋ณต์ˆ˜ ํ–‰์˜ ํ•ด๋‹น ์ปฌ๋Ÿผ๊ฐ„ ํ‘œ์ค€ํŽธ์ฐจ
VARIAN(*) ๋ณต์ˆ˜ ํ–‰์˜ ํ•ด๋‹น ์ปฌ๋Ÿผ๊ฐ„ ๋ถ„์‚ฐ

 

2. ๊ทธ๋ฃนํ•จ์ˆ˜(Group Function)

   : ๊ทธ๋ฃน๋ณ„ ์†Œ๊ณ„ ๋ฐ ์ค‘๊ณ„ ๋“ฑ ์ค‘๊ฐ„ ํ•ฉ๊ณ„ ๋ถ„์„ ๋ฐ์ดํ„ฐ ์‚ฐ์ถœ

   : GROUP BY ์ ˆ ํ•„์ˆ˜ & GROUP BY ์ ˆ ๋’ค์— ์œ„์น˜ โ‡จ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์ปฌ๋Ÿผ๊ฐ’์— ๋”ฐ๋ผ ๊ทธ๋ฃนํ™” ํ•˜์—ฌ ๊ทธ๋ฃน๋ณ„๋กœ ์ถœ๋ ฅ

   : SELECT ๋ฌธ ๋’ค์— ๋‚˜์˜ค๋Š” ์ปฌ๋Ÿผ๋ช…์€ ๋ฐ˜๋“œ์‹œ GROUP BY(์ง‘๊ณ„๋Œ€์ƒ์•„๋‹Œ๊ฒฝ์šฐ) ๋˜๋Š” ๊ทธ๋ฃนํ•จ์ˆ˜ ๋’ค(์ง‘๊ณ„๋Œ€์ƒ)์— ํฌํ•จ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

      โžก๏ธŽ ๋‹จ์ˆœ ์ปฌ๋Ÿผ๋ช…๋งŒ! ์ง‘๊ณ„ํ•จ์ˆ˜ ๋“ฑ์€ ๋ฏธํฌํ•จ!

ROLLUP ์ปฌ๋Ÿผ ๊ฐ„ ์ˆœ์„œ์— ๋”ฐ๋ผ
๋‹ค๋ฅธ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
 ์ฃผ์–ด์ง„ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃน๋ณ„ ์†Œ๊ณ„ ๊ตฌํ•จ
CUBE  ์ฃผ์–ด์ง„ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“  ์กฐํ•ฉ์˜ ๊ทธ๋ฃน๋ณ„ ์†Œ๊ณ„๋ฅผ ๊ตฌํ•จ
GROUPING SETS ์ปฌ๋Ÿผ ๊ฐ„ ์ˆœ์„œ์™€
๋ฌด๊ด€ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
์ฃผ์–ด์ง„ ์ปฌ๋Ÿผ๋“ค์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์†Œ๊ณ„ ์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
-- ๋ถ€์„œ๋ณ„-์ง์œ„๋ณ„ ๊ทธ๋ฃนํ•‘ > ์†Œ๊ณ„๋Š” ๋ถ€์„œ๋ณ„๋กœ ์ด๊ณ„ ํ›„ ์ „์ฒดํ•ฉ๊ณ„
SELECT DEPT, JOB SUM(SALRARY) FROM DEPT_SAL
	GROUP BY ROLLUP(DEPT, JOB)
-- ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์˜ ์กฐํ•ฉ์— ๋Œ€ํ•œ ์ง‘๊ณ„
-- ์ฆ‰ : ๋ถ€์„œ๋ฉธ, ์ง๊ธ‰๋ณ„, ๋ถ€์„œ-์ง๊ธ‰๋ณ„ ๋ชจ๋“  ์ง‘๊ณ„ ์‚ฐ์ถœ
SELECT DEPT,JOB,SUM(SALARY) FROM DEPT_SAL
	FROM EMP
    GROUP BY CUBE(DEPT,JOB);
-- ์ปฌ๋Ÿผ๋ณ„ ๊ฐœ๋ณ„์ง‘๊ณ„ : ๋ถ€์„œ๋ณ„๋กœ ์ง๊ธ‰๋ณ„๋กœ ๋ˆ„์ ํ•ฉ๊ณ„๊ฐ€ ์•„๋‹Œ ~๋ณ„. 
SELECT DEPT,JOB,SUM(SALARY)
	FROM DEPT_SAL
    GROUP BY GROUPING SETS(DEPT,JOB);

 

3. ์œˆ๋„์šฐํ•จ์ˆ˜(Window Function) 

   : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์˜จ๋ผ์ธ ๋ถ„์„์ฒ˜๋ฆฌ ์šฉ๋„ โžก๏ธŽ OLAP(Online Analytical Processing)ํ•จ์ˆ˜

   : GROUP BY์ ˆ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ โžก๏ธŽ PARTITION BY๋กœ ๊ตฌ๊ฐ„ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ

   : PARTITION BY๋Š” GROUP BY์™€ ๊ฐ™์€ ์ง‘์•ฝ๊ธฐ๋Šฅ์ด ์—†๊ธฐ๋•Œ๋ฌธ์— ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค์ง€ ์•Š์Œ. ๊ทธ์ € ํ•จ์ˆ˜ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ๋ฌถ๋Š” ์—ญํ• 

   : ์œˆ๋„์šฐ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ OVER๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ

SELECT ํ•จ์ˆ˜๋ช…(ํŒŒ๋ผ๋ฏธํ„ฐ)
	OVER ([PARTITION BY ์ปฌ๋Ÿผ, .. ]) 
	[ORDER BY ์ปฌ๋Ÿผ, .. ]
    FROM ํ…Œ์ด๋ธ”๋ช…

     1) ์ˆœ์œ„ํ•จ์ˆ˜

         : ์†Œ๊ด„ํ˜ธ ์•ˆ์— ์ปฌ๋ŸผX, ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋ ค๋Š” ์ปฌ๋Ÿผ์„ ORDER BY์— ๊ธฐ์ž…

-- RANK() : ๋™์ผ ์ˆœ์œ„ ์กด์žฌ์‹œ ํ›„์ˆœ์œ„ ๋„˜์–ด๊ฐ
-- DENSE_RANK() : ๋™์ผ ์ˆœ์œ„ ์กด์žฌ์‹œ์—๋„ ํ›„์ˆœ์œ„ ๋„˜์–ด๊ฐ€์ง€์•Š์Œ
-- ROW_NUMBER() : ์—ฐ์†๋ฒˆํ˜ธ๋ถ€์—ฌ โ‡จ ๋™์ผ ์ˆœ์œ„ ์—†์Œ
SELECT NAME, SALARY, 
    RANK() OVER (ORDER BY SALARY DESC),
    DENSE_RANK() OVER(ORDER BY SALARY DESC),
    ROW_NUMBER() OVER(ORDER BY SALARY DESC)
FROM EMPLOYEE;

     2) ํ–‰์ˆœ์„œํ•จ์ˆ˜

         : ์ถœ๋ ฅ ๋Œ€์ƒ์„ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ธฐ์ž…, ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋ ค๋Š” ์ปฌ๋Ÿผ์€ ORDER BY์— ๊ธฐ์ž…

         : PARTITION BY ์ƒ๋žต์‹œ ์ „์ฒด ์ปฌ๋Ÿผ ๋Œ€์ƒ

-- FIRST_VALUE(์ถœ๋ ฅ๋Œ€์ƒ) : ํŒŒํ‹ฐ์…˜ ๋ณ„ ์œˆ๋„์šฐ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ฐ’์„ ์ฐพ์Œ
-- LAST_VALUE(์ถœ๋ ฅ๋Œ€์ƒ) : ํŒŒํ‹ฐ์…˜ ๋ณ„ ์œˆ๋„์šฐ์—์„œ ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋‚˜์˜ค๋Š” ๊ฐ’์„ ์ฐพ์Œ
-- LAG(์ถœ๋ ฅ๋Œ€์ƒ) : ํŒŒํ‹ฐ์…˜ ๋ณ„ ์œˆ๋„์šฐ์—์„œ ์ด์ „ ๋กœ์šฐ๊ฐ’ ๋ฐ˜ํ™˜
-- LEAD(์ถœ๋ ฅ๋Œ€์ƒ) : ํŒŒํ‹ฐ์…˜ ๋ณ„ ์œˆ๋„์šฐ์—์„œ ๋‹ค์Œ ๋กœ์šฐ๊ฐ’ ๋ฐ˜ํ™˜
SELECT NAME, SALARY,
    FIRST_VALUE(NAME) OVER(ORDER BY SALARY DESC),
    LAST_VALUE(NAME) OVER(ORDER BY SALARY DESC),
    LAG(NAME) OVER(ORDER BY SALARY DESC),
    LEAD(NAME) OVER(ORDER BY SALARY DESC),
FROM EMPLOYEE;

     3) ๊ทธ๋ฃน๋‚ด๋น„์œจํ•จ์ˆ˜

-- RATIO_TO_REPORT : ์ฃผ์–ด์ง„ ๊ทธ๋ฃน์˜ ํ•ฉ์—๋Œ€ํ•ด ๋กœ์šฐ์˜ ์ƒ๋Œ€์  ๋น„์œจ ๋ฐ˜ํ™˜ โžก๏ธŽ 0~1 ์‚ฌ์ด๊ฐ’ ๋ฐ˜ํ™˜
-- PERCENT_RANK : ์ˆœ์„œ์— ๋Œ€ํ•œ ๋ฐฑ๋ถ„์œจ ๋ฐ˜ํ™˜ โžก๏ธŽ 0~1 ์‚ฌ์ด๊ฐ’ ๋ฐ˜ํ™˜ - ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š”๊ฒƒ 0

 

๋Œ“๊ธ€