์๋ธ์ฟผ๋ฆฌ (SubQuery)
SQL ๋ฌธ์ฅ (SQL Statement) ์์์ ๋ณด์กฐ๋ก ์ฌ์ฉ๋๋ ๋ ๋ค๋ฅธ SELECT๋ฌธ์ ์๋ฏธํ๋ฉฐ, ์๋ฅผ ๋ค์ด ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ฉ์ธ ์ฟผ๋ฆฌ๋ผ๊ณ ํ๋ค๋ฉด ์ด๋ฅผ ์ํ ์ค๊ฐ ๋จ๊ณ ํน์ ๋ณด์กฐ ์ญํ ์ ํ๋ SELECT๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ๋ผ ํ๋ ๊ฒ์ด๋ค.
์ฆ, ํ๋์ SQL๋ฌธ์ ๊ธฐ์ค์ผ๋ก ๋ฉ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋ชจ๋ SELECT๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ณด๋ฉด ๋๋ฉฐ, ์๋ธ์ฟผ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
โ [์ฐธ๊ณ ] ํ ์ด๋ธ ์ฐธ์กฐ
์กฐ์ธ (Join)์ ์กฐ์ธ์ ์ฐธ์ฌํ๋ ๋ชจ๋ ํ ์ด๋ธ์ด ๋๋ฑํ ๊ด๊ณ์ ์๊ธฐ ๋๋ฌธ์ ์กฐ์ธ์ ์ฐธ์ฌํ๋ ๋ชจ๋ ํ ์ด๋ธ์ ์ปฌ๋ผ์ ์ด๋ ์์น์์๋ผ๋ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ๊ฐ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ํฌํจํ๋ ์ข ์์ ์ธ ๊ด๊ณ๋ก ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ง๋ง ๋ฉ์ธ ์ฟผ๋ฆฌ์์๋ ์๋ธ ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์ ์ฌ์ฉํ ์ ์๋ค.
์ ํํ๋ ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ธฐ ์ ์ ๋จผ์ ์คํ๋๋ฏ๋ก ์๋ธ์ฟผ๋ฆฌ์์๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋ชจ๋ ์ปฌ๋ผ์ ์ฐธ์กฐํ ์ ์๋ ๊ฒ์ด๋ค.
โ [์ฐธ๊ณ ] ์๋ธ์ฟผ๋ฆฌ ์์ฑ ์๋ น
์๋ธ์ฟผ๋ฆฌ๋ ๊ดํธ๋ก ๋ฌถ์ด์ ๊ทธ ์์์ ์ฌ์ฉํ๋ค.
์๋ธ์ฟผ๋ฆฌ๋ ๋จ์ผํ (Single Row) ๋๋ ๋ณต์ํ (Multi Row) ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๐ ๋จ์ผ ํ : =, >, <, >=, <=, !=, <>
๐ ๋ณต์ ํ : IN, NOT IN, ANY, ALL, EXISTS
๐ ์๋ธ์ฟผ๋ฆฌ๋ ORDER BY์ ์ ํฌํจํ ์ ์๋ค. (์ฌ์ฉํ ์ ์๋ค!)
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์์น
- SELECT ๋๋ DELETE๋ฌธ์ FROM์
- FROM์
- WHERE์
- HAVING์
- ORDER BY์
- INSERT๋ฌธ์ VALUES
- UPDATE๋ฌธ์ SET
- MERGE๋ฌธ
์๋ธ์ฟผ๋ฆฌ ๊ตฌ๋ถ
์๋ธ์ฟผ๋ฆฌ๋ ๋ค์ํ ํํ๋ก ์ฌ์ฉ๋๋ฏ๋ก ๊ทธ ํน์ฑ๊ณผ ํํ์ ๋ฐ๋ผ ์๋์ ๊ฐ์ด ์ฌ๋ฌ ๋ฒ์ฃผ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ฐ๊ด์ฑ์ ๋ฐ๋ฅธ ์๋ธ์ฟผ๋ฆฌ
- ์ฐ๊ด์ฑ ์๋ (Non-correlated) ์๋ธ์ฟผ๋ฆฌ = ๋น์๊ด ์๋ธ์ฟผ๋ฆฌ
๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ฐ๊ด์ฑ์ด ์๋ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ๋งํ๋ฉฐ, ์ฆ ๋ฉ์ธ ํ ์ด๋ธ๊ณผ ์กฐ์ธ ์กฐ๊ฑด์ด ๊ฑธ๋ฆฌ์ง ์๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ์ฐ๊ด์ฑ ์๋ (Correlated) ์๋ธ์ฟผ๋ฆฌ = ์๊ด ์๋ธ์ฟผ๋ฆฌ
๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ฐ๊ด์ฑ์ด ์๋ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ๋งํ๋ฉฐ, ์ฆ ๋ฉ์ธ ํ ์ด๋ธ๊ณผ ์กฐ์ธ ์กฐ๊ฑด์ด ๊ฑธ๋ฆฐ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์์น์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ
- ์ผ๋ฐ ์๋ธ์ฟผ๋ฆฌ
์ฃผ๋ก WHERE, HAVING์ ์์ ์ฌ์ฉ
- ์ธ๋ผ์ธ ๋ทฐ – FROM์
FROM์ ์์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ธ๋ผ์ธ ๋ทฐ (Inline View) ๋ผ๊ณ ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก FROM์ ์๋ ํ ์ด๋ธ ๋ช ์ด ์ค๋๋ก ๋์ด ์์ง๋ง ์๋ธ์ฟผ๋ฆฌ๊ฐ FROM์ ์ ์ฌ์ฉ๋๋ฉด ๋ทฐ์ฒ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋์ ์ผ๋ก ์์ฑ๋ ํ ์ด๋ธ๋ก ์ฌ์ฉํ ์ ์๊ณ ์์์ ์ธ ๋ทฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ง๋ ์๋๋ค.
์ธ๋ผ์ธ ๋ทฐ๋ ๋์ ์ผ๋ก ์์ฑ๋ ํ ์ด๋ธ์ด๊ธฐ์ “Dynamic View” ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ ํนํ, ๋ฉ์ธ์ฟผ๋ฆฌ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ ์ ์์ง๋ง ์ธ๋ผ์ธ ๋ทฐ๋ ํ ์ด๋ธ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ์ฟผ๋ฆฌ์์ ํด๋น ์๋ธ์ฟผ๋ฆฌ (์ธ๋ผ์ธ ๋ทฐ)๋ฅผ ์ฐธ์กฐํ ์ ์๋ค๋ ์ฐจ์ด์ ์ด ์๋ค!
๐ ๋ค๋ง, ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ํ ์ด๋ธ ์ด๋ฆ์ด ์์ผ๋ฏ๋ก ์๋ฆฌ์ด์ค(๋ณ์นญ)์ ์ฌ์ฉํด์ผ ์ฐธ์กฐํ ์ ์๋ค!
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ – SELECT๋ฌธ (์ปฌ๋ผ)
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ SELECT๋ฌธ์ ์ค๋ ์๋ธ์ฟผ๋ฆฌ๋ก ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ํ๋์ ๊ฐ๋ง (๋จ์ผ ํ, ๋จ์ผ ์ปฌ๋ผ) ๋ฐํํ๋ ๊ฒ์ด ํน์ง์ด๋ค.
๋น์๊ด ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ, ๋จ์ผ ๊ฐ์ด ๋ฉ์ธ ์ฟผ๋ฆฌ์ ROW ์ ๋งํผ ๋ฐ๋ณต๋์ด ์คํ๋๋ฉฐ ์๊ด ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ํ๋์ ํ๋ง๋ค ํ๋์ ๊ฐ์ ๋ฐํํ๋ฉฐ ๋ง์ฝ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์๋ค๋ฉด NULL ๊ฐ์ ๋ฆฌํดํ๊ฒ ๋๋ค.
๋ฐํ ๊ฐ์ ๋ฐ๋ฅธ ์๋ธ์ฟผ๋ฆฌ
- ๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ (Single Row SubQuery)
์๋ธ์ฟผ๋ฆฌ์์ ํ ํ์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ๋ง ๋ฐํํ๋ ๊ฒ์ ๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ ๋ผ๊ณ ํ๋ค.
๋ฉ์ธ ์ฟผ๋ฆฌ์ WHERE ์ ์์ ์ฌ์ฉํ๋ค๋ฉด ๋จ์ผ ํ ๋น๊ต ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ (Multiple Row SubQuery)
์๋ธ์ฟผ๋ฆฌ์์ ์ฌ๋ฌ ํ์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ ๋ผ๊ณ ํ๋ค.
๋ฉ์ธ ์ฟผ๋ฆฌ์ WHERE ์ ์์ ์ฌ์ฉํ๋ค๋ฉด ๋ค์ค ํ ๋น๊ต ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค!
- ๋ค์ค ์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ (Multi Column SubQuery)
์๋ธ์ฟผ๋ฆฌ์์ ์ฌ๋ฌ ์ด์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ๋ค์ค ์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ ๋ผ๊ณ ํ๋ค.
์ฌ๋ฌ ๊ฐ์ ์ปฌ๋ผ์์ ํ๋์ ํ ํน์ ์ฌ๋ฌ ๊ฐ์ ํ์ ๋ฐํํ๋ฏ๋ก ๋ฉ์ธ ์ฟผ๋ฆฌ์ WHERE ์ ์์ ์ฌ์ฉํ๋ค๋ฉด ํ๋์ ํ์ ๋ฐํํ๋ ๊ฒฝ์ฐ, ๋จ์ผํ ๋น๊ต ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ ์ฌ๋ฌ ํ์ ๋ฐํํ๋ ๊ฒฝ์ฐ, ๋ค์ค ํ ๋น๊ต ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๋ํ, ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ปฌ๋ผ ๊ฐ์์ ์๋ธ ์ฟผ๋ฆฌ์์ ๋ฐํํ๋ ์ปฌ๋ผ ๊ฐ์ ๊ทธ๋ฆฌ๊ณ ์ ํ์ด ๊ฐ์์ผ ํ๋ค!
โ [์ฐธ๊ณ ] ANY, ALL ์ฐ์ฐ์
ANY, ALL ์ฐ์ฐ์๋ ์ฝ๊ฐ ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, SALARY
FROM EMPLOYEES
WHERE SALARY [<, >, =] ANY[ALL] (SELECT SALARY ......)
→ “< ANY” : ์ต๋๊ฐ๋ณด๋ค ์์์ ์๋ฏธ “> ANY” : ์ต์๊ฐ๋ณด๋ค ํผ์ ์๋ฏธ
“= ANY” : IN๊ณผ ๋์ผํจ
→ “> ALL” : ์ต๋๊ฐ๋ณด๋ค ํผ์ ์๋ฏธ “< ALL“ : ์ต์๊ฐ๋ณด๋ค ์์์ ์๋ฏธ
๋ํ, ๋ค์ค ํ ์ฐ์ฐ์์์ IN๊ณผ EXISTS ์ฐ์ฐ์์ ์ฐจ์ด์ ์ IN ์ฐ์ฐ์๋ ์ค์ ์กด์ฌํ๋ ๋ฐ์ดํฐ์ ๋ชจ๋ ๊ฐ์ ํ์ธํ๋ ๋ฐ๋ฉด EXISTS๋ ํด๋น ๊ฐ์ด ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ฉด ๋ ์ด์ ์ํ๋์ง ์๋๋ค๋ ์ ์ด๋ค!
โ [์ฐธ๊ณ ] ์๋ธ์ฟผ๋ฆฌ์ NULL ๊ฐ
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr)
์ ์์ ๋ ๋ถํ ์ง์์ด ์๋ ๋ชจ๋ ์ฌ์์ ํ์ํ๋ SQL๋ฌธ์ธ๋ฐ ๊ธฐ๋ํ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก๋ 12๊ฐ์ Row๋ฅผ ๋ฐํํด์ผ ํ์ง๋ง ์ด SQL๋ฌธ์ ์ด๋ ํ ๊ฒ๋ ๋ฐํํ์ง ์๋๋ค.
๊ทธ ์ด์ ๋ NULL ๊ฐ์ ๋น๊ตํ๋ ๋ชจ๋ ์กฐ๊ฑด์ด NULL์ ์ด๋ํ๊ธฐ ๋๋ฌธ์ด๊ณ ๋ฐ๋ผ์, NULL ๊ฐ์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ค ํฌํจ๋์ด ์๋ค๋ฉด NOT IN ์ฐ์ฐ์๋ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ค.
๋ฌผ๋ก , IN ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ NULL ๊ฐ์ด ํฌํจ๋๋๊ฑด ๋ฌธ์ ๋์ง ์๋๋ค!
'๐จโ๐ป Back End > MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด (0) | 2023.07.22 |
---|---|
Join (์กฐ์ธ) - ๋ด๋ถ ์กฐ์ธ (Inner Join) & ์ธ๋ถ ์กฐ์ธ (Outer Join) (0) | 2023.07.22 |
SELECT๋ฌธ ๊ตฌ์กฐ ๋ฐ ์คํ ์์ (0) | 2023.07.22 |
ERD (Entity-Relationship Diagram) (0) | 2023.07.21 |
๋ฐ์ดํฐ ๋ชจ๋ธ๋ง (0) | 2023.07.21 |