๐๏ธ SQL GROUP BY, HAVING
SELECT๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค ๋ณด๋ฉด ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ฑฐ๋ ์กฐ๊ฑด์ ๊ฑธ๊ณ ์ถ์ ๋๊ฐ ์๊น๋๋ค.
์ค๋์ ๊ทธ๋ด ๋ ์ฐ๋ ๋ ๊ฐ์ง ์ ์ ์ ๋ฆฌํด ๋ดค์ต๋๋ค ๐
๐๏ธ ์์ ํ
์ด๋ธ โ students
| id | name | grade | score | teacher_id |
|---|---|---|---|---|
| 1 | ๊น์ฒ ์ | 1 | 85 | 1 |
| 2 | ์ด์ํฌ | 2 | NULL | 1 |
| 3 | ๋ฐ๋ฏผ์ค | 1 | 90 | 2 |
| 4 | ์ต์ง์ | 3 | 72 | NULL |
| 5 | ์ ์ํ | 2 | NULL | 2 |
| 6 | ํ์ง๋ฏผ | 1 | 78 | 1 |
| 7 | ์ค์์ค | 3 | 95 | 2 |
| 8 | ๊ฐ๋ค์ | 2 | 88 | 1 |
| 9 | ์ํ์ฐ | 3 | NULL | 2 |
| 10 | ์ค์ง์ | 1 | 65 | NULL |
CREATE DATABASE IF NOT EXISTS practice;
USE practice;
DROP TABLE IF EXISTS students;
CREATE TABLE students (
id INT,
name VARCHAR(10),
grade INT,
score INT,
teacher_id INT
);
INSERT INTO students VALUES (1, '๊น์ฒ ์', 1, 85, 1);
INSERT INTO students VALUES (2, '์ด์ํฌ', 2, NULL, 1);
INSERT INTO students VALUES (3, '๋ฐ๋ฏผ์ค', 1, 90, 2);
INSERT INTO students VALUES (4, '์ต์ง์', 3, 72, NULL);
INSERT INTO students VALUES (5, '์ ์ํ', 2, NULL, 2);
INSERT INTO students VALUES (6, 'ํ์ง๋ฏผ', 1, 78, 1);
INSERT INTO students VALUES (7, '์ค์์ค', 3, 95, 2);
INSERT INTO students VALUES (8, '๊ฐ๋ค์', 2, 88, 1);
INSERT INTO students VALUES (9, '์ํ์ฐ', 3, NULL, 2);
INSERT INTO students VALUES (10, '์ค์ง์', 1, 65, NULL);
โผ๏ธ ์ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ์๋ ๋ฌธ๋ฒ ์ฌ์ฉ๋ฒ์ ์ค๋ช ํ ๊ฒ์.
๐๏ธ GROUP BY โ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ธฐ
๊ฐ์ ๊ฐ์ ๊ฐ์ง ํ๋ค์ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋ ์ ์
๋๋ค.
์ง๊ณ ํจ์(COUNT, SUM, AVG ๋ฑ)์ ํจ๊ป ์จ์ผ ์๋ฏธ๊ฐ ์์ด์. ๐ ๐ ์ง๊ณ ํจ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
GROUP BY ์ปฌ๋ผ๋ช
;
๐น ํ๋ ๋ณ ํ์ ์
SELECT grade, COUNT(*) AS ํ์์
FROM students
GROUP BY grade;
๐ฅ ๊ฒฐ๊ณผ
| grade | ํ์์ |
|---|---|
| 1 | 4 |
| 2 | 3 |
| 3 | 3 |
๐น ํ๋ ๋ณ ํ๊ท ์ ์
SELECT grade, AVG(score) AS ํ๊ท ์ ์
FROM students
GROUP BY grade;
๐ฅ ๊ฒฐ๊ณผ
| grade | ํ๊ท ์ ์ |
|---|---|
| 1 | 79.5000 |
| 2 | 88.0000 |
| 3 | 83.5000 |
NULL์ ์ง๊ณ ํจ์์์ ๋ฌด์๋๋ฏ๋ก ๊ฐ ํ๋ ์ ์ค์ ์์์ ๊ธฐ์ค์ผ๋ก ํ๊ท ์ด ๊ณ์ฐ๋ฉ๋๋ค.
โ ๏ธ GROUP BY ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
SELECT์ ์ฐ๋ ์ปฌ๋ผ์ ๋ฐ๋์ GROUP BY์ ํฌํจ๋๊ฑฐ๋ ์ง๊ณ ํจ์๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
SELECT grade, name, COUNT(*)
FROM students
GROUP BY grade;
โ
์ ์
SELECT grade, COUNT(*)
FROM students
GROUP BY grade;
๐ HAVING โ ๊ทธ๋ฃน์ ์กฐ๊ฑด ๊ฑธ๊ธฐ
GROUP BY๋ก ๋ฌถ์ธ ๊ฒฐ๊ณผ์ ์กฐ๊ฑด์ ๊ฑฐ๋ ์ ์
๋๋ค.
WHERE๊ฐ ํ์ ํํฐ๋งํ๋ค๋ฉด, HAVING์ ๊ทธ๋ฃน์ ํํฐ๋งํฉ๋๋ค.
๐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
GROUP BY ์ปฌ๋ผ๋ช
HAVING ์กฐ๊ฑด;
๐น ํ์์ด 4๋ช ์ด์์ธ ํ๋ ๋ง
SELECT grade, COUNT(*) AS ํ์์
FROM students
GROUP BY grade
HAVING COUNT(*) >= 4;
๐ฅ ๊ฒฐ๊ณผ
| grade | ํ์์ |
|---|---|
| 1 | 4 |
โ ๏ธ WHERE vs HAVING
์ง๊ณ ํจ์์ ์กฐ๊ฑด์ ๊ฑธ ๋๋ ๋ฐ๋์ HAVING์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
WHERE์๋ ์ง๊ณ ํจ์๋ฅผ ์ธ ์ ์์ต๋๋ค.
WHERE COUNT(*) >= 4
โ
์ ์
HAVING COUNT(*) >= 4
๐ ์ ์คํ ์์
FROM โ WHERE โ GROUP BY โ HAVING โ SELECT โ ORDER BY
โ ์ ์ฒด ์ ์ ํจ๊ป ์ฐ๋ ์์
SELECT grade, COUNT(*) AS ํ์์, AVG(score) AS ํ๊ท ์ ์
FROM students
WHERE score IS NOT NULL -- NULL ์ ์ธ
GROUP BY grade -- ํ๋
๋ณ ๊ทธ๋ฃนํ
HAVING AVG(score) >= 70 -- ํ๊ท 70์ ์ด์์ธ ํ๋
๋ง
ORDER BY ํ๊ท ์ ์ DESC; -- ํ๊ท ์ ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
๐ฅ ๊ฒฐ๊ณผ
| grade | ํ์์ | ํ๊ท ์ ์ |
|---|---|---|
| 2 | 1 | 88.0000 |
| 3 | 2 | 83.5000 |
| 1 | 4 | 79.5000 |
โ ๋ง๋ฌด๋ฆฌ
| ์ | ์ญํ | ์์น |
|---|---|---|
GROUP BY |
๊ฐ์ ๊ฐ์ ํ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ธฐ | WHERE ๋ค |
HAVING |
๊ทธ๋ฃน์ ์กฐ๊ฑด ๊ฑธ๊ธฐ | GROUP BY ๋ค |
๐ ์ฐธ๊ณ ์๋ฃ
'Database > SQL ๊ธฐ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL ๊ธฐ์ด - WHERE (0) | 2026.03.20 |
|---|---|
| SQL ๊ธฐ์ด - ์ง๊ณ ํจ์(COUNT, AVG, SUM, MAX, MIN) (0) | 2026.03.20 |
| SQL ๊ธฐ์ด - ORDER BY (0) | 2026.03.19 |
| SQL ๊ธฐ์ด - NULL ๋ค๋ฃจ๊ธฐ (0) | 2026.03.18 |
| SQL๊ธฐ์ด - SELECT (0) | 2026.03.17 |