๐ ์๋ธ์ฟผ๋ฆฌ๋?
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์ข ์ํด์์ผ๋ฉฐ ๋ฉ์ธ์ฟผ๋ฆฌ ์์ด๋ ๋จ๋ ์ ์ผ๋ก ์คํ๋ ์ ์๋ค.
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์นผ๋ผ์ ์ฌ์ฉํ ์ ์์ง๋ง, ๋ฐ๋๋ก ๋ฉ์ธ์ฟผ๋ฆฌ๋ ์๋ธ์ฟผ๋ฆฌ์ ์นผ๋ผ์ ์ฌ์ฉํ ์ ์๋ค.
(์์ํด๋์ค๋ ๋ถ๋ชจํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋ถ๋ชจํด๋์ค๋ ์์ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ์๋ฐ์ ์์๊ด๊ณ์ ๋น์ท) - ์๋ธ์ฟผ๋ฆฌ์ ์ข ๋ฅ๋ ํฌ๊ฒ 3๊ฐ์ง (์ค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ)๋ก ์ด๋ ์์น์์ ์ฌ์ฉํ๋๋์ ๋ฐ๋ผ ๋ถ๋ฅ๋จ.
์ข ๋ฅ | ์ค๋ช |
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ (Scalar Suquery) |
SELECT ์ ์ ์์นํ๋ฉฐ ํ ๋ ์ฝ๋๋น ์ ํํ ํ๋์ ๊ฐ์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ (๋จ์ผํ, ๋จ์ผ์นผ๋ผ์ ๋ฐํ) |
์ธ๋ผ์ธ ๋ทฐ (Inline View) |
FROM ์ ์ ์์นํ๋ ์๋ธ์ฟผ๋ฆฌ๋ก ๊ฒฐ๊ณผ๋ ๋ฐ๋์ ํ๋์ ํ ์ด๋ธ๋ก ๋ฆฌํด๋์ด์ผ ํ๋ค. |
์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ (Nested Subquery) |
WHERE ์ ์ ์์นํ๋ฉฐ ๊ฒฐ๊ณผ์งํฉ์ ํ์ ํ๊ธฐ ์ํ ์๋ธ์ฟผ๋ฆฌ๋ก, ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ์ฟผ๋ฆฌ ์ปฌ๋ผ์ ์ฐธ์กฐํ ๋ ์๊ด๊ด๊ณ ์๋ ์๋ธ์ฟผ๋ฆฌ๋ผ๊ณ ํ๋ค. (๋จ์ผํ, ๋ค์คํ์ ๋ฐํ) |
1. ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ (Scalar Subquery)
- SELECT ์ ์ ์์นํ๋ฉฐ ์นผ๋ผ์ ์ญํ ์ ํ๋ฏ๋ก ํด๋น ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ๋ฐ๋์ ๋จ์ผ ํ or ๋จ์ผ ๊ฐ์ผ๋ก ๋ฆฌํด๋์ด์ผ ํ๋ค.
- ๐ฌ ๋ค์ค ํ ๊ฐ์ด ์กฐํ๋๋ฉด "ORA-01427: single-row subquery returns more than one row" ๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ฃผ์
SELECT name, (
SELECT score.math
FROM score
WHERE score.id = student.id
) AS score
FROM student
WHERE name = 'KIM';
2. ์ธ๋ผ์ธ ๋ทฐ (Inline View)
- FROM ์ ์ ์์นํ๋ฉฐ ํ ์ด๋ธ์ ์ผ๋ถ ๋ฐ์ดํฐ๋ง์ ๋ถ๋ฌ์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋จ์ํ ํ ์ ์์ผ๋ฉฐ, ์ฟผ๋ฆฌ์ ๊ฐ๋ ์ฑ์ด ๋๋ค.
- ํด๋น ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ๋ฐ๋์ ํ๋์ ํ ์ด๋ธ๋ก ๋ฆฌํด๋์ด์ผ ํ๋ค.
- ์ธ๋ผ์ธ ๋ทฐ๋ SQL๋ฌธ์ด ์คํ๋ ๋ ์์์ ์ผ๋ก ์์ฑ๋๋ ๋์ ์ธ ๋ทฐ ๋ก ์ด์ ๊ฐ์ ๋ทฐ๋ฅผ Dynamic View ๋ผ๊ณ ๋ถ๋ฅธ๋ค.(↔ ์ ์ ๋ทฐ(Static VIew))
- ์ฃผ์์ SQL์ ์ข๋ ๋น ๋ฅธ ์๋๋ก ์ฌ์ฉํ๊ธฐ ์ํ๊ฒ์ด ์ธ๋ผ์ธ ๋ทฐ์ด์ง๋ง, SQL์ ๊ตฌ์ฑํ ๋ ์๋ชป ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ก์ธ์ค ์๋๋ฅผ ์ ํ ์ํค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ฃผ์
SELECT e.name, e.title, d.name
FROM (SELECT name, title, dept_id
FROM s_emp
WHERE title = '์ฌ์') e, s_dept d
WHERE e.dept_id = d.id;
3. ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ (Nested Subquery)
- WHERE ์ ์์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ฉ์ธ์ฟผ๋ฆฌ ํ ์ด๋ธ์ ํน์ ์ปฌ๋ผ ๊ฐ๊ณผ ๋น๊ตํ ๊ฐ์ ๋ฐํํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
- ๋จ์ผํ / ๋ค์คํ ๋ ๋ค ๋ฆฌํด์ด ๊ฐ๋ฅํ๋ค.
3.1. Single Row SubQuery
- Single Row SubQuery๋ ์๋ธ์ฟผ๋ฆฌ์์ ๋ฉ์ธ์ฟผ๋ฆฌ๋ก ์ ๋ฌ๋๋ ํ์ด ๋จ ํ๋์ธ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- WHERE ์ ์ ๋จ์ผ ํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
SELECT name, title, dept_id
FROM s_emp
WHERE dept_id = (SELECT dept_id
FROM s_emp
WHERE name = 'jk');
3.2. Multi Row SubQuery
- Single Row SubQuery๋ ์๋ธ์ฟผ๋ฆฌ์์ ๋ฉ์ธ์ฟผ๋ฆฌ๋ก ์ ๋ฌ๋๋ ํ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- WHERE ์ ์ ๋ค์ค ํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
SELECT name, dept_id
FROM s_emp
WHERE dept_id IN (SELECT id
FROM s_dept
WHERE region_id = 3);
3.3. Multi-Column SubQuery
- Single Row SubQuery๋ ์๋ธ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์ ์์ฑํ ๋ WHERE ์ ์์ ๋น๊ตํ๋ ์นผ๋ผ์ด ํ๋๊ฐ ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ ์นผ๋ผ์ ๋์์ ๋น๊ตํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ฉฐ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ pair-wise ๋์๋ค๊ณ ํ๋ค.
SELECT name, dept_id, salary
FROM s_emp
WHERE (dept_id, salary) IN (SELECT dept_id, MIN(salary)
FROM s_emp
GROUP BY dept_id);
4. ๊ธฐํ ์๋ธ์ฟผ๋ฆฌ
4.1. HAVING ์ ์์์ SubQuery
SELECT dept_id, AVG(salary)
FROM s_emp
GROUP BY dept_id
HAVING AVG(salary) > (SELECT AVG(salary)
FROM s_emp
WHERE dept_id = 100);
4.2. CREATE ์ ์์์ SubQuery
- ํ ์ด๋ธ์ ์์ฑํ ๋ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ ๊ธฐ์กด์ ํ ์ด๋ธ์ ์ด์ฉํด์ ํน์ ์ปฌ๋ผ ๋๋ ํ๋ง์ผ๋ก ์ํ๋ ํ ์ด๋ธ์ ์์ฑํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ ์ ์ธํ๊ณ ํ ์ด๋ธ๋ง ์์ฑํ๋ ค๋ฉด ์กฐ๊ฑด์ ์ด ํญ์ ๊ฑฐ์ง์ด๊ฒ ํ๋ฉด ๋๋ค. → ex. WHERE 1 <> 1
- (์์ฑํ ํ ์ด๋ธ์ ์นผ๋ผ๋ช ์ ์๋ตํ๋ฉด, SELECT ๋ฌธ์ ์ปฌ๋ผ๋ช ๊ณผ ๋์ผํ๊ฒ ๋๋ค.)
CREATE TABLE emp_100 (id, name, mailid, start_date)
AS SELECT id, name, mailid, start_date
FROM s_emp
WHERE dept_id = 100;
Table created.
4.3. DML ๋ฌธ์์์ SubQuery
INSERT INTO emp_100
(id, name, mailid, start_date)
SELECT id, name, mailid, start_date
FROM s_emp
WHERE start_date < '24/05/18';
UPDATE s_emp
SET dept_id = (
SELECT dept_id
FROM s_emp
WHERE title = '๊ณผ์ฅ')
WHERE name = 'jk';
๐ ์ถ์ฒ
'DB & SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DB] MySQL testdb ์์ฑ (0) | 2024.05.18 |
---|---|
[DB] ํฐ๋ฏธ๋ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ ๊ธฐ๋ณธ์ ์ธ MySQL ์ฌ์ฉ๋ฐฉ๋ฒ๊ณผ zsh ํ๊ฒฝ๋ณ์ ์ค์ - macOS (2) | 2024.05.18 |
[DB] MySQL ์ค์น์ DB ์์ฑ, ์ฐ๊ฒฐ ๊ณผ์ - macOS (0) | 2024.05.18 |
Statement ๋์ PreparedStatement๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ (0) | 2024.01.30 |
DB connection ์์ URL์ด ์๋ฏธํ๋ ๊ฒ (0) | 2024.01.10 |
๋๊ธ