๋ถ์ง์ (SubQuery)
๐ญ Subquery (๋ถ์ง์)
๐ญ Subquery (๋ถ์ง์)
์ฃผ๋ก where ์กฐ๊ฑด์ ์์ฉํ๋ ํ๋์ ์ฟผ๋ฆฌ๋ก์จ, ๋ด๋ถ์ง์๋ฅผ ํตํด ์ธ๋ถ์ ๋ณธ ๋ชฉ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ํด์ํ ์ ์๊ฒ ํ๋๊ฒ.
โ๏ธ ์์น์ ์ผ๋ก๋ ์๋ธ์ฟผ๋ฆฌ ๋ด์์ order by ์ ์ ํฌํจํ ์ ์๋ค.
โ๏ธ ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ
๋ฉ์ธ ์ฟผ๋ฆฌ๋ก ์ ๋ฌ ๋๋ ํ์ด ํ๋์ผ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
โ๏ธ ์๋ธ์ฟผ๋ฆฌ์์ ๋ฉ์ธ์ฟผ๋ฆฌ๋ก์ ์ ๋ฌ์ ์ฃผ๋ก ํ๋์ ์คํผ๋ ์ดํฐ๋ก ์ด๋ฃจ์ด์ง๋ค.
โ ์๋ธ ์ฟผ๋ฆฌ ์ฌ์ฉ์ ์ ์์
FROM ์ ์ ์ค๋ ํ ์ด๋ธ ์์น์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ alias์ํจ ํ ์ด๋ธ์ ์ ์ธํ์ฌ ์ฌ์ฉ ํ๋ ๋ฐฉ๋ฒ๋ ์์์ ์ ์ํ์.
๐ ์ค์ต๋ฌธ์ 1. ํ์ฌ ์ ์ฒด์ฌ์์ ํ๊ท ์ฐ๋ด๋ณด๋ค ์ ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ์ด๋ฆ, ๊ธ์ฌ๋ฅผ ๋ํ๋ด์ธ์.
SELECT Concat(a.first_name, ' ', a.last_name) AS NAME,
b.salary
FROM employees a,
salaries b
WHERE a.emp_no = b.emp_no
AND b.to_date = '9999-01-01'
AND b.salary < (SELECT Avg(salary)
FROM salaries
WHERE to_date = '9999-01-01');
SELECT Min(avg_salary)
FROM (SELECT Round(Avg(a.salary)) AS avg_salary
FROM salaries a,
titles b
WHERE a.emp_no = b.emp_no
AND a.to_date = '9999-01-01'
AND b.to_date = '9999-01-01'
GROUP BY b.title) a;
๐ค ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ
๋ฉ์ธ์ฟผ๋ฆฌ๋ก์ ์ ๋ฌ ๋๋ ์๋ธ์ฟผ๋ฆฌ์ ํ์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ ๋ค์คํ ์ฐ์ฐ์
IN
ANY
ALL
์ ์ฌ์ฉํ๋ค.
๐ ํ์ฌ 50000 ๋ณด๋ค ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ์ด๋ฆ๊ณผ ๊ธ์ฌ๋ฅผ ๊ตฌํ์ธ์
SELECT a.first_name,
b.salary
FROM employees a,
salaries b
WHERE a.emp_no = b.emp_no
AND b.to_date = '9999-01-01'
AND ( a.emp_no, b.salary ) IN (SELECT emp_no,
salary
-- 'in(sub_query)' <-> ='any(sub_query)'
FROM salaries
WHERE to_date = '9999-01-01'
AND salary >= 50000);
โ๏ธ ์๋ธ์ฟผ๋ฆฌ์์ SELECTํ ์์ฑ์ผ๋ก ์ด๋ฃจ์ด์ง ํ ์ด๋ธ์ ์ฐธ์กฐ ํ์ฌ WHERE์ ์์ ํด๋น ์ปฌ๋ผ์ ์ ํํด ํ๋ณ ํ ์ ์๋ค.