๋ชฉ์ฐจ
๐งฉ๊ทธ๋ฃน ํจ์๋?
๊ทธ๋ฃน ํจ์(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 |