Database/SQL ๊ธฐ์ดˆ

SQL ๊ธฐ์ดˆ - IN, EXISTS, ANY, ALL

UNarD 2026. 3. 31. 18:02

๐Ÿ”Ž ์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ํ•จ๊ป˜ ์“ฐ๋Š” ์—ฐ์‚ฐ์ž โ€” IN, EXISTS, ANY, ALL

OR๋กœ ์กฐ๊ฑด์„ ํ•˜๋‚˜์”ฉ ๋‚˜์—ดํ•˜๋‹ค ๋ณด๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ๋์—†์ด ๊ธธ์–ด์งˆ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ํ•™์ƒ๋“ค๋งŒ ์กฐํšŒํ•˜๋ ค๋ฉด... ๐Ÿ‘‡๐Ÿ‘‡

SELECT name FROM students
WHERE name = '๊น€์ฒ ์ˆ˜' OR name = '๋ฐ•๋ฏผ์ค€' OR name = '์œค์„œ์ค€' OR name = '๊ฐ•๋‹ค์€';

๋ฐ˜๋ณต๋˜๋Š” name = ๊ณผ OR... ๋ญ”๊ฐ€ ์ข€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์—†๋‚˜... ์ƒ๊ฐํ•ด ๋ณด์‹ ์  ์—†๋‚˜์š”? ๐Ÿ˜‚
๋ฐ”๋กœ ์ด๋Ÿด ๋•Œ IN ๊ฐ™์€ ์—ฐ์‚ฐ์ž๋ฅผ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ํ•จ๊ป˜ ์ž์ฃผ ์“ฐ์ด๋Š” IN, EXISTS, ANY, ALL์„ ํ•œ๋ฒˆ์— ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค!

๐Ÿ“‹ ์˜ˆ์‹œ ํ…Œ์ด๋ธ”

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

teachers ํ…Œ์ด๋ธ”

id name subject
1 ๊น€์„ ์ƒ ์ˆ˜ํ•™
2 ์ด์„ ์ƒ ์˜์–ด
3 ๋ฐ•์„ ์ƒ ๊ณผํ•™
CREATE DATABASE IF NOT EXISTS practice;
USE practice;

DROP TABLE IF EXISTS students;
DROP TABLE IF EXISTS teachers;

CREATE TABLE teachers (
    id      INT,
    name    VARCHAR(10),
    subject VARCHAR(10)
);

CREATE TABLE students (
    id         INT,
    name       VARCHAR(10),
    grade      INT,
    score      INT,
    teacher_id INT
);

INSERT INTO teachers VALUES (1, '๊น€์„ ์ƒ', '์ˆ˜ํ•™');
INSERT INTO teachers VALUES (2, '์ด์„ ์ƒ', '์˜์–ด');
INSERT INTO teachers VALUES (3, '๋ฐ•์„ ์ƒ', '๊ณผํ•™');

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);

โ€ผ๏ธ ์œ„ ๋‘ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ์˜ˆ์‹œ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น IN

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ชฉ๋ก ์•ˆ์— ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽ€ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

WHERE ์ปฌ๋Ÿผ IN (์„œ๋ธŒ์ฟผ๋ฆฌ)
๋‹ด๋‹น ์„ ์ƒ๋‹˜์ด ์žˆ๋Š” ํ•™์ƒ ์กฐํšŒ
SELECT name, teacher_id
FROM students
WHERE teacher_id IN (SELECT id FROM teachers);
๐Ÿ“ฅ ๊ฒฐ๊ณผ
name teacher_id
๊น€์ฒ ์ˆ˜ 1
์ด์˜ํฌ 1
๋ฐ•๋ฏผ์ค€ 2
์ •์ˆ˜ํ˜„ 2
ํ•œ์ง€๋ฏผ 1
์œค์„œ์ค€ 2
๊ฐ•๋‹ค์€ 1
์ž„ํ˜„์šฐ 2

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ: 1, 2, 3 (teachers.id ๋ชฉ๋ก)
teacher_id๊ฐ€ ์ด ๋ชฉ๋ก์— ํฌํ•จ๋œ ํ•™์ƒ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

