SQL/SQLD

#18 ๊ทธ๋ฃน ํ•จ์ˆ˜

sundori 2025. 4. 14. 18:18

๋ชฉ์ฐจ

    ๐Ÿงฉ๊ทธ๋ฃน ํ•จ์ˆ˜๋ž€?

    ๊ทธ๋ฃน ํ•จ์ˆ˜(Aggregate Function)๋Š” ์—ฌ๋Ÿฌ ํ–‰(Row)์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด ์ดํ•ฉ, ํ‰๊ท , ๊ฐœ์ˆ˜, ์ตœ๋Œ€๊ฐ’, ์ตœ์†Œ๊ฐ’ ๋“ฑ์„ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    ๋‹จ๋…์œผ๋กœ๋„ ์“ฐ๊ณ , GROUP BY ์ ˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ฃน๋ณ„๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

     

    ๋Œ€ํ‘œ์ ์ธ ๊ทธ๋ฃน ํ•จ์ˆ˜ ๋ชฉ๋ก
    ํ•จ์ˆ˜ ์ด๋ฆ„ ์—ญํ• 
    COUNT() ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
    SUM() ํ•ฉ๊ณ„
    AVG() ํ‰๊ท 
    MAX() ์ตœ๋Œ€๊ฐ’
    MIN() ์ตœ์†Œ๊ฐ’
    GROUP_CONCAT() ์—ฌ๋Ÿฌ ๊ฐ’์„ ์—ฐ๊ฒฐ(MySQL ์ „์šฉ)
    STDDEV() ํ‘œ์ค€ํŽธ์ฐจ(์˜ค๋ผํด/PGSQL ๋“ฑ)
    VARIANCE() ๋ถ„์‚ฐ
    MEDIAN() ์ค‘์•™๊ฐ’(์˜ค๋ผํด ๋“ฑ ์ผ๋ถ€ ์ง€์›)

    COUNT() - ๊ฐœ์ˆ˜์„ธ๊ธฐ

    SELECT COUNT(*) FROM students;                  -- ์ „์ฒด ํ–‰ ์ˆ˜
    SELECT COUNT(score) FROM students;              -- NULL ์ œ์™ธ
    SELECT COUNT(DISTINCT subject) FROM scores;     -- ์ค‘๋ณต ์ œ๊ฑฐ ํ›„ ๊ฐœ์ˆ˜

    โœ… ํŠน์ง•

    • COUNT(*)๋Š” NULL ํฌํ•จ ์ „์ฒด ํ–‰ ์ˆ˜
    • COUNT(์ปฌ๋Ÿผ)์€ NULL ์ œ์™ธ
    • DISTINCT๋กœ ๊ณ ์œ ๊ฐ’๋งŒ ์„ธ๊ธฐ ๊ฐ€๋Šฅ

    SUM() - ํ•ฉ๊ณ„

    SELECT SUM(score) FROM students;

     

    โœ… ํŠน์ง•

    • ์ˆซ์ž ์ปฌ๋Ÿผ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • NULL์€ ๊ณ„์‚ฐ์—์„œ ์ œ์™ธ๋จ

    AVG() - ํ‰๊ท 

    SELECT AVG(score) FROM students;

    โœ… ํŠน์ง•

    • NULL์€ ์ œ์™ธํ•˜๊ณ  ํ‰๊ท  ๊ณ„์‚ฐ๋จ
    • SUM / COUNT์˜ ๊ฐœ๋…๊ณผ ๋™์ผ

    MAX() – ์ตœ๋Œ€๊ฐ’

    SELECT MAX(score) FROM students;

    โœ… ํŠน์ง•

    • ์ˆซ์ž, ๋‚ ์งœ, ๋ฌธ์ž ๋ชจ๋‘ ๊ฐ€๋Šฅ
    • ๋ฌธ์ž์ผ ๊ฒฝ์šฐ ์‚ฌ์ „ ์ˆœ ๋น„๊ต๋จ

    MIN() – ์ตœ์†Œ๊ฐ’

    SELECT MIN(score) FROM students;
    • MAX()์™€ ๋™์ผํ•˜๋˜ ์ตœ์†Œ๊ฐ’ ๋ฐ˜ํ™˜

    GROUP_CONCAT() – ๊ทธ๋ฃน ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ (MySQL)

    SELECT student_id, GROUP_CONCAT(subject)
    FROM scores
    GROUP BY student_id;
    
    --
    1 | ์ˆ˜ํ•™,์˜์–ด
    2 | ๊ณผํ•™

     

    • ์ฝค๋งˆ๋กœ ์—ฐ๊ฒฐ๋จ. SEPARATOR๋กœ ๊ตฌ๋ถ„์ž ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    • ์˜ค๋ผํด์—์„œ๋Š” LISTAGG(), PostgreSQL์€ STRING_AGG() ์‚ฌ์šฉ

    STDDEV() – ํ‘œ์ค€ํŽธ์ฐจ

    SELECT STDDEV(score) FROM scores;

     

    • ๋ถ„ํฌ๊ฐ€ ํผ์ง„ ์ •๋„๋ฅผ ์ˆ˜์น˜ํ™” (Oracle, PostgreSQL)

    VARIANCE() – ๋ถ„์‚ฐ

    SELECT VARIANCE(score) FROM scores;
    • ํŽธ์ž ์ œ๊ณฑ์˜ ํ‰๊ท 

    MEDIAN() – ์ค‘์•™๊ฐ’

    SELECT MEDIAN(score) FROM scores;
    • ์˜ค๋ผํด ๋“ฑ ์ผ๋ถ€ DBMSks wldnjs

    โš ๏ธ ๊ทธ๋ฃน ํ•จ์ˆ˜ ์ฃผ์˜์‚ฌํ•ญ

    NULL ์ฒ˜๋ฆฌ ๋Œ€๋ถ€๋ถ„์˜ ๊ทธ๋ฃน ํ•จ์ˆ˜๋Š” NULL์„ ๋ฌด์‹œํ•จ
    SELECT ๋‹จ๋… ์‚ฌ์šฉ ์ง‘๊ณ„๋งŒ ์›ํ•  ๋• OK, ๊ทธ๋ฃน๋ณ„์ด๋ฉด GROUP BY ํ•„์š”
    HAVING ์ ˆ WHERE์—์„œ๋Š” ๊ทธ๋ฃน ํ•จ์ˆ˜ ๋ชป ์”€ → HAVING์—์„œ ํ•„ํ„ฐ๋ง
    ์ค‘์ฒฉ ๊ฐ€๋Šฅ ์˜ˆ: SELECT MAX(AVG(score)) ... GROUP BY subject

    ๊ณ ๊ธ‰ ๊ทธ๋ฃน ์ง‘๊ณ„ ํ•จ์ˆ˜

    ๊ธฐ๋Šฅ ์ด๋ฆ„ ์—ญํ• 
    ROLLUP ๊ณ„์ธต์  ์ง‘๊ณ„(์œ„ -> ์•„๋ž˜๋กœ ์š”์•ฝ)
    CUBE ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์˜ ์ง‘๊ณ„
    GROUPING SETS ์ˆ˜๋™์œผ๋กœ ์—ฌ๋Ÿฌ ๊ทธ๋ฃน ์กฐํ•ฉ ์ •์˜
    GROUPING() NULL์ด ์ง‘๊ณ„ํ–‰์ธ์ง€ ์•„๋‹Œ์ง€ ๊ตฌ๋ถ„

    1๏ธโƒฃ ROLLUP – ๊ณ„์ธต์  ์š”์•ฝ ์ง‘๊ณ„

    ์—ฌ๋Ÿฌ ๊ทธ๋ฃน ๊ธฐ์ค€์„ ์œ„์—์„œ ์•„๋ž˜๋กœ ์š”์•ฝํ•˜๋Š” ๋ฐฉ์‹
    ์ดํ•ฉ → ์ค‘๊ฐ„ ์š”์•ฝ → ์„ธ๋ถ€ ์ •๋ณด ์ˆœ์œผ๋กœ ๋‚ด๋ ค๊ฐ

    ROLLUP(A) - A๋กœ ๊ทธ๋ฃนํ•‘
    - ์ดํ•ฉ๊ณ„
    ROLLUP(A, B) - A, B๋กœ ๊ทธ๋ฃนํ•‘
    - A๋กœ ๊ทธ๋ฃนํ•‘
    - ์ดํ•ฉ๊ณ„
    ROLLUP(A. B, C) - A, B, C๋กœ ๊ทธ๋ฃนํ•‘
    - A, B๋กœ ๊ทธ๋ฃนํ•‘
    - A๋กœ ๊ทธ๋ฃนํ•‘, ์ดํ•ฉ๊ณ„

     

    SELECT department, job_title, SUM(salary)
    FROM employees
    GROUP BY ROLLUP(department, job_title);
    
    
    --
    | ๋ถ€์„œ      | ์ง๊ธ‰     | ํ•ฉ๊ณ„๊ธ‰์—ฌ |
    |-----------|----------|----------|
    | ๊ฐœ๋ฐœ๋ถ€    | ์‚ฌ์›     | 5,000    |
    | ๊ฐœ๋ฐœ๋ถ€    | ๊ณผ์žฅ     | 8,000    |
    | ๊ฐœ๋ฐœ๋ถ€    | NULL     | 13,000   ← ๋ถ€์„œ๋ณ„ ํ•ฉ๊ณ„
    | ๊ธฐํš๋ถ€    | ์‚ฌ์›     | 4,000    |
    | ๊ธฐํš๋ถ€    | NULL     | 4,000    |
    | NULL      | NULL     | 17,000   ← ์ „์ฒด ์ดํ•ฉ
    
    -- NULL์€ ์ดํ•ฉ์— ํฌํ•จ ์•ˆ๋จ!!

    2๏ธโƒฃ CUBE – ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์˜ ์ง‘๊ณ„

    ROLLUP์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์š”์•ฝํ•˜์ง€๋งŒ,
    CUBE๋Š” ๋ชจ๋“  ์กฐํ•ฉ์˜ ๊ทธ๋ฃน๋ณ„ ์ง‘๊ณ„๋ฅผ ์ „๋ถ€ ๊ตฌํ•จ.

    SELECT department, job_title, SUM(salary)
    FROM employees
    GROUP BY CUBE(department, job_title);
    
    --
    | ๋ถ€์„œ      | ์ง๊ธ‰     | ํ•ฉ๊ณ„๊ธ‰์—ฌ |
    |-----------|----------|----------|
    | ๊ฐœ๋ฐœ๋ถ€    | ์‚ฌ์›     | 5,000    |
    | ๊ฐœ๋ฐœ๋ถ€    | ๊ณผ์žฅ     | 8,000    |
    | ๊ฐœ๋ฐœ๋ถ€    | NULL     | 13,000   |
    | NULL      | ์‚ฌ์›     | 9,000    |
    | NULL      | ๊ณผ์žฅ     | 8,000    |
    | NULL      | NULL     | 17,000   |
    ...

     

    → ๋ถ€์„œ๋ณ„, ์ง๊ธ‰๋ณ„, ์ „์ฒด, ์กฐํ•ฉ๋ณ„ ๋“ฑ ๋ชจ๋“  ๋ฐฉํ–ฅ์˜ ๊ทธ๋ฃนํ™” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ด


    3๏ธโƒฃ GROUPING SETS – ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ทธ๋ฃน ์กฐํ•ฉ๋งŒ ์ง€์ •

    SELECT department, job_title, SUM(salary)
    FROM employees
    GROUP BY GROUPING SETS (
      (department),
      (job_title),
      ()
    );
    
    --
    | ๋ถ€์„œ      | ์ง๊ธ‰     | ํ•ฉ๊ณ„๊ธ‰์—ฌ |
    |-----------|----------|----------|
    | ๊ฐœ๋ฐœ๋ถ€    | NULL     | 13,000   |
    | ๊ธฐํš๋ถ€    | NULL     | 4,000    |
    | NULL      | ์‚ฌ์›     | 9,000    |
    | NULL      | ๊ณผ์žฅ     | 8,000    |
    | NULL      | NULL     | 17,000   |

    ๋ถ€์„œ๋ณ„ / ์ง๊ธ‰๋ณ„ / ์ „์ฒด ํ•ฉ๊ณ„๋งŒ ์ง์ ‘ ๊ณจ๋ผ์„œ ํ‘œ์‹œ


    4๏ธโƒฃ GROUPING() – NULL์ด ์ง‘๊ณ„ํ–‰์ธ์ง€ ์‹ค์ œ ๋ฐ์ดํ„ฐ์ธ์ง€ ๊ตฌ๋ถ„

    SELECT
      department,
      job_title,
      GROUPING(department) AS g1,
      GROUPING(job_title) AS g2,
      SUM(salary)
    FROM employees
    GROUP BY ROLLUP(department, job_title);

     

    โœ… GROUPING() ๊ฒฐ๊ณผ:

    • 0 = ์‹ค์ œ ๊ฐ’
    • 1 = ์ง‘๊ณ„ํ–‰์—์„œ ์ƒ๊ธด NULL

    โœ… ๋น„๊ต ์š”์•ฝํ‘œ

    ๊ธฐ๋Šฅ์šฉ๋„
    ROLLUP(a, b) ์œ„ → ์•„๋ž˜ ๋ฐฉํ–ฅ ์š”์•ฝ (๋ถ€๋ถ„ํ•ฉ, ์ดํ•ฉ)
    CUBE(a, b) ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์— ๋Œ€ํ•ด ์š”์•ฝ
    GROUPING SETS ์ง‘๊ณ„ ๊ธฐ์ค€์„ ์ง์ ‘ ์ง€์ •
    GROUPING() ์ง‘๊ณ„๋กœ ์ƒ๊ธด NULL์ธ์ง€ ๊ตฌ๋ถ„
    728x90

    'SQL > SQLD' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    #20 Top-N ์ฟผ๋ฆฌ  (0) 2025.04.15
    #19 ์œˆ๋„์šฐ ํ•จ์ˆ˜  (0) 2025.04.15
    #17 ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž  (0) 2025.04.14
    #16 ๋ทฐ(View)  (0) 2025.04.14
    #15 ์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery)  (0) 2025.04.13