몰입하며 나아가는 개발이란

Language/SQL

Oracle SQL DML : SELECT 05(SUB QUERY)

류하을 2019. 12. 21. 17:29

SUB QUERY

간단하게 보면 Query 안의 Query 라고 볼 수 있으며,
한개의 행(row)에서 결과 값이 반환되는 Query 이다.

SELECT 부분에서의 SUBQUERY 는 단일 ROW 단일 COLUMN (나오는 데이터가 한개, 컬럼 한개)
FROM 부분에서의 SUBQUERY 는 다중 ROW 다중 COLUMN
WHERE 부분에서의 SUBQUERY 는 다중 ROW 다중 COLUMN --> 가장 많이 사용한다고 한다.

/*
SELECT EMPLOYEE_ID, (SELECT FIRST_NAME, LAST_NAME FROM EMPLOYEES) -- 다중컬럼 사용x
SELECT EMPLOYEE_ID, (SELECT FIRST_NAME FROM EMPLOYEES)            -- 다중row 사용x   
*/

SELECT 부분에서의 SUB QUERY 예

-- SELECT (SUB QUERY)
SELECT employee_id, first_name,
(SELECT salary FROM employees WHERE employee_id = 100),
(SELECT COUNT(*) FROM employees)
    
FROM employees;

FROM 부분에서의 SUB QUERY 예

-- FROM (SUB QUERY)
SELECT employee_id, first_name, department_id

FROM (  SELECT employee_id, first_name, department_id
        FROM employees
        WHERE department_id = 20);

WHERE 부분에서의 SUB QUERY 예

-- WHERE (SUB QUERY)
SELECT first_name, salary
FROM employees

WHERE salary > ( SELECT AVG(salary) 
                 FROM employees );
  
  
SELECT first_name, job_id, department_id
FROM employees

WHERE job_id IN(    SELECT job_id 
                    FROM employees
                    WHERE department_id = 90);

SUB QUERY를 활용한 예제문제 (hr계정)

1. 부서별로 가장 급여를 적게 받는 사원과 같은 급여를 받는 사원 모두를 선택.

2. 부서별로 가장 급여를 적게 받는 사원의 정보를 선택.

--예제1) 부서별로 가장 급여를 적게 받는 사원과 같은 급여를 받는 사원              
SELECT department_id, first_name ||' '|| last_name, salary
FROM employees
WHERE salary IN (SELECT MIN(salary) FROM employees GROUP BY department_id)
ORDER BY department_id ASC;
                    
--예제2) 부서별로 가장 급여를 적게 받는 사원의 정보
SELECT department_id, first_name, salary
FROM employees
WHERE (salary, department_id) 
IN (SELECT MIN(salary), department_id FROM employees GROUP BY department_id )
ORDER BY department_id ASC;