NULL์ธ ์ตœ์ง€์›, ์˜ค์ง€์•„๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

1ํ•™๋…„์ด ์•„๋‹Œ ํ•™์ƒ ์กฐํšŒ (NOT IN)
SELECT name, grade
FROM students
WHERE grade NOT IN (SELECT grade FROM students WHERE grade = 1);
๐Ÿ“ฅ ๊ฒฐ๊ณผ
name grade
์ด์˜ํฌ 2
์ตœ์ง€์› 3
์ •์ˆ˜ํ˜„ 2
์œค์„œ์ค€ 3
๊ฐ•๋‹ค์€ 2
์ž„ํ˜„์šฐ 3

NOT IN์€ ๋ชฉ๋ก์— ํฌํ•จ๋˜์ง€ ์•Š์€ ํ–‰์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ NOT IN ์‚ฌ์šฉ ์‹œ ์ฃผ์˜

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— NULL์ด ํฌํ•จ๋˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ IN vs EXISTS ๋น„๊ต๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.


๐Ÿ”น EXISTS

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
๊ฐ’ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํ–‰์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด TRUE๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽ€ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

WHERE EXISTS (์„œ๋ธŒ์ฟผ๋ฆฌ)
๋‹ด๋‹น ์„ ์ƒ๋‹˜์ด ์žˆ๋Š” ํ•™์ƒ ์กฐํšŒ
SELECT name, teacher_id
FROM students s
WHERE EXISTS (
    SELECT 1 FROM teachers t
    WHERE t.id = s.teacher_id
);
โ„น๏ธ SELECT 1์ด ๋ญ”๊ฐ€์š”?

EXISTS๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋งŒ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ SELECT 1, SELECT *, SELECT id ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ก€์ ์œผ๋กœ SELECT 1์„ ๋งŽ์ด ์”๋‹ˆ๋‹ค.

๐Ÿ“ฅ ๊ฒฐ๊ณผ
name teacher_id
๊น€์ฒ ์ˆ˜ 1
์ด์˜ํฌ 1
๋ฐ•๋ฏผ์ค€ 2
์ •์ˆ˜ํ˜„ 2
ํ•œ์ง€๋ฏผ 1
์œค์„œ์ค€ 2
๊ฐ•๋‹ค์€ 1
์ž„ํ˜„์šฐ 2
๋‹ด๋‹น ์„ ์ƒ๋‹˜์ด ์—†๋Š” ํ•™์ƒ ์กฐํšŒ (NOT EXISTS)
SELECT name, teacher_id
FROM students s
WHERE NOT EXISTS (
    SELECT 1 FROM teachers t
    WHERE t.id = s.teacher_id
);
๐Ÿ“ฅ ๊ฒฐ๊ณผ
name teacher_id
์ตœ์ง€์› NULL
์˜ค์ง€์•„ NULL

๐Ÿ”น ANY

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด TRUE๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽ€ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

WHERE ์ปฌ๋Ÿผ ๋น„๊ต์—ฐ์‚ฐ์ž ANY (์„œ๋ธŒ์ฟผ๋ฆฌ)
3ํ•™๋…„ ์ ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ณด๋‹ค ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํ•™์ƒ ์กฐํšŒ
SELECT name, score
FROM students
WHERE score > ANY (
    SELECT score FROM students
    WHERE grade = 3 AND score IS NOT NULL
);
๐Ÿ“ฅ ๊ฒฐ๊ณผ
name score
๊น€์ฒ ์ˆ˜ 85
๋ฐ•๋ฏผ์ค€ 90
ํ•œ์ง€๋ฏผ 78
์œค์„œ์ค€ 95
๊ฐ•๋‹ค์€ 88

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ: 72, 95 (3ํ•™๋…„ ์ ์ˆ˜)

72๋ณด๋‹ค๋งŒ ํฌ๋ฉด ํ†ต๊ณผ โ†’ 5๋ช… ๋ฐ˜ํ™˜


