๐Ÿ“š ๊ทธ๋ฃนํ•จ์ˆ˜ ํ™œ์šฉํ•˜๊ธฐ

yoondguยท2022๋…„ 5์›” 7์ผ
0

Oracle

๋ชฉ๋ก ๋ณด๊ธฐ
7/9

๐Ÿ“Œ SELECT ๊ตฌ๋ฌธ์—์„œ ๊ทธ๋ฃนํ•จ์ˆ˜์˜ ์‹คํ–‰

SELECT ์†์„ฑ๋ช… ๋˜๋Š” ํ‘œํ˜„์‹, ๊ทธ๋ฃนํ•จ์ˆ˜() -- ๊ทธ๋ฃนํ•จ์ˆ˜์™€ GROUP BY์— ์ฐธ์—ฌํ•œ ์†์„ฑ๋ช… ๋˜๋Š” ํ‘œํ˜„์‹๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
FROM ํ…Œ์ด๋ธ”๋ช…
WHERE ์กฐ๊ฑด์‹ -- (1) WHERE์ ˆ์—์„œ ๊ทธ๋ฃนํ•‘ ๋Œ€์ƒ์ด ์•„๋‹Œ ํ–‰์„ ์ œ์™ธ์‹œํ‚จ๋‹ค.
            -- WHERE์ ˆ์—๋Š” ๊ทธ๋ฃนํ•จ์ˆ˜๊ฐ€ ์˜ฌ ์ˆ˜ ์—†๋‹ค.
GROUP BY ์†์„ฑ๋ช… ๋˜๋Š” ํ‘œํ˜„์‹ -- (2) GROUP BY ์ ˆ์—์„œ **๊ทธ๋ฃนํ•‘ ๋ฐฉ์‹์„ ์ง€์ •**ํ•œ๋‹ค.
                         -- ์†์„ฑ๋ช… ๋˜๋Š” ํ‘œํ˜„์‹์˜ ๊ฐ’์ด ๊ฐ™์€ ํ–‰๋ผ๋ฆฌ ๊ฐ™์€ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๋Š”๋‹ค.
                         -- GROUP BY ์ ˆ์ด ์—†์œผ๋ฉด ์กฐํšŒ๋œ ํ–‰ ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ํ–‰๊ทธ๋ฃน์ด๋‹ค.
HAVING ์กฐ๊ฑด์‹ -- (3) HAVING ์ ˆ์—์„œ๋Š” ์กฐ๊ฑด์‹์— ๊ทธ๋ฃนํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
							-- ๊ทธ๋ฃนํ•จ์ˆ˜ ์ ์šฉ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์กฐ๊ฑด์‹์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
							-- GROUP BY์— ์˜ํ•œ SELECT ์‹คํ–‰๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์กฐ๊ฑด์‹์ด๋‹ค.
							-- HAVING ์กฐ๊ฑด์‹์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๊ทธ๋ฃน๋งŒ ์กฐํšŒํ•˜๊ฒŒ ํ•œ๋‹ค.

