๐ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฐ์ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ?
CASE๋ฅผ ์ฐ๋ฉด SQL ์์์ if-else์ฒ๋ผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค ๐
CASE๋ ์กฐ๊ฑด์ ํ๊ฐํด ํด๋นํ๋ ๊ฐ์ ๋ฐํํ๋ ํํ์์
๋๋ค.
SELECT, ORDER BY, GROUP BY ๋ฑ ๋ค์ํ ๊ณณ์์ ์ฌ์ฉํ ์ ์์ด์!
๐ ์์ ํ
์ด๋ธ โ 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);
โผ๏ธ ์ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก CASE ์์๋ฅผ ์ค๋ช ํฉ๋๋ค.
๐น ๋จ์ CASE (Simple CASE)
๐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
CASE ์ปฌ๋ผ
WHEN ๊ฐ1 THEN ๋ฐํ๊ฐ1
WHEN ๊ฐ2 THEN ๋ฐํ๊ฐ2
ELSE ๊ธฐ๋ณธ๊ฐ
END
โจ ์ฌ์ฉ ์์
SELECT name,
CASE grade
WHEN 1 THEN '1ํ๋
'
WHEN 2 THEN '2ํ๋
'
WHEN 3 THEN '3ํ๋
'
END AS ํ๋
๋ช
FROM students;
๐ฅ ๊ฒฐ๊ณผ
| name | ํ๋ ๋ช |
|---|---|
| ๊น์ฒ ์ | 1ํ๋ |
| ์ด์ํฌ | 2ํ๋ |
| ๋ฐ๋ฏผ์ค | 1ํ๋ |
| ์ต์ง์ | 3ํ๋ |
| ์ ์ํ | 2ํ๋ |
| ํ์ง๋ฏผ | 1ํ๋ |
| ์ค์์ค | 3ํ๋ |
| ๊ฐ๋ค์ | 2ํ๋ |
| ์ํ์ฐ | 3ํ๋ |
| ์ค์ง์ | 1ํ๋ |
๐น ๊ฒ์ CASE (Searched CASE)
์กฐ๊ฑด์์ ์ง์ ์์ฑํด ๋ ์ ์ฐํ๊ฒ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋จ์ CASE๋ ํ๋์ ์ปฌ๋ผ๊ณผ ๊ฐ๋ง ๋น๊ตํ์ง๋ง, ๊ฒ์ CASE๋ ๋ฒ์ ์กฐ๊ฑด์ด๋ ๋ณตํฉ ์กฐ๊ฑด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
CASE
WHEN ์กฐ๊ฑด1 THEN ๋ฐํ๊ฐ1
WHEN ์กฐ๊ฑด2 THEN ๋ฐํ๊ฐ2
ELSE ๊ธฐ๋ณธ๊ฐ
END
โจ ์ฌ์ฉ ์์
SELECT name, score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE '๋ฏธ์์'
END AS ๋ฑ๊ธ
FROM students;
๐ฅ ๊ฒฐ๊ณผ
| name | score | ๋ฑ๊ธ |
|---|---|---|
| ๊น์ฒ ์ | 85 | B |
| ์ด์ํฌ | NULL | ๋ฏธ์์ |
| ๋ฐ๋ฏผ์ค | 90 | A |
| ์ต์ง์ | 72 | C |
| ์ ์ํ | NULL | ๋ฏธ์์ |
| ํ์ง๋ฏผ | 78 | C |
| ์ค์์ค | 95 | A |
| ๊ฐ๋ค์ | 88 | B |
| ์ํ์ฐ | NULL | ๋ฏธ์์ |
| ์ค์ง์ | 65 | ๋ฏธ์์ |
CASE๋ ์์์ ์๋๋ก ์์๋๋ก ํ๊ฐํ๋ฉฐ, ์ฒ์์ผ๋ก ์ฐธ์ด ๋๋ WHEN์์ ๋ฉ์ถฅ๋๋ค.
๐น ORDER BY์์ CASE ์ฌ์ฉ
์ผ๋ฐ ORDER BY๋ก๋ ํํํ๊ธฐ ์ด๋ ค์ด ์ปค์คํ
์ ๋ ฌ์ด ํ์ํ ๋ ์๋๋ค.
์๋ฅผ ๋ค์ด ํน์ ํ์์ ๋งจ ์๋ก ์ฌ๋ฆฌ๊ณ ๋๋จธ์ง๋ ์ด๋ฆ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ์ ๋์
๋๋ค.
์ค์์ค์ ๋งจ ์๋ก, ๋๋จธ์ง๋ ์ด๋ฆ์ ์ ๋ ฌ
SELECT name, grade
FROM students
ORDER BY
CASE WHEN name = '์ค์์ค' THEN 0 ELSE 1 END,
name;
๐ฅ ๊ฒฐ๊ณผ
| name | grade |
|---|---|
| ์ค์์ค | 3 |
| ๊ฐ๋ค์ | 2 |
| ๊น์ฒ ์ | 1 |
| ๋ฐ๋ฏผ์ค | 1 |
| ์ค์ง์ | 1 |
| ์ด์ํฌ | 2 |
| ์ํ์ฐ | 3 |
| ์ ์ํ | 2 |
| ์ต์ง์ | 3 |
| ํ์ง๋ฏผ | 1 |
ORDER BY grade DESC์ฒ๋ผ ๋จ์ ์ ๋ ฌ๋ก๋ ํน์ ๊ฐ์ ๋งจ ์๋ก ์ฌ๋ฆด ์ ์์ต๋๋ค.
CASE๋ฅผ ์ฐ๋ฉด ์ํ๋ ์์๋ฅผ ์ง์ ์ง์ ํ ์ ์์ด์!
๐น ์ง๊ณ ํจ์์ ํจ๊ป ์ฌ์ฉ
CASE๋ฅผ ์ง๊ณ ํจ์ ์์ ๋ฃ์ผ๋ฉด ์ฌ๋ฌ ์กฐ๊ฑด์ ํ ํ์ ๋๋ํ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
GROUP BY๋ก๋ ์ด๋ฐ ํํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต์ต๋๋ค.
SELECT
COUNT(CASE WHEN score IS NOT NULL THEN 1 END) AS ์์ํ์,
COUNT(CASE WHEN score IS NULL THEN 1 END) AS ๋ฏธ์์ํ์
FROM students;
๐ฅ ๊ฒฐ๊ณผ
| ์์ํ์ | ๋ฏธ์์ํ์ |
|---|---|
| 7 | 3 |
โน๏ธ CASE ์์์ THEN 1์ด ํ๋ ์ญํ
CASE๋ ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด 1์ ๋ฐํํ๊ณ , ELSE๋ฅผ ์๋ตํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด ์๋์ผ๋ก NULL์ ๋ฐํํฉ๋๋ค.
COUNT๋ NULL์ ๋ฌด์ํ๊ณ ๊ฐ์๋ฅผ ์ธ๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ตญ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์ ์๋ฅผ ์
๋๋ค.
| CASE ์กฐ๊ฑด | ๋ฐํ๊ฐ | COUNT๊ฐ ์ธ๋ ๊ฒ |
|---|---|---|
score IS NOT NULL | 1 ๋๋ NULL | ์์ํ ํ์ ์ |
score IS NULL | 1 ๋๋ NULL | ๋ฏธ์์ํ ํ์ ์ |
๐ก
THEN 1์๋ฆฌ์ ์ด๋ค ๊ฐ์ ๋ฃ์ด๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ต๋๋ค.
COUNT๋ ๊ฐ์ด ๋ญ์ง ์๊ด์์ด NULL์ด ์๋ ๊ฒ๋ง ์ธ๊ธฐ ๋๋ฌธ์ ๋๋ค.
โ ๋ง๋ฌด๋ฆฌ
| ๋จ์ CASE | ๊ฒ์ CASE | |
|---|---|---|
| ๋น๊ต ๋ฐฉ์ | ์ปฌ๋ผ = ๊ฐ (๋ฑํธ๋ง ๊ฐ๋ฅ) | ์กฐ๊ฑด์ ์์ ๋กญ๊ฒ ์์ฑ |
| ๋ฒ์ ์กฐ๊ฑด | ๋ถ๊ฐ | ๊ฐ๋ฅ (>=, BETWEEN ๋ฑ) |
| ๋ณตํฉ ์กฐ๊ฑด | ๋ถ๊ฐ | ๊ฐ๋ฅ (AND, OR) |
| ์ฌ์ฉ ๋น๋ | ๋จ์ ๋งคํ | ์ค๋ฌด์์ ๋ ๋ง์ด ์ฌ์ฉ |
๐ ์ฐธ๊ณ ์๋ฃ
'Database > SQL ๊ธฐ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL ๊ธฐ์ด - ์๋ธ์ฟผ๋ฆฌ(Subquery) (0) | 2026.03.31 |
|---|---|
| SQL ๊ธฐ์ด - JOIN (0) | 2026.03.27 |
| SQL ๊ธฐ์ด - BETWEEN, LIKE, IN (0) | 2026.03.21 |
| SQL ๊ธฐ์ด - WHERE (0) | 2026.03.20 |
| SQL ๊ธฐ์ด - ์ง๊ณ ํจ์(COUNT, AVG, SUM, MAX, MIN) (0) | 2026.03.20 |