๐ ์๋ธ์ฟผ๋ฆฌ์ ํจ๊ป ์ฐ๋ ์ฐ์ฐ์ โ 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 ...) |
๐ ์ฐธ๊ณ ์๋ฃ
'Database > SQL ๊ธฐ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL ๊ธฐ์ด - SELECT INTO (ํ ์ด๋ธ ๋ณต์ฌ) (0) | 2026.04.16 |
|---|---|
| SQL ๊ธฐ์ด - AND, OR, NOT (0) | 2026.04.07 |
| SQL ๊ธฐ์ด - ์๋ธ์ฟผ๋ฆฌ(Subquery) (0) | 2026.03.31 |
| SQL ๊ธฐ์ด - JOIN (0) | 2026.03.27 |
| SQL ๊ธฐ์ด - CASE (0) | 2026.03.23 |