SELECT๊ตฌ๋ฌธ์—์„œ ๊ทธ๋ฃนํ•จ์ˆ˜์˜ ์‹คํ–‰์€
WHERE(๊ทธ๋ฃนํ•‘๋Œ€์ƒ ํ•„ํ„ฐ๋ง) - GROUP BY(๊ทธ๋ฃนํ•‘) - HAVING(๊ทธ๋ฃนํ•‘ ๊ฒฐ๊ณผ ํ•„ํ„ฐ๋ง) ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

  • ๐Ÿ‡ ๊ทธ๋ฃนํ•จ์ˆ˜ ํ™œ์šฉ ์˜ˆ์‹œ SQL๋ฌธ
    -- ํ–‰๊ทธ๋ฃน์ด 'ํ…Œ์ด๋ธ” ์ „์ฒด์ธ ๊ฒฝ์šฐ' : ํ–‰๊ทธ๋ฃน์ด ํ•˜๋‚˜์ด๋ฏ€๋กœ ์กฐํšŒ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ํ–‰ ์กฐํšŒ๋œ๋‹ค.
    SELECT COUNT(*)
    FROM EMPLOYEES;
    
    SELECT SUM(SALARY)
    FROM EMPLOYEES;
    
    -- ํ–‰๊ทธ๋ฃน์ด '์กฐํšŒ๋œ ํ–‰ ์ „์ฒด์ธ ๊ฒฝ์šฐ' : ํ–‰๊ทธ๋ฃน์ด ํ•˜๋‚˜์ด๋ฏ€๋กœ ์กฐํšŒ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ํ–‰ ์กฐํšŒ๋œ๋‹ค.
    SELECT COUNT(*)
    FROM EMPLOYEES
    WHERE SALARY < 10000;
    
    SELECT AVG(SALARY)
    FROM EMPLOYEES
    WHERE SALARY < 10000;
    
    -- ํŠน์ • ์†์„ฑ์— ๋Œ€ํ•˜์—ฌ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ–‰๋ผ๋ฆฌ ๊ทธ๋ฃนํ•‘์„ ํ•˜๋Š” ๊ฒฝ์šฐ : ํ–‰๊ทธ๋ฃน์ด ์—ฌ๋Ÿฌ ๊ฐœ์ด๋ฏ€๋กœ ์กฐํšŒ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กฐํšŒ๋œ๋‹ค.
    -- GROUP BY ๋Š” ํ–‰๊ทธ๋ฃน์„ ๋‚˜๋ˆˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ–‰๊ทธ๋ฃน์„ ์ƒ์„ฑํ•œ๋‹ค.
    SELECT COUNT(*)
    FROM EMPLOYEES
    GROUP BY JOB_ID; -- GROUP BY๋กœ ๋‚˜๋ˆ„์–ด์ง„ ํ–‰๊ทธ๋ฃน๋งˆ๋‹ค ๊ทธ๋ฃนํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
    
    SELECT COUNT(*)
    FROM EMPLOYEES
    GROUP BY DEPARTMENT_ID;
    
    -- ํ–‰๊ทธ๋ฃน์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ GROUP BY ์ ˆ์— ์‚ฌ์šฉํ–ˆ๋˜ ์ปฌ๋Ÿผ๋ช… ํ˜น์€ ํ‘œํ˜„์‹๋งŒ SELECT์ ˆ์—์„œ ๊ทธ๋ฃนํ•จ์ˆ˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    -- GROUP BY ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ๋ช…์€ SELECT ์ ˆ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    
    -- ์†Œ์žฌ์ง€ ๋ณ„ ๋ถ€์„œ๊ฐฏ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ธฐ
    SELECT LOCATION_ID, COUNT(*)
    FROM DEPARTMENTS
    GROUP BY LOCATION_ID;
    
    -- ์†Œ์†๋ถ€์„œ๊ฐ€ ์žˆ๋Š” ์ง์›๋“ค์— ๋Œ€ํ•˜์—ฌ ์†Œ์†๋ถ€์„œ ๋ณ„ ์ง์›์ˆ˜ ์กฐํšŒํ•˜๊ธฐ
    SELECT DEPARTMENT_ID, COUNT(*)
    FROM EMPLOYEES
    WHERE DEPARTMENT_ID IS NOT NULL -- WHERE ์กฐ๊ฑด ์—†์ด๋Š” NULL ๊ฐ’์ธ ํ–‰๋„ ํ–‰๊ทธ๋ฃน์ด ๋œ๋‹ค.
    GROUP BY DEPARTMENT_ID
    ORDER BY DEPARTMENT_ID;
    
    -- ์ž…์‚ฌ๋…„๋„ ๋ณ„ ์‚ฌ์›์ˆ˜ ์กฐํšŒํ•˜๊ธฐ
    -- ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฐ™์€ ํ–‰๋ผ๋ฆฌ ๋ฌถ๋Š”๋‹ค.
    SELECT TO_CHAR(HIRE_DATE, 'YYYY') YEAR, COUNT(*)
    FROM EMPLOYEES
    GROUP BY TO_CHAR(HIRE_DATE, 'YYYY') -- ๋‹จ์ผํ–‰ ํ•จ์ˆ˜์ธ TO_CHAR(HIRE_DATE, 'YYYY') ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฐ™์€ ํ–‰๋ผ๋ฆฌ ๊ฐ™์€ ํ–‰๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๋Š”๋‹ค.
    ORDER BY YEAR;
    
    -- ๊ธ‰์—ฌ๋“ฑ๊ธ‰๋ณ„ ์‚ฌ์›์ˆ˜ ์กฐํšŒํ•˜๊ธฐ
    -- ์‚ฌ์›ํ…Œ์ด๋ธ”๊ณผ ๊ธ‰์—ฌ๋“ฑ๊ธ‰ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๊ณ , ๊ธ‰์—ฌ๋“ฑ๊ธ‰ํ…Œ์ด๋ธ”์˜ ๋“ฑ๊ธ‰์ด ๊ฐ™์€ ํ–‰๋ผ๋ฆฌ ํ–‰๊ทธ๋ฃน์„ ์ƒ์„ฑ
    SELECT S.GRADE, COUNT(*) GRADE_CNT
    FROM EMPLOYEES E, SALARY_GRADE S
    WHERE E.SALARY >= S.MIN_SALARY AND E.SALARY <= S.MAX_SALARY 
    GROUP BY S.GRADE
    ORDER BY S.GRADE;
    
    -- ์ž…์‚ฌ๋…„๋„๋ณ„ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ–ˆ์„ ๋•Œ ์ž…์‚ฌํ•œ ์‚ฌ์›์ˆ˜๊ฐ€ 20๋ช… ์ด์ƒ์œผ๋กœ ์ž…์‚ฌํ•œ ํ•ด์™€ ๊ทธ ํ•ด์— ์ž…์‚ฌํ•œ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ธฐ
    SELECT TO_CHAR(HIRE_DATE, 'YYYY') YEAR, COUNT(*) YEAR_HIRED_CNT
    FROM EMPLOYEES
    GROUP BY TO_CHAR(HIRE_DATE, 'YYYY')
    HAVING COUNT(*) >= 20
    ORDER BY YEAR;

