Database/SQL ๊ธฐ์ดˆ

SQL ๊ธฐ์ดˆ - CASE

UNarD 2026. 3. 23. 12:49

๐Ÿ”€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•?

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 NULL1 ๋˜๋Š” NULL์‘์‹œํ•œ ํ•™์ƒ ์ˆ˜
score IS NULL1 ๋˜๋Š” NULL๋ฏธ์‘์‹œํ•œ ํ•™์ƒ ์ˆ˜

๐Ÿ’ก THEN 1 ์ž๋ฆฌ์— ์–ด๋–ค ๊ฐ’์„ ๋„ฃ์–ด๋„ ๊ฒฐ๊ณผ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค.
COUNT๋Š” ๊ฐ’์ด ๋ญ”์ง€ ์ƒ๊ด€์—†์ด NULL์ด ์•„๋‹Œ ๊ฒƒ๋งŒ ์„ธ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


โ˜• ๋งˆ๋ฌด๋ฆฌ

๋‹จ์ˆœ CASE ๊ฒ€์ƒ‰ CASE
๋น„๊ต ๋ฐฉ์‹ ์ปฌ๋Ÿผ = ๊ฐ’ (๋“ฑํ˜ธ๋งŒ ๊ฐ€๋Šฅ) ์กฐ๊ฑด์‹ ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑ
๋ฒ”์œ„ ์กฐ๊ฑด ๋ถˆ๊ฐ€ ๊ฐ€๋Šฅ (>=, BETWEEN ๋“ฑ)
๋ณตํ•ฉ ์กฐ๊ฑด ๋ถˆ๊ฐ€ ๊ฐ€๋Šฅ (AND, OR)
์‚ฌ์šฉ ๋นˆ๋„ ๋‹จ์ˆœ ๋งคํ•‘ ์‹ค๋ฌด์—์„œ ๋” ๋งŽ์ด ์‚ฌ์šฉ

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