본문 바로가기
Coding Note/SQL

SQL SUB QUERY 서브쿼리 / 단일 ROW, COLUMN / 다중 ROW, COLUMN

by 푸린이 2021. 12. 27.

* 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 두 가지 다 성립되는 것을 산출

댓글