배운 것 기록/DB

[MySQL] 서브쿼리

키죽 2022. 6. 9. 21:04

서브쿼리

쿼리 구문 안에 또 다른 쿼리 구문이 포함된 형태로 메인쿼리보다 먼저 실행된다.

- 안에 있는 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