Database/SQL ๊ธฐ์ดˆ

SQL ๊ธฐ์ดˆ - ์„œ๋ธŒ์ฟผ๋ฆฌ(Subquery)

UNarD 2026. 3. 31. 15:02

๐Ÿ” ์„œ๋ธŒ์ฟผ๋ฆฌ (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