๐Ÿ“Œ ์†Œ๊ทธ๋ฃน ๊ฐ„์˜ ์ง‘๊ณ„ ํ•จ์ˆ˜

  • ROLLUP(์ปฌ๋Ÿผ๋ช…1, ์ปฌ๋Ÿผ๋ช…2) ์ปฌ๋Ÿผ๋ช…1 ๋กœ ๋จผ์ € ๊ทธ๋ฃนํ•‘ํ•˜๊ณ  ๊ฐ™์€ ๊ทธ๋ฃน ์•ˆ์—์„œ ์ปฌ๋Ÿผ๋ช…2 ๋กœ ๊ทธ๋ฃนํ•‘ํ•œ ๋‹ค์Œ
    • ์ „์ฒด ํ–‰์— ๋Œ€ํ•œ ๊ทธ๋ฃนํ•จ์ˆ˜ ๊ฒฐ๊ณผ
    • ์ปฌ๋Ÿผ๋ช…1 ์˜ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๊ทธ๋ฃนํ•จ์ˆ˜ ๊ฒฐ๊ณผ
    • ์ปฌ๋Ÿผ๋ช…2์˜ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๊ทธ๋ฃนํ•จ์ˆ˜ ๊ฒฐ๊ณผ ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • GROUIPING SETS(์ปฌ๋Ÿผ๋ช…1, ์ปฌ๋Ÿผ๋ช…2) ์ œ์‹œ๋œ ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ๊ฐ๊ฐ ๋”ฐ๋กœ ๊ทธ๋ฃนํ•‘ํ•ด์„œ ๊ทธ๋ฃนํ•จ์ˆ˜ ์ ์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    -- ๋ถ€์„œ๋ณ„, ์ง์ข…๋ณ„ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ธฐ
    -- * ๋ถ€์„œ๋ณ„๋กœ ๋จผ์ € ๊ทธ๋ฃนํ•‘ ํ›„, ๊ฐ™์€ ๋ถ€์„œ ๋‚ด์—์„œ ์ง์ข…๋ณ„๋กœ ๋‹ค์‹œ ๊ทธ๋ฃนํ•‘ํ•ด์„œ ์ง์ข…๋ณ„ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    SELECT DEPARTMENT_ID, JOB_ID, COUNT(*)
    FROM EMPLOYEES
    WHERE DEPARTMENT_ID IN (50, 80)
    GROUP BY DEPARTMENT_ID, JOB_ID -- DEPARTMENT_ID๋กœ ๊ทธ๋ฃนํ•‘ํ•˜๊ณ , ๊ทธ ์•ˆ์—์„œ ๋‹ค์‹œ JOB_ID๋กœ ๊ทธ๋ฃนํ•‘ํ•œ๋‹ค.
    ORDER BY DEPARTMENT_ID ASC, JOB_ID ASC;
    
    -- ๋ถ€์„œ๋ณ„, ์ง์ข…๋ณ„ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ธฐ - ROLLUP()ํ•จ์ˆ˜๋กœ ๋ถ€์„œ๋ณ„ ์†Œ๊ณ„, ์ „์ฒด ํ•ฉ๊ณ„๋ฅผ ์กฐํšŒํ•˜๊ธฐ
    -- * ๋ถ€์„œ๋ณ„๋กœ ๋จผ์ € ๊ทธ๋ฃนํ•‘ ํ›„, ๊ฐ™์€ ๋ถ€์„œ ๋‚ด์—์„œ ์ง์ข…๋ณ„๋กœ ๋‹ค์‹œ ๊ทธ๋ฃนํ•‘ํ•ด์„œ ์ง์ข…๋ณ„ ์‚ฌ์›์ˆ˜, ๋ถ€์„œ๋ณ„ ์‚ฌ์›์ˆ˜, ์ „์ฒด ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    SELECT DEPARTMENT_ID, JOB_ID, COUNT(*)
    FROM EMPLOYEES
    WHERE DEPARTMENT_ID IN (50, 80)
    GROUP BY ROLLUP(DEPARTMENT_ID, JOB_ID) -- ๋ถ€๋ถ„ํ•ฉ(ํฐ ๊ทธ๋ฃน๋ณ„), ์ „์ฒดํ•ฉ ํ–‰์„ ๋ณด์—ฌ์ค€๋‹ค.
    ORDER BY DEPARTMENT_ID ASC, JOB_ID ASC;
    
    -- ๋ถ€์„œ๋ณ„, ์ง์ข…๋ณ„ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ธฐ - GROUPING SETS()ํ•จ์ˆ˜๋กœ ๋ถ€์„œ๋ณ„, ์ง์ข…๋ณ„ ๊ทธ๋ฃนํ•จ์ˆ˜์˜ ๊ฐ ์‹คํ–‰๊ฒฐ๊ณผ ์กฐํšŒํ•˜๊ธฐ
    -- * ์ „์ฒด์— ๋Œ€ํ•˜์—ฌ ๋ถ€์„œ๋ณ„๋กœ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ณ , ๋˜ ์ „์ฒด์— ๋Œ€ํ•˜์—ฌ ์ง์ข…๋ณ„๋กœ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    SELECT DEPARTMENT_ID, JOB_ID, COUNT(*)
    FROM EMPLOYEES
    WHERE DEPARTMENT_ID IN (50, 80)
    GROUP BY GROUPING SETS(DEPARTMENT_ID, JOB_ID) -- ๋ถ€์„œ๋ณ„ ํ•ฉ๊ณ„, ์ง์ข…๋ณ„ ํ•ฉ๊ณ„๋ฅผ ๊ฐ๊ฐ ๋ณด์—ฌ์ค€๋‹ค.
    ORDER BY DEPARTMENT_ID ASC, JOB_ID ASC;

    ๐Ÿ’ก GROUP BY์˜ ์ปฌ๋Ÿผ๋ช…/ํ‘œํ˜„์‹์€ ์—ฌ๋Ÿฌ ๊ฐœ ์ ์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ํฌํ•จํ•ด ์ง‘๊ณ„ํ•˜๊ธฐ (ํฌ๊ด„์กฐ์ธ, GROUP BY)

