[SQL] 서브쿼리(Subquery)

·2025년 5월 26일
0

SQL

목록 보기
7/126

서브쿼리(Subquery)

서브쿼리는 메인쿼리보다 먼저 실행

  • 괄호로 묶기
  • single-row subquery --> 단일 행 연산자 사용
  • multiple-row subquery --> 다중 행 연산자 사용

💡 서브쿼리 작성 시, single-row인지 multiple-row인지 구분하는 것이 중요!

-- 결과: 9500
SELECT salary  
  FROM employees 
 WHERE employee_id = 151 ; 

SELECT employee_id, last_name, hire_date, job_id, salary
  FROM employees 
 WHERE salary > 9500 ; 

-- 위 두 식을 합친 것
SELECT employee_id, last_name, hire_date, job_id, salary
  FROM employees 
 WHERE salary > (SELECT salary  
                   FROM employees 
                  WHERE employee_id = 151) ; 


ㄴ 검색 순서

서브쿼리 유형

✔️ 1. Single-row subquery

: 리턴되는 행의 갯수를 하나 가지고 있을 때

  • 한 행만 반환
  • 단일 행 비교 연산자 사용(=, >, >=, <, <=, <>(같지 않음))

ex) ST_CLERK

✔️ 2. Multiple-row subquery

: 리턴되는 행의 갯수를 둘 이상 가지고 있을 때

  • 둘 이상의 행을 반환
  • 다중 행 비교 연산자 사용(IN, ANY, ALL)
    • ANY랑 ALL은 단일 행 연산자(=, !=, >, <, <=, >=)가 앞에 있어야 함
    • ANY: OR 연산을 하겠다는 의미
    • ALL: AND 연산을 하겠다는 의미

ex) ST_CLERK, SA_MAN

-- 오류 발생
SELECT cust_id, lname, gender, country
  FROM custs 
 WHERE cust_id = (SELECT cust_id 
                    FROM orders) ;

-- 오류 해결 (IN 사용)
SELECT cust_id, lname, gender, country
  FROM custs 
 WHERE cust_id IN (SELECT cust_id 
                     FROM orders) ;
                     
-- 오류 해결 (ANY 사용)
SELECT cust_id, lname, gender, country
  FROM custs 
 WHERE cust_id = ANY (SELECT cust_id 
                    FROM orders) ;
-- IN 사용
select employee_id, last_name, salary, department_id
from employees
where salary in (6900,2500,7000);

-- ALL이나 ANY 사용(이게 없으면 오류발생)
select employee_id, last_name, salary, department_id
from employees
where salary > all(select avg(salary)
                from employees
                group by department_id);

둘 결과 각각 같음

1.

SELECT employee_id, last_name, salary, department_id
  FROM employees 
 WHERE salary > ANY (SELECT AVG(salary) 
                       FROM employees 
                      GROUP BY department_id) ;


SELECT employee_id, last_name, salary, department_id
  FROM employees 
 WHERE salary > (SELECT MIN(AVG(salary))
                   FROM employees 
                  GROUP BY department_id) ;

2.

SELECT employee_id, last_name, salary, department_id
  FROM employees 
 WHERE salary > ALL (SELECT AVG(salary) 
                       FROM employees 
                      GROUP BY department_id) ;

SELECT employee_id, last_name, salary, department_id
  FROM employees 
 WHERE salary > (SELECT MAX(AVG(salary))
                       FROM employees 
                      GROUP BY department_id) ;

서브쿼리의 null 값

-- 오류 발생 (IN은 실행가능)
SELECT emp.last_name
FROM   employees emp
WHERE  emp.employee_id NOT IN
                           (SELECT mgr.manager_id
                            FROM   employees mgr);
  • 서브쿼리에서 반환되는 값 중 하나가 null이므로, 서브쿼리가 행을 반환하지 X

0개의 댓글