[MySQL] 서브쿼리
서브쿼리
쿼리 구문 안에 또 다른 쿼리 구문이 포함된 형태로 메인쿼리보다 먼저 실행된다.
- 안에 있는 inner query에서 바깥 main query = outer query 순으로 이해
=> 서브쿼리를 먼저 실행하고 그 값으로 메인쿼리를 돌려달라!
- group by 절 제외한 쿼리 구문 어디든 작성 가능, where절이나 having 절에 많이 사용된다.
employees 테이블에서 사원들의 employee_id, last_name, salary를 출력하되
Abel보다 급여를 더 많이 받는 사원만 출력하고 싶을 때!
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE salary > (Abel의 급여);
Abel의 급여가 뭔지 모르겠다!
나도 모르는 값을 기준으로 쿼리 구문을 작성하고 싶을 때 사용!
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE salary > (SELECT salary
from employees
where last_name = 'Abel');
where 절에 주로 쓰이지만 SELECT, WHERE, FROM, HAVING, ORDER BY, INSERT, DDL 문 등
쿼리 구문의 어디에도 들어갈 수 있다!
employees 테이블의 평균 이상의 급여를 받는 모든 사원의
employee_id, last_name, salary를 출력하되 salary를 기준으로 오름차순 정렬하시오
SELECT employee_id, last_name, salary
FROM employees
where salary >= (SELECT AVG(salary)
FROM employees)
ORDER BY salary;
급여가 null인 경우 0으로 바꾸어 출력 (더 정확한 쿼리 구문)
SELECT employee_id, last_name, salary
FROM employees
where salary >= (SELECT AVG(NVL(salary, 0))
FROM employees)
ORDER BY salary;
단일행 서브쿼리
서브쿼리로 하나의 결과값(한 행)이 변환된다.
메인쿼리에 단일행 비교연산자를 사용(=, >, <, >=, <=, <>)
다중행 서브쿼리
서브쿼리로부터 메인쿼리로 여러개의 값(여러 행)이 반환된다.
메인쿼리에 다중행비교 연산자를 사용
- IN : 서브쿼리 결과 중 하나라도 일치하면 참
- ANY : 서브쿼리 결과와 하나 이상 일치하면 참
- ALL : 서브쿼리 결과와 모든 값이 일치하면 참
IN | = OR | 같다/or 여러 값 중 하나라도 일치하면 참 |
NOT IN | <>, AND | 같지 않다/and |
=ANY | =, OR | == IN |
>ANY | >, OR | 최소값보다 크면 true |
>=ANY | >=, OR | 최소값보다 크거나 같으면 true |
<ANY | <, OR | 최대값보다 작으면 true |
<=ANY | <=, OR | 최대값보다 크거나 작으면 true |
<>ANY, !=ANY | <>, OR | 존재하나 사용 안함 |
=ALL | =, AND | 존재하나 사용 안함 |
>ALL | >, AND | 최대값보다 크면 true |
>=ALL | >=, AND | 최대값보다 크거나 같으면 ture |
<=ALL | <, AND | 최소값보다 작으면 true |
<=ALL | <= AND | 최소값보다 작거나 같으면 true |
<>ALL, !=ALL | <>, AND | == NOT IN |