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) 총 정리
위치에 따라 다르게 불리는 서브쿼리
- WHERE 중첩 서브쿼리
- FROM 인라인 뷰
- SELECT 스칼라 서브쿼리
중첩Subquery 종류
- single-row subquery 단일행 서브쿼리 : 서브쿼리로부터 메인쿼리로부터 값이 하나만 반환되는 경우
- 단일행 연산자 : =, <, >, <>, <=, >= 등
- multiple-row subquery 다중행 서브쿼리 : 서브쿼리로부터 메인쿼리로부터 값 리스트(값이 여러개)가 반환되는 경우
- 다중행 연산자 : in, any, all 등
중첩서브쿼리종류 | 설명 |
---|---|
단일행 서브쿼리 | 단일행 비교연산자사용 |
다중행 서브쿼리 | 다중행 비교연산자사용 |
단일컬럼 서브쿼리 | 비쌍비교 |
다중컬럼 서브쿼리 | 쌍비교 |
single-row subquery 단일행 서브쿼리
- 한 행만 반환함.
- 단일행 비교연산자를 사용해야함.
- 예시: 사내에서 최소한의 연봉을 받는 사람과 최대의 연봉을 받는 사람을 구하는 쿼리.
1 | $ select last_name, job_id, salary |
multiple-row subquery 다중행 서브쿼리
- 두개 이상의 행을 반환함.
- 다중행 비교연산자를 사용해야함.
연산자 | 의미 | 성격이 비슷한 단일행연산자 | 동일한 다중행비교연산자 |
---|---|---|---|
in | 목록의 어떤 값과 일치한다 | =, OR | I=ANY |
any | 메인쿼리값과 서브쿼리의 리턴된 각각의 값을 비교하여 하나이상 만족하면 참. 사용시 단일행연산자가 앞에 있어야함 | OR | |
all | 메인쿼리값과 서브쿼리의 리턴된 모든 값을 비교하여 모든값이 만족하면 참. 사용시 단일행연산자가 앞에 있어야함 | AND | <>ALL = NOT IN |
- 예시 : job_id가 IT인 사원들의 연봉보다 작은 연봉을 받는 사원이름과 연봉을 출력하는 쿼리
- 즉
< any
는 서브쿼리 결과값들 중 최대값 보다 작거나 같으면 그 결과를 리턴.
1 | select last_name, salary |
subquery의 null값
- subquery에서 반환되는 값 중 하나라도 null이면 subquery가 행을 반환하지 않는다.
- 따라서 항상 null값을 빼는 조건절을 쿼리에 넣어서 결과값을 반환해야한다
- null값 해결법 => nvl()함수사용 또는 not null 연산자 사용
- 테이블 규모가 클때(500행이상)는 함수(nvl)보다 연산자(not null)이 성능이 더 좋다
- 테이블 규모가 작을때는 성능이 차이나지않는다.
1 | //첫번째 방법 : not null |