๐ ์๋ธ์ฟผ๋ฆฌ(SubQuery)๋?
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ ๋ด์ ํฌํจ๋ ์ฟผ๋ฆฌ์ ๋๋ค. ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ๊ฑฐ๋ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ธ์ฟผ๋ฆฌ๋ ๊ดํธ๋ก ๋๋ฌ์ธ์ผ ํ๋ฉฐ, ๋น๊ต ์ฐ์ฐ์์ ์ค๋ฅธ์ชฝ์ ์์นํด์ผ ํฉ๋๋ค.
- ์๋ธ์ฟผ๋ฆฌ๋ SELECT, FROM, HAVING, ORDER BY ์ ์์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ORDER BY ์ ์ ์๋ธ์ฟผ๋ฆฌ ๋ด์ ํฌํจ๋ ์ ์์ผ๋ฉฐ, ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๋ ์ฃผ ์ฟผ๋ฆฌ์ ๋ง์ง๋ง์ ์์นํด์ผ ํฉ๋๋ค.
- ์ฐ๊ด ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์ ์ฐธ์กฐํ์ฌ ์กฐ๊ฑด์ ์ ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ์ ๋๋ค.
1๏ธโฃ ๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ํ๋์ ํ์ ๋ฐํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋จ์ผํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- `=`, `<>`, `>`, `<`, `>=`, `<=`
-- ์ด ์ฟผ๋ฆฌ๋ ์ง์์ ๊ธ์ฌ๊ฐ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋์ ์ง์ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
SELECT employee_id, first_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
2๏ธโฃ ๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ํ์ ๋ฐํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ค์คํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- `IN` : ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด๊ฐ๊ณผ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค. ํ๋ ์ด์์ ์ผ์น๊ฐ ์์ผ๋ฉด ํด๋น ํ์ ๋ฐํํฉ๋๋ค.
-- ์ด ์ฟผ๋ฆฌ๋ 'David'๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ์ง์์ด ์์๋ ๋ถ์์ ๋ชจ๋ ์ง์ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
SELECT *
FROM employees
WHERE department_id IN (SELECT department_id FROM employees WHERE first_name = 'David');
- `ANY` : ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค ํ๋๋ผ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ ํด๋น ํ์ ๋ฐํํฉ๋๋ค.
-- ์ด ์ฟผ๋ฆฌ๋ 'David'์ ๊ธ์ฌ ์ค ์ต์๊ฐ๋ณด๋ค ํฐ ๋ชจ๋ ์ง์์ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
SELECT *
FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE first_name = 'David');
-- ์ด ์ฟผ๋ฆฌ๋ 'David'์ ๊ธ์ฌ ์ค ์ต๋๊ฐ๋ณด๋ค ์์ ๋ชจ๋ ์ง์์ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
SELECT *
FROM employees
WHERE salary < ANY (SELECT salary FROM employees WHERE first_name = 'David');
- `ALL` : ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ ํด๋น ํ์ ๋ฐํํฉ๋๋ค.
-- ์ด ์ฟผ๋ฆฌ๋ 'David'์ ๊ธ์ฌ ์ค ์ต๋๊ฐ๋ณด๋ค ํฐ ๋ชจ๋ ์ง์์ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
SELECT *
FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE first_name = 'David');
-- ์ด ์ฟผ๋ฆฌ๋ 'David'์ ๊ธ์ฌ ์ค ์ต์๊ฐ๋ณด๋ค ์์ ๋ชจ๋ ์ง์์ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
SELECT *
FROM employees
WHERE salary < ALL (SELECT salary FROM employees WHERE first_name = 'David');
- `EXISTS` : ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋น์ด ์์ง ์์์ง ํ์ธํฉ๋๋ค. ๋น์ด ์์ง ์์ผ๋ฉด ํด๋น ํ์ ๋ฐํํฉ๋๋ค.
-- ์ด ์ฟผ๋ฆฌ๋ ํด๋น ๋ถ์์ ์ง์์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง ์ง์ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
SELECT employee_id, first_name
FROM employees e
WHERE EXISTS (SELECT * FROM departments d WHERE e.department_id = d.department_id);
3๏ธโฃ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ(Scalar SubQuery) : SELECT ์ ์์ ๋จ์ผ ๊ฐ ๋ฐํ
- ์ค์นผ๋ผ: ๋จ์ผ ๊ฐ์ ์๋ฏธํฉ๋๋ค.
- ์ ์: `SELECT` ์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ๋ก, ์ฃผ๋ก ๋จ์ํ `JOIN`์ ๋์ฒดํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฅ์ : ํน์ ํ ์ด๋ธ์ 1๊ฐ ์ปฌ๋ผ๋ง ๊ฐ์ ธ์ฌ ๋ JOIN๋ณด๋ค ๋ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
-- `JOIN`์ ์ฌ์ฉํ์ฌ ์ง์๊ณผ ๋ถ์ ์ ๋ณด๋ฅผ ํจ๊ป ์กฐํโจ
SELECT E.FIRST_NAME,
D.DEPARTMENT_NAME
FROM EMPLOYEES E
JOIN DEPARTMENTS D ON D.DEPARTMENT_ID = E.DEPARTMENT_ID;
-- `์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ`๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ์ด๋ฆ๊ณผ ๋ถ์ ์ด๋ฆ ์กฐํโจ
SELECT FIRST_NAME,
(SELECT DEPARTMENT_NAME
FROM DEPARTMENTS D
WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID) AS DEPARTMENT_NAME
FROM EMPLOYEES E;
4๏ธโฃ ์ธ๋ผ์ธ ๋ทฐ(Inline View) : FROM ์ ์์ ํ ์ด๋ธ์ฒ๋ผ ์ทจ๊ธ
- ์ ์: ์ธ๋ผ์ธ ๋ทฐ๋ `FROM` ์ ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ํ ์ด๋ธ ๋๋ ๋ทฐ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋น๊ต: ๋ทฐ๋ ๋ ๋ฆฝ์ ์ธ SELECT ๋ฌธ์ผ๋ก, FROM ์ ์ ์ค๋ ์๋ธ์ฟผ๋ฆฌ๋ ํ๋์ ๋ทฐ๋ก ๊ฐ์ฃผํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก FROM ์ ์ ์ค๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
- ํ์ฉ: ์ธ๋ผ์ธ ๋ทฐ๋ ๊ฒ์ํ ํ์ด์ง๊ณผ ๊ฐ์ ๋ค์ํ ์ํฉ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
-- ๊ฒ์ํ ํ์ด์ง : 11๋ฒ์งธ๋ถํฐ 20๋ฒ์งธ ๊ฒ์๊ธ ์กฐํ
SELECT *
FROM (
SELECT ROWNUM AS RN, -- ROWNUM์ ๊ฐ์ ธ์์ RN์ด๋ผ๋ ๋ณ์นญ์ ๋ถ์ฌ (ROWNUM์ 1๋ถํฐ ์์ํ๋ฏ๋ก ์ค๊ฐ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ์ ์์โจ)
TITLE,
CONTENT
FROM (
SELECT TITLE, CONTENT
FROM POSTS
ORDER BY CREATED_DATE DESC -- ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ์ฌ ์ต์ ๊ฒ์๊ธ์ด ๋จผ์ ์ค๋๋ก ํจโจ
)
)
WHERE RN BETWEEN 11 AND 20; -- โRN์ ๊ธฐ์ค์ผ๋ก 11๋ฒ์งธ๋ถํฐ 20๋ฒ์งธ ๊ฒ์๊ธ์ ์กฐํโจ
'๐ฒDB_SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL] ์๋์ฐ ํจ์(ROW_NUMBER, RANK, LAG, CUME_DIST ๋ฑ) (0) | 2024.08.26 |
---|---|
[SQL] ์งํฉ ์ฐ์ฐ์(UNION, UNION ALL, INTERSPECT, EXCEPT) (0) | 2024.08.25 |
[๐๋ชฉ์ฐจ] SQL ์๊ฒฉ๊ฒ์ ์ค์ ๋ฌธ์ (0) | 2024.08.24 |
[SQLD] SQL ์๊ฒฉ๊ฒ์ ์ค์ ๋ฌธ์ 69p 56๋ฒ ๋ฌธ์ ํด์ค(UNION) (0) | 2024.08.23 |