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 |
![[OS/WINDOW]배포후 서버재시작에 batch와 윈도우 스케줄러 활용하기](https://cdn.pixabay.com/photo/2012/03/04/00/50/board-22098_960_720.jpg)
![[블로그]헥소테마에서 댓글기능 facebook에서 utterances로 변경하기](https://miro.medium.com/max/1600/1*aOv6h3h_v9PQWa03zGACnw.png)