서브쿼리는 메인쿼리보다 먼저 실행됨
single-row subquery
--> 단일 행 연산자 사용multiple-row subquery
--> 다중 행 연산자 사용-- 결과: 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) ;
ㄴ 검색 순서
: 리턴되는 행의 갯수를 하나 가지고 있을 때
=, >, >=, <, <=, <>(같지 않음)
)ex) ST_CLERK
: 리턴되는 행의 갯수를 둘 이상 가지고 있을 때
IN, 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);
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) ;
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) ;
-- 오류 발생 (IN은 실행가능)
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM employees mgr);