์๋ธ์ฟผ๋ฆฌ (Sub Query)
SQL๋ฌธ ๋ด๋ถ์ ์ฌ์ฉํ๋ SELECT ๋ฌธ
์๋ธ์ฟผ๋ฆฌ ๋ถ๋ฅ
โข
์คํ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
โฆ
๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ
โฆ
๋ค์คํ ์๋ธ์ฟผ๋ฆฌ
โช
โข
์ฌ์ฉ ์์น์ ๋ฐ๋ฅธ ๋ถ๋ฅ
โฆ
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
โฆ
์ธ๋ผ์ธ ๋ทฐ
โฆ
์๋ธ ์ฟผ๋ฆฌ
์คํ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
โข
๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ : ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๊ฐ ํ๋์ธ ์๋ธ์ฟผ๋ฆฌ
โข
๋ค์คํ ์๋ธ์ฟผ๋ฆฌ : ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ํ์ธ ์๋ธ์ฟผ๋ฆฌ
์ฐ์ฐ | ์ค๋ช
|
IN | ํด๋น ์ปฌ๋ผ๊ณผ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ด ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๋ ์ฐ์ฐ |
ANY | A ๋น๊ต์ฐ์ฐ ANY B: ๋น๊ตํ ๊ฒฐ๊ณผ ์ค, ํ๋ ๋ง์ด๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ A๋ฅผ ๊ตฌํ๋ ์ฐ์ฐ |
ALL | A ๋น๊ต์ฐ์ฐ ALL B: ๋น๊ตํ ๊ฒฐ๊ณผ ์ค, ๋ชจ๋ ๋ฐ์ดํฐ์ ๋ํด ์กฐ๊ฑด์ ๋ง์กฑํ๋ A๋ฅผ ๊ตฌํ๋ ์ฐ์ฐ |
EXISTS | ์๋ธ์ฟผ๋ฆฌ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ง ์กฐํํ๋ ์ฐ์ฐ |
์ฌ์ฉ ์์น์ ๋ฐ๋ฅธ ๋ถ๋ฅ
โข
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ : SELECT ์ ์์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ
โข
์ธ๋ผ์ธ ๋ทฐ : FROM ์ ์์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ
โข
์๋ธ ์ฟผ๋ฆฌ : WHERE ์ ์์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ ์์์ฝ๋
โข
๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ
โข
๋ค์คํ ์๋ธ์ฟผ๋ฆฌ
โฆ
IN
โฆ
ANY
โฆ
ALL
โฆ
EXISTS
โข
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
โข
์ธ๋ผ์ธ ๋ทฐ
โข
์๋ธ์ฟผ๋ฆฌ
๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ
์ง์ ํ
์ด๋ธ์์ ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ์ด๋ฆ๊ณผ ํด๋น ๋ถ์ ID๋ฅผ ์กฐํํ๊ณ , ๊ทธ ๋ถ์์ ์ด๋ฆ์ ํจ๊ป ์ถ๋ ฅํ์ญ์์ค.
SELECT e.first_name,
e.department_id,
(SELECT department_name
FROM departments d
WHERE d.department_id = e.department_id) AS department_name
FROM employees e
WHERE e.salary = (SELECT MAX(salary) FROM employees);
SQL
๋ณต์ฌ
์ด ์์์์๋ ๋จผ์ ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ๊ธ์ฌ๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์กฐํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ธ์ฌ์ ์ผ์นํ๋ ์ง์์ ์ด๋ฆ๊ณผ ๋ถ์ ID๋ฅผ ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ ํํ๊ณ , ๋ถ์ ํ
์ด๋ธ์ ์๋ธ์ฟผ๋ฆฌ๋ก ์ฌ์ฉํ์ฌ ํด๋น ๋ถ์์ ์ด๋ฆ์ ์ฐพ์ ์ถ๋ ฅํฉ๋๋ค.
๋ค์คํ ์๋ธ์ฟผ๋ฆฌ
IN
3000๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ด ์ํ ๋ถ์์ ๋ถ์ ID์ ๋ถ์ ์ด๋ฆ์ ์กฐํํ๋, ๋ถ์ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ญ์์ค.
SELECT department_id, department_name
FROM departments d
WHERE d.department_id IN (SELECT e.department_id
FROM employees e
WHERE e.salary > 3000)
ORDER BY d.department_name;
SQL
๋ณต์ฌ
1.
departments ํ
์ด๋ธ์์ department_id์ department_name ์ด์ ์ ํํฉ๋๋ค.
2.
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ํ
์ด๋ธ(employees)์์ ๊ธ์ฌ๊ฐ 3000๋ณด๋ค ๋์ ์ง์์ ๋ถ์ ID๋ฅผ ์ ํํฉ๋๋ค.
3.
๋ฉ์ธ ์ฟผ๋ฆฌ์์๋ ๋ถ์ ํ
์ด๋ธ์์ ์ ํ๋ ๋ถ์ ID๋ฅผ ๊ฐ์ง ๋ถ์๋ง์ ํํฐ๋งํฉ๋๋ค.
4.
๋ง์ง๋ง์ผ๋ก ๋ถ์ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํฉ๋๋ค.
ANY
EMPLOYEE ํ
์ด๋ธ์ DEPT_CODE ๊ฐ 'D9' ์ธ ๋ถ์์ ์ต์ ๊ธ์ฌ ๋ณด๋ค ๋ ํฐ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ์กฐํํ์์ค.
SELECT e.emp_id ์ฌ์๋ฒํธ
,e.emp_name ์ง์๋ช
,d.dept_id ๋ถ์๋ฒํธ
,d.dept_title ๋ถ์๋ช
,TO_CHAR(e.salary, '999,999,999') ๊ธ์ฌ
FROM employee e
,department d
WHERE e.dept_code = d.dept_id
AND e.salary > ANY (
SELECT salary
FROM employee
WHERE dept_code = 'D9'
)
SQL
๋ณต์ฌ
1.
employee ํ
์ด๋ธ(e)๊ณผ department ํ
์ด๋ธ(d)์ ์กฐ์ธํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ง์์ ๋ถ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
2.
์ง์์ ์ฌ์๋ฒํธ(emp_id), ์ง์๋ช
(emp_name), ๋ถ์๋ฒํธ(dept_id), ๋ถ์๋ช
(dept_title), ๊ทธ๋ฆฌ๊ณ ๊ธ์ฌ(salary)๋ฅผ ์ ํํฉ๋๋ค.
3.
WHERE ์ ์์๋ ๋ค์์ ์ํํฉ๋๋ค:
โข
e ํ
์ด๋ธ๊ณผ d ํ
์ด๋ธ์ dept_code์ dept_id๊ฐ ์ผ์นํ๋ ํ๋ง ์ ํํฉ๋๋ค.
โข
e ํ
์ด๋ธ์ ๊ธ์ฌ๊ฐ 'D9' ๋ถ์์ ์ด๋ค ์ง์์ ๊ธ์ฌ๋ณด๋ค ๋์ ๊ฒฝ์ฐ๋ฅผ ์ ํํฉ๋๋ค.
4.
TO_CHAR ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธ์ฌ๋ฅผ ํน์ ํ์์ผ๋ก ๋ณํํฉ๋๋ค. ์ด ๊ฒฝ์ฐ, '999,999,999' ํ์์ ์ฌ์ฉํ์ฌ ๊ธ์ก์ 3์๋ฆฌ๋ง๋ค ์ผํ๋ก ๊ตฌ๋ถ๋ ํ์์ผ๋ก ํ์ํฉ๋๋ค.
์ด ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ 'D9' ๋ถ์์ ์ด๋ค ์ง์์ ๊ธ์ฌ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ๋ชจ๋ ์ง์์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
ALL
EMPLOYEE ํ
์ด๋ธ์ DEPT_CODE ๊ฐ 'D1' ์ธ ๋ถ์์ ์ต๋๊ธ์ฌ ๋ณด๋ค ๋ ํฐ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ์กฐํํ์์ค.
SELECT e.emp_id ์ฌ์๋ฒํธ
,e.emp_name ์ง์๋ช
,d.dept_id ๋ถ์๋ฒํธ
,d.dept_title ๋ถ์๋ช
,TO_CHAR(e.salary, '999,999,999') ๊ธ์ฌ
FROM employee e, department d
WHERE e.dept_code = d.dept_id
AND e.salary > ALL (
SELECT salary
FROM employee
WHERE dept_code = 'D1'
)
;
SQL
๋ณต์ฌ
1.
employee ํ
์ด๋ธ(e)๊ณผ department ํ
์ด๋ธ(d)์ ์กฐ์ธํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ง์์ ๋ถ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
2.
์ง์์ ์ฌ์๋ฒํธ(emp_id), ์ง์๋ช
(emp_name), ๋ถ์๋ฒํธ(dept_id), ๋ถ์๋ช
(dept_title), ๊ทธ๋ฆฌ๊ณ ๊ธ์ฌ(salary)๋ฅผ ์ ํํฉ๋๋ค.
3.
WHERE ์ ์์๋ ๋ค์์ ์ํํฉ๋๋ค:
โข
e ํ
์ด๋ธ๊ณผ d ํ
์ด๋ธ์ dept_code์ dept_id๊ฐ ์ผ์นํ๋ ํ๋ง ์ ํํฉ๋๋ค.
โข
e ํ
์ด๋ธ์ ๊ธ์ฌ๊ฐ 'D1' ๋ถ์์ ๋ชจ๋ ์ง์์ ๊ธ์ฌ๋ณด๋ค ๋์ ๊ฒฝ์ฐ๋ฅผ ์ ํํฉ๋๋ค.
4.
TO_CHAR ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธ์ฌ๋ฅผ ํน์ ํ์์ผ๋ก ๋ณํํฉ๋๋ค. ์ด ๊ฒฝ์ฐ, '999,999,999' ํ์์ ์ฌ์ฉํ์ฌ ๊ธ์ก์ 3์๋ฆฌ๋ง๋ค ์ผํ๋ก ๊ตฌ๋ถ๋ ํ์์ผ๋ก ํ์ํฉ๋๋ค.
์ด ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ 'D1' ๋ถ์์ ๋ชจ๋ ์ง์์ ๊ธ์ฌ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ๋ชจ๋ ์ง์์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
EXISTS
๊ธ์ฌ๊ฐ 3000๋ณด๋ค ๋์ ์ง์์ด ์ํ ๋ถ์์ ๋ถ์ ID์ ๋ถ์ ์ด๋ฆ์ ์กฐํํ์ญ์์ค. ๋จ, ๋ถ์ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ญ์์ค. EXISTS๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ ํ
์ด๋ธ๊ณผ ์ง์ ํ
์ด๋ธ์ ๊ด๊ณ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
SELECT department_id, department_name
FROM departments d
WHERE EXISTS(SELECT *
FROM employees e
WHERE e.department_id = d.department_id
AND e.salary > 3000 )
ORDER BY d.department_name;
SQL
๋ณต์ฌ
1.
๋ถ์ ํ
์ด๋ธ(departments)์ ๊ธฐ์ค์ผ๋ก ์์ํฉ๋๋ค.
2.
EXISTS ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ถ์์ ๋ํด ๋ค์์ ํ์ธํฉ๋๋ค:
โข
์ง์ ํ
์ด๋ธ(employees)์์ ํด๋น ๋ถ์์ ์ง์์ด ๊ธ์ฌ๊ฐ 3000๋ณด๋ค ๋์์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
3.
๋ง์ฝ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ฐธ(์ฆ, ์ ์ด๋ ํ ๋ช
์ ์ง์์ด ๊ธ์ฌ๊ฐ 3000๋ณด๋ค ๋์ ๊ฒฝ์ฐ)์ด๋ฉด, ํด๋น ๋ถ์๋ฅผ ๊ฒฐ๊ณผ์ ํฌํจํฉ๋๋ค.
4.
WHERE ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ชจ๋ ๋ถ์์ ๋ถ์ ID์ ๋ถ์ ์ด๋ฆ์ ์ ํํฉ๋๋ค.
5.
๋ง์ง๋ง์ผ๋ก ๋ถ์ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํฉ๋๋ค.
์ด ์ฟผ๋ฆฌ๋ ๊ฐ ๋ถ์์ ๋ํด ๊ธ์ฌ๊ฐ 3000๋ณด๋ค ๋์ ์ง์์ด ์ ์ด๋ ํ ๋ช
์ด์ ์๋ ๊ฒฝ์ฐ ํด๋น ๋ถ์์ ๋ถ์ ID์ ๋ถ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
์ง์ ํ
์ด๋ธ์์ ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ์กฐํ
SELECT employee_name,
salary,
(SELECT MAX(salary) FROM employees) AS max_salary
FROM employees;
SQL
๋ณต์ฌ
์ด ์์์์๋ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ํ
์ด๋ธ์์ ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ์กฐํํฉ๋๋ค. ์ด ๊ฐ์ ๊ฐ ์ง์์ ํ์ ํฌํจ์์ผ ์ถ๋ ฅํฉ๋๋ค.
์ธ๋ผ์ธ ๋ทฐ
์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธ์ฌ๊ฐ 3000 ์ด์์ธ ์ฌ์์ ์ ๋ณด๋ฅผ ์กฐํํ๋, ๋ถ์ ํ
์ด๋ธ๊ณผ ์กฐ์ธํ์ฌ ๋ถ์์ ๋ถ์๋ช
์ ํจ๊ป ์ถ๋ ฅํ์์ค.
SELECT e.employee_id,
e.employee_name,
d.department_name
FROM (
SELECT * FROM employees
WHERE salary > 3000
) e
JOIN departments d ON e.department_id = d.department_id;
SQL
๋ณต์ฌ
1.
๋ด๋ถ์์๋ ๊ธ์ฌ๊ฐ 3000 ์ด์์ธ ๋ชจ๋ ์ฌ์์ ์ ํํ๋ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.
2.
์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ e๋ผ๋ ๋ณ์นญ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
3.
๋ฉ์ธ ์ฟผ๋ฆฌ์์๋ ์ ํ๋ ์ฌ์๋ค(e)๊ณผ ๋ถ์ ํ
์ด๋ธ(departments)์ ์กฐ์ธํฉ๋๋ค.
4.
์ด๋, ์ฌ์ ํ
์ด๋ธ(e)์ ๋ถ์ ID์ ๋ถ์ ํ
์ด๋ธ(d)์ ๋ถ์ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์กฐ์ธํฉ๋๋ค.
5.
์กฐ์ธ ๊ฒฐ๊ณผ๋ก๋ ์ฌ์์ ์ฌ์ ๋ฒํธ(employee_id), ์ฌ์๋ช
(employee_name), ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ถ์์ ๋ถ์๋ช
(department_name)์ด ์ ํ๋ฉ๋๋ค.
์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ถ์๋ณ๋ก ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ๊ฐ์ง ์ฌ์๋ค์ ๋ถ์ ID์ ์ต๋ ๊ธ์ฌ๋ฅผ ์กฐํํ์์ค.
SELECT e.employee_id,
e.employee_name,
e.salary,
e.department_id
FROM employees e
WHERE (e.department_id, e.salary) IN (
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
);
SQL
๋ณต์ฌ
1.
๋ฉ์ธ ์ฟผ๋ฆฌ์์๋ ์ง์ ํ
์ด๋ธ(employees)์ ๊ธฐ์ค์ผ๋ก ์์ํฉ๋๋ค.
2.
WHERE ์ ์์๋ ๋ค์์ ์ํํฉ๋๋ค:
โข
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๋ถ์๋ณ๋ก ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ์กฐํํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ง์ ํ
์ด๋ธ์ ๋ถ์๋ณ๋ก ๊ทธ๋ฃนํํ๊ณ ๊ฐ ๊ทธ๋ฃน์์ ์ต๋ ๊ธ์ฌ๋ฅผ ์ฐพ์ต๋๋ค.
โข
๋ฉ์ธ ์ฟผ๋ฆฌ์์๋ ๋ถ์๋ณ๋ก ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์๋ค์ ๋ถ์ ID์ ๊ธ์ฌ๋ฅผ ์ ํํฉ๋๋ค.
โข
์ด๋ฅผ ์ํด ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ง์ ํ
์ด๋ธ์์ (๋ถ์ ID, ๊ธ์ฌ) ์์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์ผ์นํ๋ ํ์ ์ ํํฉ๋๋ค.
3.
์ ํ๋ ํ์๋ ์ฌ์ ๋ฒํธ(employee_id), ์ฌ์๋ช
(employee_name), ๊ธ์ฌ(salary), ๊ทธ๋ฆฌ๊ณ ๋ถ์ ID(department_id)๊ฐ ํฌํจ๋ฉ๋๋ค.
์ด ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ก๋ ๊ฐ ๋ถ์๋ณ๋ก ๊ฐ์ฅ ๋์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์๋ค์ ์ ๋ณด๋ง์ด ์ ํ๋ฉ๋๋ค.