๐ ์๋ธ์ฟผ๋ฆฌ (Subquery)
WHERE score > AVG(score) โ ๋ฑ ๋ ๊ฒ ๊ฐ์๋ฐ ์ค์ ๋ก ์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฉ๋๋ค ๐ฑ
WHERE ์ ์์๋ ์ง๊ณ ํจ์๋ฅผ ์ง์ ์ธ ์ ์๊ฑฐ๋ ์... ์ด๋ด ๋ ์๋ธ์ฟผ๋ฆฌ๋ก ๋จผ์ ํ๊ท ์ ๊ตฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์กฐ๊ฑด์ผ๋ก ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค!
๐ ์์ ํ
์ด๋ธ โ 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);
โผ๏ธ ์ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ์๋ ์์๋ฅผ ์ค๋ช ํฉ๋๋ค.
๐ง ์๋ธ์ฟผ๋ฆฌ๋?
์๋ธ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ ์์ ํฌํจ๋ ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ์
๋๋ค.
๊ดํธ ()๋ก ๊ฐ์ธ์ ์ฌ์ฉํ๋ฉฐ, ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ธฐ ์ ์ ๋จผ์ ์คํ๋ฉ๋๋ค.
๐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
SELECT ์ปฌ๋ผ
FROM ํ
์ด๋ธ
WHERE ์ปฌ๋ผ = (SELECT ์ปฌ๋ผ FROM ํ
์ด๋ธ WHERE ์กฐ๊ฑด);
๐น WHERE ์ ์์ ์๋ธ์ฟผ๋ฆฌ
์กฐ๊ฑด ๊ฐ์ ๋์ ์ผ๋ก ๊ตฌํ ๋ ์๋๋ค.
1๏ธโฃ ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ โ ๊ฒฐ๊ณผ๊ฐ 1ํ์ธ ๊ฒฝ์ฐ
=, >, < ๊ฐ์ ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
์ ์ฒด ํ๊ท ์ ์๋ณด๋ค ๋์ ํ์ ์กฐํ
SELECT name, score
FROM students
WHERE score > (SELECT AVG(score) FROM students);
๐ฅ ๊ฒฐ๊ณผ
| name | score |
|---|---|
| ๊น์ฒ ์ | 85 |
| ๋ฐ๋ฏผ์ค | 90 |
| ์ค์์ค | 95 |
| ๊ฐ๋ค์ | 88 |
์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ : 81.8571
๋ฉ์ธ ์ฟผ๋ฆฌ๋ ์ด ๊ฐ๋ณด๋ค ๋์ score๋ฅผ ๊ฐ์ง ํ์๋ง ๋ฐํํฉ๋๋ค.
2๏ธโฃ ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ โ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ํ์ธ ๊ฒฝ์ฐ
IN, ANY, ALL ๊ฐ์ ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
1ํ๋ ํ์๋ค์ ์ ์ ์ค ํ๋๋ผ๋ ๊ฐ์ ์ ์๋ฅผ ๊ฐ์ง ํ์ ์กฐํ
SELECT name, score, grade
FROM students
WHERE score IN (SELECT score FROM students WHERE grade = 1);
๐ฅ ๊ฒฐ๊ณผ
| name | score | grade |
|---|---|---|
| ๊น์ฒ ์ | 85 | 1 |
| ๋ฐ๋ฏผ์ค | 90 | 1 |
| ์ต์ง์ | 72 | 3 |
| ํ์ง๋ฏผ | 78 | 1 |
| ์ค์ง์ | 65 | 1 |
์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ: 85, 90, 78, 65 (1ํ๋
์ score ๋ชฉ๋ก)
๋ฉ์ธ ์ฟผ๋ฆฌ๋ ์ด ๋ชฉ๋ก์ ํฌํจ๋ score๋ฅผ ๊ฐ์ง ๋ชจ๋ ํ์์ ๋ฐํํฉ๋๋ค.
โ ๏ธ ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ์ ๋ค์คํ์ด ๋ฐํ๋๋ฉด?
๋จ์ผํ ์ฐ์ฐ์(=, > ๋ฑ)๋ฅผ ์ฐ๋๋ฐ ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ํ์ด๋ฉด ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.
์ฌ๋ฌ ํ์ด ๋ฐํ๋ ์ ์๋ค๋ฉด ๋ฐ๋์ IN, ANY, ALL์ ์ฌ์ฉํ์ธ์.
๐ ์๋ธ์ฟผ๋ฆฌ์ ํจ๊ป ์ฐ๋ ์ฐ์ฐ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐น SELECT ์ ์์ ์๋ธ์ฟผ๋ฆฌ
๊ฐ ํ๋ง๋ค ๊ณ์ฐ๋ ๊ฐ์ ์ปฌ๋ผ์ฒ๋ผ ์ถ๊ฐํ ๋ ์๋๋ค.
๊ฐ ํ์์ ์ ์์ ์ ์ฒด ํ๊ท ์ ์๋ฅผ ํจ๊ป ์กฐํ
SELECT name, score,
(SELECT ROUND(AVG(score), 4) FROM students) AS ์ ์ฒดํ๊ท
FROM students
WHERE score IS NOT NULL;
๐ฅ ๊ฒฐ๊ณผ
| name | score | ์ ์ฒดํ๊ท |
|---|---|---|
| ๊น์ฒ ์ | 85 | 81.8571 |
| ๋ฐ๋ฏผ์ค | 90 | 81.8571 |
| ์ต์ง์ | 72 | 81.8571 |
| ํ์ง๋ฏผ | 78 | 81.8571 |
| ์ค์์ค | 95 | 81.8571 |
| ๊ฐ๋ค์ | 88 | 81.8571 |
| ์ค์ง์ | 65 | 81.8571 |
SELECT ์ ์ ์๋ธ์ฟผ๋ฆฌ๋ ๋ฐ๋์ ๋จ์ผ ๊ฐ(1ํ 1์ด)์ ๋ฐํํด์ผ ํฉ๋๋ค.
๐น FROM ์ ์์ ์๋ธ์ฟผ๋ฆฌ (์ธ๋ผ์ธ ๋ทฐ)
์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋์ ๋ณ์นญ(alias)์ ๋ถ์ฌ์ผ ํด์!
ํ๋ ๋ณ ํ๊ท ์ ์๊ฐ 80์ ์ด์์ธ ํ๋ ์กฐํ
SELECT grade, ํ๊ท ์ ์
FROM (
SELECT grade, ROUND(AVG(score), 4) AS ํ๊ท ์ ์
FROM students
GROUP BY grade
) AS ํ๋
๋ณํ๊ท
WHERE ํ๊ท ์ ์ >= 80;
๐ฅ ๊ฒฐ๊ณผ
| grade | ํ๊ท ์ ์ |
|---|---|
| 2 | 88.0000 |
| 3 | 83.5000 |
์๋ธ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ํ๋ ๋ณ ํ๊ท ์ ๊ตฌํ ๋ค,
๋ฉ์ธ ์ฟผ๋ฆฌ์์ 80์ ์ด์์ธ ํ๋ ๋ง ํํฐ๋งํฉ๋๋ค.
โ ๋ง๋ฌด๋ฆฌ
| ๊ตฌ๋ถ | ๋ฐํ ๊ฒฐ๊ณผ | ์ฌ์ฉ ์ฐ์ฐ์ | ์์ |
|---|---|---|---|
| ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ | 1ํ 1์ด | =, >, <, >=, <= |
= (SELECT AVG(score) ...) |
| ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ | ์ฌ๋ฌ ํ | IN, ANY, ALL |
IN (SELECT score ...) |
| ์์น | ์ฉ๋ |
|---|---|
| WHERE ์ | ์กฐ๊ฑด ๊ฐ์ ๋์ ์ผ๋ก ๊ตฌํ ๋ |
| SELECT ์ | ๊ฐ ํ์ ๊ณ์ฐ๋ ๊ฐ์ ์ถ๊ฐํ ๋ |
| FROM ์ | ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ ์ด๋ธ๋ก ์ฌ์ฉํ ๋ |
์๋ธ์ฟผ๋ฆฌ๋ ๊ดํธ ์์์ ๋จผ์ ์คํ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ์ฌ์ฉํฉ๋๋ค๐
๐ ์ฐธ๊ณ ์๋ฃ
'Database > SQL ๊ธฐ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL ๊ธฐ์ด - AND, OR, NOT (0) | 2026.04.07 |
|---|---|
| SQL ๊ธฐ์ด - IN, EXISTS, ANY, ALL (0) | 2026.03.31 |
| SQL ๊ธฐ์ด - JOIN (0) | 2026.03.27 |
| SQL ๊ธฐ์ด - CASE (0) | 2026.03.23 |
| SQL ๊ธฐ์ด - BETWEEN, LIKE, IN (0) | 2026.03.21 |