본문 바로가기
SQL

SQL Subquery 서브쿼리 사용하기

by Queen2 2022. 9. 13.
728x90
반응형

[조인과 서브쿼리의 차이점 및 특징]

Join Subquery
원하는 data가 여러 테이블에 분산되어 있을 때 원하는 data가 한번의 select만으로는 불가능할 때 

여러번의 select문을 사용해야 할 때

컬럼을 사용할 수 있는 위치면 모두 사용가능
(select-from-where-group by-having-order by, insert문,delete,update문 등)

괄호가 반드시 들어감 (select~~~)

 

Subquery select문 실행의 결과는 단일행(레코드 1개) 혹은 복수행 (레코드 여러개) 2가지로 분류됨

 

단일행 : 비교연산자 사용 (>, <, = 등)

SELECT last_name, department_id, salary #메인쿼리
FROM employees
WHERE department_id IN ( SELECT department_id   #괄호 내부의 쿼리는 서브쿼리
 FROM employees
WHERE salary > 13000 );

주의) 결과값이 복수행이 반환되는데 비교 연산자를 사용하면 에러 발생하므로 반환 값에 주의 할 것!

 

복수행: in/any/all/exists 연산자 사용

 

1) IN 연산자

SELECT last_name, department_id, salary
FROM employees
WHERE department_id IN ( SELECT department_id FROM employees WHERE salary > 13000 );

 

2) ANY/ALL 연산자

  • ANY/ALL연산자는 복수행을 반환함에도 '<' 와 '>'를 함께 사용할 수 있음
SELECT last_name, department_id, salary
FROM employees
WHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG');

> ALL : 서브쿼리 실행 결과 중에서 최대값보다 큰 값을 찾음 

< ALL : 서브쿼리 실행 결과 중에서 최소값보다 작은 값을 찾음

 

SELECT last_name, department_id, salary
FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG');

ANY 연산자는 해당 값들 중 하나만 만족하면 반환됨

> ANY : 최소값보다 큰 값

< ANY : 최대값보다 작은 값

 

3) EXISTS 연산자

실행 결과가 하나라도 존재하는지 여부를 확인할 때 사용

TRUE ---> 메인쿼리 실행
FALSE ---> 메인쿼리가 실행되지 않음
SELECT last_name, department_id, salary
FROM employees
WHERE EXISTS (SELECT employee_id FROM employees WHERE commission_pct IS NOT NULL);

 

4) 다중 서브쿼리

  • Pair 비교 방법

예시) 부서별로 가장 많은 월급을 받는 사원id를 구하는 경우

SELECT last_name, department_id, salary
FROM employees
WHERE (department_id, salary) IN ( SELECT department_id, MAX(salary)
 FROM employees
GROUP BY department_id )
ORDER BY 2;

 

5) In-line view 인라인뷰 (From 절에 사용하는 서브쿼리)

별칭을 준 서브쿼리의 행 수가 기존 테이블의 행 수보다는 적으므로, 연산 시 성능이 좋음

SELECT select_list
FROM ( 서브쿼리 ) alias
WHERE 조건식;

 

예시)

SELECT e.department_id, 합계, 평균, 인원수
FROM ( SELECT department_id, SUM(salary) 합계, AVG(salary) 평균 FROM employee) e, departments d
WHERE e.department_id = d.department_id;

 

 

728x90
반응형

댓글