WITH
๊ณตํต ํ
์ด๋ธ (Common Table) ์ ์ ์ํ๊ธฐ ์ํ SQL ํค์๋
WITH ๋ฌธ๋ฒ ๊ตฌ์กฐ
WITH ๊ณตํตํ
์ด๋ธ๋ช
AS (
SELECT *
FROM ํ
์ด๋ธ
WHERE ...
)
SELECT *
FROM ํ
์ด๋ธ
,๊ณตํตํ
์ด๋ธ๋ช
WHERE ...
SQL
๋ณต์ฌ
์์์ฝ๋
โข
๋ถ์๋ณ ์ฌ์์์ ์ต๊ณ ๊ธ์ฌ ์ง์ ์กฐํ
โข
์์ฌ-์ฌ์ ๊ด๊ณ ์กฐํ
โข
์
์ฌ ๋ ์ง๋ณ ์ฌ์ ์ ์กฐํ
๋ถ์๋ณ ์ฌ์์์ ์ต๊ณ ๊ธ์ฌ ์ง์ ์กฐํ
-- ๋ถ์๋ณ ์ฌ์์์ ์ต๊ณ ๊ธ์ฌ ์ง์ ์กฐํ
-- 1. ๋ถ์๋ณ ์ฌ์์
SELECT de.dept_no, COUNT(*)
FROM dept_emp de
WHERE de.from_date <= CURRENT_DATE AND de.to_date >= CURRENT_DATE
GROUP BY de.dept_no
;
-- 2. ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ
SELECT de.dept_no, MAX(s.salary) AS '์ต๊ณ ๊ธ์ฌ'
FROM dept_emp de
JOIN salaries S ON de.emp_no = s.emp_no
WHERE de.from_date <= CURRENT_DATE AND de.to_date >= CURRENT_DATE
GROUP BY de.dept_no
;
SQL
๋ณต์ฌ
-- 1,2 ๋ฅผ ์์ํ
์ด๋ธ๋ก ์กฐํํ์ฌ,
-- ๋ถ์๋ณ๋ก ์ต๊ณ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ ๋ณด๋ฅผ ์ถ๋ ฅํ์์ค.
-- ์ด๋ฆ, ์ฑ, ๊ธ์ฌ, ๋ถ์๋ช
, ์ฌ์์
WITH dept_count AS (
SELECT de.dept_no, COUNT(*) emp_count
FROM dept_emp de
WHERE de.from_date <= CURRENT_DATE AND de.to_date >= CURRENT_DATE
GROUP BY de.dept_no
),
dept_salary AS (
SELECT de.dept_no, MAX(s.salary) max_salary
FROM dept_emp de
JOIN salaries S ON de.emp_no = s.emp_no
WHERE de.from_date <= CURRENT_DATE AND de.to_date >= CURRENT_DATE
GROUP BY de.dept_no
)
SELECT e.emp_no, e.first_name, e.last_name, s.salary, d.dept_name, dc.emp_count
FROM employees e
JOIN salaries s ON e.emp_no = s.emp_no
JOIN dept_emp de ON e.emp_no = de.emp_no
JOIN departments d ON d.dept_no = de.dept_no
JOIN dept_count dc ON d.dept_no = dc.dept_no
JOIN dept_salary ds ON d.dept_no = ds.dept_no
WHERE s.salary = ds.max_salary
;
SQL
๋ณต์ฌ
์์ฌ-์ฌ์ ๊ด๊ณ ์กฐํ
--1. ์์ฌ ์ ๋ณด ์กฐํ
SELECT *
FROM employees e
JOIN dept_manager dm ON e.emp_no = dm.emp_no
;
-- 2. ๋ถํ ์ ๋ณด ์กฐํ
SELECT *
FROM employees e
WHERE e.emp_no NOT IN (SELECT emp_no FROM dept_manager)
;
SQL
๋ณต์ฌ
WITH emp_mgr AS (
SELECT de.dept_no,
e.emp_no, e.first_name, e.last_name, e.gender,
m.emp_no mgr_emp_no,
m.first_name mgr_first_name,
m.last_name mgr_last_name,
m.gender mgr_gender
FROM dept_emp de
JOIN employees e ON de.emp_no = e.emp_no
JOIN dept_manager dm ON de.dept_no = dm.dept_no
JOIN employees m ON dm.emp_no = m.emp_no
WHERE de.from_date <= CURDATE() AND de.to_date >= CURDATE()
AND dm.from_date <= CURDATE() AND dm.to_date >= CURDATE()
)
SELECT *
FROM emp_mgr
;
SQL
๋ณต์ฌ
์ ์ฌ ๋ ์ง๋ณ ์ฌ์ ์ ์กฐํ
WITH hire_count AS (
SELECT hire_date, COUNT(*) AS emp_count
FROM employees
GROUP BY hire_date
)
SELECT hire_date, emp_count
FROM hire_count
ORDER BY emp_count DESC;
SQL
๋ณต์ฌ