* SUB QUERY
- QUERY안의 QUERY
SELECT 단일 ROW 단일 COLUMN (산출되는 데이터는 한개, 컬럼도 한개)
FROM 다중 ROW 다중 COLUMN
WHERE 다중 ROW 다중 COLUMN
* SELECT 절
SELECT employee_id, first_name,
(SELECT first_name -- 단일 컬럼(O)
FROM employees
WHERE employee_id = 100) -- 단일 행(O)
FROM employees;
-- 다중 행이기 때문에 안되는 경우
SELECT employee_id, first_name,
(SELECT first_name -- 단일 컬럼(O)
FROM employees
WHERE salary > 10000) -- 다중 행(X)
FROM employees;
-- 다중 컬럼이기 때문에 안되는 경우
SELECT employee_id, first_name,
(SELECT first_name, salary -- 다중 컬럼(X)
FROM employees
WHERE employee_id = 100) -- 단일 행(O)
FROM employees;
-- 서브쿼리로 그룹함수 사용 가능
SELECT employee_id, first_name, (SELECT COUNT(*) FROM employees)
FROM employees;
* FROM 절
SELECT employee_id, salary -- SUB QUERY 안에서 설정된 컬럼만 작성 가능
FROM (SELECT employee_id, first_name, salary -- 한번 걸러서 테이블을 만들고
FROM employees
WHERE department_id = 80)
WHERE salary >= 10000;
- SELECT 절에서 다른 컬럼도 추가하고 싶다면, 서브쿼리 안의 SELECT 절을 *로 작성
-- 부서번호 50번, 급여가 6000이상인 사원
SELECT *
FROM employees
WHERE salary >= 6000
AND department_id = 50;
SELECT employee_id, salary, department_id
FROM (SELECT * -- 부서번호가 50까지 있는 테이블
FROM employees
WHERE department_ID = 50)
WHERE salary >= 6000;
-- 업무별 급여의 합계, 인원수, 사원명, 급여
- 그룹핑하면 그룹핑 한 것과 그룹함수만 출력 가능 → FIRST_NAME, salary 출력 불가
SELECT job_id, SUM(salary) AS "급여의 합계", COUNT(*) AS 인원수, FIRST_NAME, salary
FROM employees
GROUP BY job_id;
⇒ SUB QUERY 이용
SELECT j."급여의 합계", j."인원수", e.first_name, e.salary
FROM employees e, (SELECT job_id, SUM(salary) AS "급여의 합계", COUNT(*) AS "인원수"
FROM employees
GROUP BY job_id) j
WHERE e.job_id = j.job_id;
- 그룹핑할때 제약이 많으니까, 테이블로 만들어 조인해서 원하는 값 가져옴
* WHERE 절
-- (평균 급여)보다 많이 받는 사원
SELECT first_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- 부서별로 가장 많이 받는 사원과, 같은 급여를 받는 사원을 산출
SELECT department_id, salary, first_name
FROM employees
WHERE salary IN(SELECT MAX(salary) → 같은 값을 여러건 반환할 때
FROM employees
GROUP BY department_id);
- 부서별 최대 급여와 같은 급여가 모두 산출돼버림
-- 부서별로 급여를 가장 많이 받는 사원만을 산출
SELECT department_id, salary, first_name
FROM employees
WHERE (department_id, salary) IN(SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id)
ORDER BY department_id;
- department_id, salary 두 가지 다 성립되는 것을 산출
댓글