๐Ÿ”น ALL

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ชจ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ TRUE๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽ€ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

WHERE ์ปฌ๋Ÿผ ๋น„๊ต์—ฐ์‚ฐ์ž ALL (์„œ๋ธŒ์ฟผ๋ฆฌ)
1ํ•™๋…„ ์ ์ˆ˜ ๋ชจ๋‘๋ณด๋‹ค ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํ•™์ƒ ์กฐํšŒ
SELECT name, score
FROM students
WHERE score > ALL (
    SELECT score FROM students
    WHERE grade = 1 AND score IS NOT NULL
);
๐Ÿ“ฅ ๊ฒฐ๊ณผ
name score
์œค์„œ์ค€ 95

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ: 85, 90, 78, 65 (1ํ•™๋…„ ์ ์ˆ˜)

90๋ณด๋‹ค ์ปค์•ผ ํ†ต๊ณผ โ†’ ์œค์„œ์ค€(95)๋งŒ ๋ฐ˜ํ™˜


๐Ÿ‘๏ธ IN vs EXISTS ๋น„๊ต

IN EXISTS
ํ™•์ธ ๋ฐฉ์‹ ๊ฐ’์ด ๋ชฉ๋ก์— ํฌํ•จ๋˜๋Š”์ง€ ํ–‰์ด ์กด์žฌํ•˜๋Š”์ง€
NULL ์ฒ˜๋ฆฌ NULL ํฌํ•จ ์‹œ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ NULL ์˜ํ–ฅ ์—†์Œ
์ฃผ๋กœ ์‚ฌ์šฉ ๋ชฉ๋ก์ด ์ž‘์„ ๋•Œ ์—ฐ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ

๐Ÿšจ NOT IN์—์„œ NULL ์ฃผ์˜

NOT IN์€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— NULL์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SQL์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋Š” TRUE / FALSE / UNKNOWN ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
NULL์€ "๊ฐ’์ด ์—†๋‹ค"๋Š” ์˜๋ฏธ๋ผ์„œ ์–ด๋–ค ๊ฐ’๊ณผ ๋น„๊ตํ•ด๋„ ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โš ๏ธ teachers.id์— NULL์ด ์žˆ์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ ์•ˆ ๋จ
SELECT name FROM students
WHERE teacher_id NOT IN (1, 2, NULL) -- teacher_id != 1 AND teacher_id != 2 AND teacher_id != NULL

WHERE ์ ˆ์€ TRUE์ธ ํ–‰๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ , UNKNOWN์€ FALSE์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋˜์–ด ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ NOT IN ๋ชฉ๋ก์— NULL์ด ์žˆ์œผ๋ฉด ๋ชจ๋“  ๋น„๊ต๊ฐ€ UNKNOWN์ด ๋˜์–ด ๊ฒฐ๊ณผ๊ฐ€ ๋น„์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ์กฐ๊ฑด์ด ํ•ญ์ƒ UNKNOWN โ†’ ์ „์ฒด๊ฐ€ UNKNOWN โ†’ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ ์•ˆ ๋จ

โœ… ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” NOT EXISTS๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์•ˆ์ „
SELECT name FROM students s
WHERE NOT EXISTS (
    SELECT 1 FROM teachers t
    WHERE t.id = s.teacher_id
);

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

์—ฐ์‚ฐ์ž ์˜๋ฏธ ์˜ˆ์‹œ
IN ๋ชฉ๋ก์— ํฌํ•จ๋˜๋ฉด TRUE WHERE id IN (SELECT id ...)
EXISTS ํ–‰์ด ์กด์žฌํ•˜๋ฉด TRUE WHERE EXISTS (SELECT 1 ...)
ANY ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด ๋งŒ์กฑํ•˜๋ฉด TRUE WHERE score > ANY (SELECT score ...)
ALL ๋ชจ๋‘ ์กฐ๊ฑด ๋งŒ์กฑํ•ด์•ผ TRUE WHERE score > ALL (SELECT score ...)

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