.

 -- ๊ธ‰์—ฌ๋“ฑ๊ธ‰๋ณ„ ์‚ฌ์›์ˆ˜ ์กฐํšŒํ•˜๊ธฐ
 -- ์‚ฌ์›ํ…Œ์ด๋ธ”๊ณผ ๊ธ‰์—ฌ๋“ฑ๊ธ‰ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๊ณ , ๊ธ‰์—ฌ๋“ฑ๊ธ‰ํ…Œ์ด๋ธ”์˜ ๋“ฑ๊ธ‰์ด ๊ฐ™์€ ํ–‰๋ผ๋ฆฌ ํ–‰๊ทธ๋ฃน์„ ์ƒ์„ฑ
 SELECT S.GRADE, COUNT(*) GRADE_CNT
 FROM EMPLOYEES E, SALARY_GRADE S
 WHERE E.SALARY >= S.MIN_SALARY AND E.SALARY <= S.MAX_SALARY 
 GROUP BY S.GRADE
 ORDER BY S.GRADE;
 
 -- ์œ„์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ•ด๋‹น ์‚ฌ์›์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋“ฑ๊ธ‰์€ ํ™•์ธ ๋ถˆ๊ฐ€ํ•˜๋‹ค)
 -- ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋“ฑ๊ธ‰๋„ ํ•จ๊ป˜ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
 
 -- ์œ„์—์„œ ์ž‘์„ฑํ•œ SELECT๋ฌธ์˜ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ” X๋กœ ๊ฐ„์ฃผํ•˜๊ณ , SALARY, GRADE์™€ ์กฐ์ธํ•˜๊ธฐ 
 --SELECT Y.GRADE, NVL(X.GRADE_CNT, 0) CNT -- X.GRADE_CNT ๊ฐ’์ด NULL์ธ ๊ฒฝ์šฐ 0์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
 --FROM X, SALARY_GRADE Y
 --WHERE X.GRADE (+) = Y.GRADE -- X.GRADE์— S.GRADE์˜ A๋“ฑ๊ธ‰๊ณผ ์—ฐ๊ฒฐํ•  ํ–‰์ด ์—†์œผ๋ฏ€๋กœ (+) ํ•˜์—ฌ ํฌ๊ด„์กฐ์ธ์‹œ์ผœ์ค€๋‹ค.
 --ORDER BY Y.GRADE ASC;
 
 --๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ” X ์ž๋ฆฌ์— ์œ„ SELECT๋ฌธ์„ ์ž‘์„ฑํ•œ๋‹ค.
 SELECT Y.GRADE, NVL(X.GRADE_CNT, 0) CNT
 FROM    (SELECT S.GRADE, COUNT(*) GRADE_CNT -- ๋ณ„์นญ GRADE_CNT๋Š” ๊ด„ํ˜ธ ๋ฐ–์—์„œ ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ” X์˜ ์ปฌ๋Ÿผ๋ช…์ด๋‹ค.
         FROM EMPLOYEES E, SALARY_GRADE S -- ๋ณ„์นญ S๋Š” ๊ด„ํ˜ธ ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค. ์‹๋ณ„์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ๊ฒƒ ๋ฟ์ด๋‹ค.
         WHERE E.SALARY >= S.MIN_SALARY AND E.SALARY <= S.MAX_SALARY 
         GROUP BY S.GRADE) X, SALARY_GRADE Y
 WHERE X.GRADE(+) = Y.GRADE -- S.GRADE๊ฐ€ ์•„๋‹ˆ๋ผ X.GRADE๋ผ๊ณ  ํ•ด์•ผ ํ•œ๋‹ค.
 ORDER BY Y.GRADE ASC;
 ```

0๊ฐœ์˜ ๋Œ“๊ธ€