๐ก SUBQUERY
ํ SQL ๋ฌธ ๋ด ๋ค๋ฅธ SQL๋ฌธ์ด ๋ค์ด ์๋ ๊ฒฝ์ฐ
- ์๋ธ ์ฟผ๋ฆฌ ์กฐํ ๊ฒฐ๊ณผ๊ฐ 1์ธ ๊ฒฝ์ฐ
< *์์ ์ฝ๋* >
-- 1) ๋จ์ผํ ์๋ธ ์ฟผ๋ฆฌ
-- ์๋ธ ์ฟผ๋ฆฌ์ ์กฐํ ๊ฒฐ๊ณผ ๊ฐ์ ๊ฐ์๊ฐ 1
-- ์ ์ง์์ ํ๊ท ๊ธ์ฌ๋ณด๋ค ๋ ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๊ณ ์๋ ์ง์๋ค์ ์ฌ๋ฒ, ์ง์๋ช
, ์ง๊ธ ์ฝ๋, ๊ธ์ฌ
SELECT emp_no,
emp_name,
dept_code,
salary
FROM employee
WHERE salary > (
SELECT AVG(salary)
FROM employee
);
-- ๋
ธ์น์ฒ ์ฌ์๋ณด๋ค ๊ธ์ฌ๋ฅผ ๋ ๋ง์ด ๋ฐ๋ ์ง์์ ์ฌ๋ฒ ์ง์๋ช
๋ถ์๋ช
๊ธ์ฌ ์กฐํ
SELECT e.emp_id AS '์ฌ๋ฒ',
e.emp_name AS '์ง์๋ช
',
d.dept_title AS '๋ถ์๋ช
',
e.salary AS '๊ธ์ฌ'
FROM employee AS e
INNER JOIN department AS d ON e.dept_code = d.dept_id
WHERE e.salary > (
SELECT salary
FROM employee
WHERE emp_name LIKE '๋
ธ์น์ฒ '
);
-- 2) ๋ค์คํ ์๋ธ ์ฟผ๋ฆฌ
-- ์๋ธ ์ฟผ๋ฆฌ์ ์กฐํ ๊ฒฐ๊ณผ ๊ฐ์ ๊ฐ์๊ฐ ์ฌ๋ฌ ํ
-- ๊ฐ ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ์ด๋ฆ, ์ง๊ธ ์ฝ๋, ๋ถ์์ฝ๋, ๊ธ์ฌ ์กฐํ
SELECT MAX(salary)
FROM employee
GROUP BY dept_code; -- ๋ถ์ ๋ณ ์ต๊ณ ๊ธ์ฌ ์กฐํ
SELECT emp_name,
job_code,
dept_code,
salary
FROM employee
WHERE salary IN (
SELECT MAX(salary)
FROM employee
GROUP BY dept_code
);
-- ์ง์๋ค์ ์ฌ๋ฒ, ์ง์๋ช
, ๋ถ์ ์ฝ๋, ๊ตฌ๋ถ(์ฌ์/์ฌ์) ์กฐํ
SELECT DISTINCT manager_id
FROM employee
WHERE manager_id IS NOT NULL
;
SELECT emp_id,
emp_name,
dept_code,
manager_id,
IF(manager_id IN(
SELECT DISTINCT manager_id
FROM employee
WHERE manager_id IS NOT NULL
), '์ฌ์', '์ฌ์') AS '๊ตฌ๋ถ(์ฌ์/์ฌ์)'
FROM employee;
SELECT emp_id,
emp_name,
dept_code,
manager_id,
CASE
WHEN emp_id IN (
SELECT DISTINCT manager_id
FROM employee
WHERE manager_id IS NOT NULL
) THEN '์ฌ์'
ELSE '์ฌ์'
END AS '๊ตฌ๋ถ'
FROM employee;
-- ๋๋ฆฌ ์ง๊ธ์. ๊ณผ์ฅ ์ง๊ธ๋ค์ ์ต์ ๊ธ์ฌ๋ณด๋ค ๊ธ์ฌ๊ฐ ๋ง์ด ๋ฐ๋ ๋๋ฆฌ ์ง์์ ์ฌ๋ฒ, ์ด๋ฆ , ์ง๊ธ , ๊ธ์ฌ
SELECT e.job_code,
j.job_name,
MIN(salary)
FROM employee AS e
INNER JOIN job AS j ON e.job_code = j.job_code
GROUP BY j.job_code;
SELECT emp_id,
emp_name,
job_code,
salary
FROM employee
WHERE job_code LIKE 'J6' AND salary >= (
SELECT MIN(salary)
FROM employee
GROUP BY job_code
HAVING job_code LIKE 'J5'
);
SELECT emp_id,
emp_name,
job_code,
salary
FROM employee
WHERE job_code = 'J6'
AND salary > ANY(2200000, 2500000, 3760000);
-- ANY ์ฐ์ฐ์๋ ๊ฐ์ ๋ชฉ๋ก ์ค ํ๋๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์ฐธ์ด ๋จ.
-- ANY ์ค์์ 220, 250, 376๋ง์ ์ค ์ด๋ ํ๋๋ผ๋ ํฌ๋ฉด ์กฐํ ๊ฐ๋ฅ
SELECT emp_id,
emp_name,
job_code,
salary
FROM employee
WHERE job_code = 'J6' AND
salary > ANY(
SELECT salary
FROM employee
WHERE job_code = 'J5');
-- ๊ณผ์ฅ ์ง๊ธ์ ๊ธ์ฌ๋ค ์ค์์ ์ด๋ ํ๋์์๋ผ๋ salary๊ฐ ๋์ ๋๋ฆฌ ์ง๊ธ์ด ์๋ ๊ฒฝ์ฐ ์ฐธ
-- ๋๋ฆฌ ์ง๊ธ ์ค์ ๊ณผ์ฅ ์ง๊ธ์ salary ์ค์์ ํ๋๋ผ๋ ๋์ ๊ฐ์ด ์์ผ๋ฉด ์ฐธ
-- ๊ณผ์ฅ ์ง๊ธ์์๋ ์ฐจ์ฅ ์ง๊ธ์ ์ต๋ ๊ธ์ฌ๋ณด๋ค ๋ ๋ง์ด ๋ฐ๋ ์ง์๋ค์
-- ์ฌ๋ฒ, ์ง์๋ช
, ์ง๊ธ ์ฝ๋, ๊ธ์ฌ ์กฐํ
-- 1. ์ฐจ์ฅ ์ง๊ธ์ ๊ธ์ฌ ์กฐํ
SELECT emp_id,
emp_name,
job_code,
salary
FROM employee
WHERE job_code = 'J4'; -- 280, 155, 249, 248๋ง์์ฉ
-- ์ด ์ค์์ 280๋ง์๋ณด๋ค ๋ง์ด ๋ฐ๋ ์ฌ์์ ์กฐํํ ์์
-- ์์์๋ ANY๋ผ๋ ์ฐ์ฐ์ ์ผ์ผ๋ -> ์ด๋ฒ์๋ ALL() ์ด๋ผ๋ ์ฐ์ฐ์ ์ฌ์ฉํ ์์
SELECT emp_id,
emp_name,
job_code,
salary
FROM employee
WHERE job_code = 'J5'
AND salary > ALL (
SELECT salary
FROM employee
WHERE job_code = 'J4'
);
-- 3) ๋ค์ค์ด ์๋ธ ์ฟผ๋ฆฌ
-- ์๋ธ ์ฟผ๋ฆฌ์ ์กฐํ ๊ฒฐ๊ณผ ๊ฐ์ ํ ํ, ์ด์ ์๊ฐ ์ฌ๋ฌ๊ฐ
-- ํ์ด์ ์ฌ์๊ณผ ๊ฐ์ ๋ถ์ ์ฝ๋, ๊ฐ์ ์ง๊ธ ์ฝ๋์ ํด๋นํ๋ ์ฌ์๋ค์ ์กฐํ
SELECT emp_name,
job_code,
dept_code
FROM employee
WHERE emp_name LIKE 'ํ์ด์ '; -- J5, D5์ธ ์ฌ์ ์กฐํ
SELECT emp_name,
job_code,
dept_code
FROM employee
WHERE (dept_code, job_code) IN (
SELECT dept_code,
job_code
FROM employee
WHERE emp_name LIKE 'ํ์ด์ ');
-- ํ๋์ ์์ผ๋ก ๋ฌถ์ด์ ์คํ์ํด
-- ๋ฐ๋๋ผ ์ฌ์๊ณผ ์ง๊ธ ์ฝ๋๊ฐ ์ผ์นํ๋ฉด์ ๊ฐ์ ์ฌ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฌ์๋ค์
-- ์ฌ๋ฒ, ์ง์๋ช
, ์ง๊ธ ์ฝ๋, ์ฌ์์ ์ฌ๋ฒ
SELECT emp_no,
emp_name,
job_code,
manager_id
FROM employee
WHERE (job_code, manager_id) IN (
SELECT job_code,
manager_id
FROM employee
WHERE emp_name = '๋ฐ๋๋ผ'
);
-- 4) ๋ค์คํ ๋ค์ค์ด ์๋ธ ์ฟผ๋ฆฌ
-- ์๋ธ ์ฟผ๋ฆฌ์ ์กฐํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ํ, ์ฌ๋ฌ ์ด
-- ๊ฐ ๋ถ์ ๋ณ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ์ฌ๋ฒ, ์ง์๋ช
, ๋ถ์ ์ฝ๋, ๊ธ์ฌ ์กฐํ
SELECT emp_id,
emp_name,
dept_code,
salary
FROM employee
WHERE (IFNULL(dept_code, 0), salary) IN (
SELECT IFNULL(dept_code, 0),
MAX(salary)
FROM employee
GROUP BY dept_code
)
ORDER BY dept_code;
-- ๊ฐ ์ง๊ธ๋ณ๋ก ์ต์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์๋ค์ ์ฌ๋ฒ, ์ง์๋ช
, ์ง๊ธ ์ฝ๋, ๊ธ์ฌ ์กฐํ
SELECT emp_id,
emp_name,
job_code,
salary
FROM employee
WHERE (IFNULL(job_code, 0), salary) IN (
SELECT IFNULL(job_code, 0),
MIN(salary)
FROM employee
GROUP BY job_code
)
ORDER BY job_code;
ANY()ALL()