๐ ์๋ธ์ฟผ๋ฆฌ๋?
![[SQL] ์๋ธ์ฟผ๋ฆฌ๋? ์๋ธ์ฟผ๋ฆฌ ์ข
๋ฅ - ์ค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ - ๐ ์๋ธ์ฟผ๋ฆฌ๋? [SQL] ์๋ธ์ฟผ๋ฆฌ๋? ์๋ธ์ฟผ๋ฆฌ ์ข
๋ฅ - ์ค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ - ๐ ์๋ธ์ฟผ๋ฆฌ๋?](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
![[SQL] ์๋ธ์ฟผ๋ฆฌ๋? ์๋ธ์ฟผ๋ฆฌ ์ข
๋ฅ - ์ค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ - ๐ ์๋ธ์ฟผ๋ฆฌ๋? [SQL] ์๋ธ์ฟผ๋ฆฌ๋? ์๋ธ์ฟผ๋ฆฌ ์ข
๋ฅ - ์ค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ - ๐ ์๋ธ์ฟผ๋ฆฌ๋?](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์ข ์ํด์์ผ๋ฉฐ ๋ฉ์ธ์ฟผ๋ฆฌ ์์ด๋ ๋จ๋ ์ ์ผ๋ก ์คํ๋ ์ ์๋ค.
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์นผ๋ผ์ ์ฌ์ฉํ ์ ์์ง๋ง, ๋ฐ๋๋ก ๋ฉ์ธ์ฟผ๋ฆฌ๋ ์๋ธ์ฟผ๋ฆฌ์ ์นผ๋ผ์ ์ฌ์ฉํ ์ ์๋ค.
(์์ํด๋์ค๋ ๋ถ๋ชจํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋ถ๋ชจํด๋์ค๋ ์์ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ์๋ฐ์ ์์๊ด๊ณ์ ๋น์ท) - ์๋ธ์ฟผ๋ฆฌ์ ์ข ๋ฅ๋ ํฌ๊ฒ 3๊ฐ์ง (์ค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ)๋ก ์ด๋ ์์น์์ ์ฌ์ฉํ๋๋์ ๋ฐ๋ผ ๋ถ๋ฅ๋จ.
![[SQL] ์๋ธ์ฟผ๋ฆฌ๋? ์๋ธ์ฟผ๋ฆฌ ์ข
๋ฅ - ์ค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ - ๐ ์๋ธ์ฟผ๋ฆฌ๋? [SQL] ์๋ธ์ฟผ๋ฆฌ๋? ์๋ธ์ฟผ๋ฆฌ ์ข
๋ฅ - ์ค์นผ๋ผ, ์ธ๋ผ์ธ ๋ทฐ, ์ค์ฒฉ - ๐ ์๋ธ์ฟผ๋ฆฌ๋?](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
์ข ๋ฅ | ์ค๋ช |
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ (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';
๐ ์ถ์ฒ
[Oracle] ์๋ธ์ฟผ๋ฆฌ์ ์ข ๋ฅ - ( ์ค์นผ๋ผ, ์ธ๋ผ์ธ๋ทฐ, ์ค์ฒฉ )
์๋ธ์ฟผ๋ฆฌ๋ ๋ฌด์์ธ๊ฐ? ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์ํด ์์ผ๋ฉฐ ๋ถ๋ชจ์ ์์๊ฐ์ ๊ณ์ธต์ ์ธ ๊ด๊ณ์ด๋ค. ์์์ด ๋ถ๋ชจ์ ์ํด์๋๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์ข ์๋๊ธฐ ๋๋ฌธ์ ๋จ๋ ์ ์ผ๋ก...
yunamom.tistory.com
์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ(Subquery)๋ ํ๋์ SQL๋ฌธ์์ ํฌํจ๋์ด ์๋ ๋ ๋ค๋ฅธ SQL๋ฌธ์ ๋งํ๋ค. ์๋ธ์ฟผ๋ฆฌ๋ ์๋ ค์ง์ง ์์ ๊ธฐ์ค์ ์ด์ฉํ ๊ฒ์์ ์ํด ์ฌ์ฉํ๋ค. ์๋ธ์ฟผ๋ฆฌ๋ [๊ทธ๋ฆผ โ ก-2-12]์ ๊ฐ์ด ๋ฉ์ธ์ฟผ๋ฆฌ๊ฐ ์๋ธ...
dataonair.or.kr
[Oracle] ์ค๋ผํด ์๋ธ์ฟผ๋ฆฌ ์ข ๋ฅ ๋ฐ ์ฌ์ฉ๋ฒ (SubQuery)
์ค๋ผํด์์ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋ค ๋ณด๋ฉด ์๋ธ ์ฟผ๋ฆฌ(subquery)๋ฅผ ์์ฃผ ์ ํ๊ฒ ๋๋ค. ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฒ์ ์ ํ๋ฉด ์์ฃผ ๋ณต์กํ๊ฒ ๋๊ปด์ง๋๋ฐ, ๊ธฐ๋ฅ์ ์กฐ๊ธ๋ง ์ตํ๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ ๋ ์์ฃผ ์ ์ฉํ๊ฒ ์ฌ์ฉ...
gent.tistory.com
'DB & SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JDBC Driver์ Java Application๊ณผ DB์ ์ค๊ฐ๋ค๋ฆฌ ์ญํ ์ ํ๋ค. (0) | 2024.12.05 |
---|---|
[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 |
๋๊ธ