Subquery1: Subquery개념, 중첩Subquery

Subquery

  • 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL문 형태
  • Oracle이 sub쿼리를 먼저 실행한 뒤 main쿼리를 실행한다.
  • 출력값은 main쿼리값만 출력된다. sub쿼리값은 출력되지않는다.
  • main쿼리안에 sub쿼리는 여러번 작성가능하며 sub쿼리에 sub쿼리를 넣는 듯 중첩도 가능하다
    • 이론상으로 256개가능ㅋㅋㅋㅋ<쌤은 이걸 어떻게 외우시는거지..?!
  • group by절 제외한 select, from, where, having등 모든 절에 sub쿼리 사용가능
    • sub쿼리가 제일 많이 사용되는 절은 where절과 having절이다
  • Subquery 사용시 주의점
    • 반드시 괄호()안에 존재하여야 한다.
  • 참고링크 : 서브쿼리(Subquery) 총 정리

위치에 따라 다르게 불리는 서브쿼리

중첩Subquery 종류

  • single-row subquery 단일행 서브쿼리 : 서브쿼리로부터 메인쿼리로부터 값이 하나만 반환되는 경우
    • 단일행 연산자 : =, <, >, <>, <=, >= 등
  • multiple-row subquery 다중행 서브쿼리 : 서브쿼리로부터 메인쿼리로부터 값 리스트(값이 여러개)가 반환되는 경우
    • 다중행 연산자 : in, any, all 등
중첩서브쿼리종류 설명
단일행 서브쿼리 단일행 비교연산자사용
다중행 서브쿼리 다중행 비교연산자사용
단일컬럼 서브쿼리 비쌍비교
다중컬럼 서브쿼리 쌍비교




single-row subquery 단일행 서브쿼리

  • 한 행만 반환함.
  • 단일행 비교연산자를 사용해야함.
  • 예시: 사내에서 최소한의 연봉을 받는 사람과 최대의 연봉을 받는 사람을 구하는 쿼리.
1
2
3
4
$ select last_name, job_id, salary
$ from employees
$ where salary = (select min(salary) from employees)
$ or salary = (select max(salary) from employees);




multiple-row subquery 다중행 서브쿼리

  • 두개 이상의 행을 반환함.
  • 다중행 비교연산자를 사용해야함.
연산자 의미 성격이 비슷한 단일행연산자 동일한 다중행비교연산자
in 목록의 어떤 값과 일치한다 =, OR I=ANY
any 메인쿼리값과 서브쿼리의 리턴된 각각의 값을 비교하여 하나이상 만족하면 참. 사용시 단일행연산자가 앞에 있어야함 OR
all 메인쿼리값과 서브쿼리의 리턴된 모든 값을 비교하여 모든값이 만족하면 참. 사용시 단일행연산자가 앞에 있어야함 AND <>ALL = NOT IN
  • 예시 : job_id가 IT인 사원들의 연봉보다 작은 연봉을 받는 사원이름과 연봉을 출력하는 쿼리
  • < any는 서브쿼리 결과값들 중 최대값 보다 작거나 같으면 그 결과를 리턴.
1
2
3
4
5
select last_name, salary
from employees
where salary < any
(select salary from employees where job_id = 'IT')
and job_id <> 'IT';




subquery의 null값

  • subquery에서 반환되는 값 중 하나라도 null이면 subquery가 행을 반환하지 않는다.
  • 따라서 항상 null값을 빼는 조건절을 쿼리에 넣어서 결과값을 반환해야한다
    • null값 해결법 => nvl()함수사용 또는 not null 연산자 사용
    • 테이블 규모가 클때(500행이상)는 함수(nvl)보다 연산자(not null)이 성능이 더 좋다
    • 테이블 규모가 작을때는 성능이 차이나지않는다.
1
2
3
4
5
//첫번째 방법 : not null
where 컬럼 is not null;

//두번째 방법 : nvl()
where nvl(컬럼, 0);