Coding/SQL

sub query (쿼리 안의 쿼리)

코딩; 2022. 1. 22. 13:16

˙형식

SELECT  단일 ROW 단일 COLUMN(산출되는 데이터는 한개, 컬럼도 한개)
FROM    다중 ROW 다중 COLUMN
WHERE   다중 ROW 다중 COLUMN

˙연습

-- SELECT
SELECT  employee_id, first_name,
    (SELECT first_name
     FROM employees
     WHERE employee_id = 100)
FROM employees;

-- 이건 안됨 -> 단일행이 아니라 다중 행이기 때문에
SELECT  employee_id, first_name,
    (SELECT first_name
     FROM employees
     WHERE salary > 10000)
FROM employees;

-- 이것도 안됨 -> 다중 컬럼이기 때문에
SELECT  employee_id, first_name,
    (SELECT first_name, salary
     FROM employees
     WHERE employee_id = 100)
FROM employees;

SELECT  employee_id, first_name, (SELECT COUNT(*)  FROM employees)
FROM employees;

-- FROM
SELECT employee_id, salary
FROM ( SELECT employee_id, first_name, salary 
       FROM employees
       WHERE department_id = 80)
WHERE salary > 10000;

SELECT employee_id, salary, last_name
FROM ( SELECT * 
       FROM employees
       WHERE department_id = 80)
WHERE salary > 10000;

-- 부서번호 50번, 급여가 6000 이상인 사원
SELECT *
FROM employees
WHERE salary >= 6000
    AND department_id = 50;
    
SELECT employee_id, salary, department_id
FROM (SELECT *
      FROM employees
      WHERE department_id = 50)
WHERE salary >= 6000;

-- 업무별 급여의 합계, 인원 수, 사원명, 급여
SELECT e.employee_id, e.salary,
    e.job_id, j.job_id,
    j."급여의 합계", j.인원수, e.first_name   
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 AVG(salary) FROM employees;

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);