230809 TIL Chapter 22. DB SUBQUERY

최규연·2023년 8월 9일
0

TIL

목록 보기
23/57

TIL -> SUBQUERY

SUBQUERY

하나의 SQL문 안에 포함된 다른 SQL(SELECT)문으로 메인쿼리(기존쿼리)를 위해 보조 역할을 하는 쿼리문이다.
SELECT, FROM, WHERE, HAVING 절에서 사용 가능.

SUBQUERY 유형

  • 단일행 (단일열) 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 1개일 때
  • 다중행 (단일열) 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 여러개일 때
  • 다중열 서브쿼리 : 서브쿼리의 SELECT 절에 자열된 항목수가 여러개 일 때
  • 다중행 다중열 서브쿼리 : 조회 결과 행 수와 열 수가 여러개일 때
  • 상관 서브쿼리 : 서브쿼리가 만든 결과 값을 메인 쿼리가 비교 연산할 때
    메인 쿼리 테이블의 값이 변경되면 서브쿼리의 결과값도 바뀌는 서브쿼리
  • 스칼라 서브쿼리 : 상관 쿼리이면서 결과 값이 하나인 서브쿼리

TIP : 서브쿼리 유형에 따라 서브쿼리 앞에 붙는 연산자가 다르다.


단일행 서브쿼리 ( SINGLE ROW SUBQUERY )

서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리
단일행 서브쿼리 앞에는 비교 연산자 사용

다중행 서브쿼리 ( MULTI ROW SUBQUERY )

서브쿼리의 조회 결과 값의 개수가 여러 행일때 사용한다.
다중행 서브쿼리는 앞에 일반 비교연산자 사용 불가.

  • IN , NOT IN
    여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면 혹은 없다면 이라는 의미로 가장 많이 사용
  • 〉 ANY , 〈 ANY
    여러개의 결과값 중에서 한개라도 큰 , 작은 경우
    가장 작은 값보다 큰가? , 가장 큰 값 보다 작은가?
  • 〉 ALL , 〈 ALL
    여러개의 결과값의 모든 값보다 큰 , 작은 경우
    가장 큰 값 보다 큰가? , 가작 작은 값보다 작은가?
  • EXISTS , NOT EXSIST
    값이 존재 하는가? , 존재하지 않는가?

SELECT절에 서브쿼리 사용 가능하다. 그리고 선택함수(DECODE,CASE WHEN, ELSE, END) 혹은 집합연산자(UNION,합집합)를 사용 할 수도 있다.


(단일행) 다중열 서브쿼리

(단일행 = 결과값은 한 행)
서브쿼리 SELECT절에 나열된 컬럼 수가 여러개 일 때

다중행 다중열 서브쿼리

서브쿼리 조회 결과 행 수와 열 수가 여러개 일 때


상[호연]관 서브쿼리

상관쿼리는 메인쿼리가 사용하는 테이블값을 서브쿼리가 이용해서 결과를 만든다.
메인쿼리의 테이블값이 변경되면 서브쿼리의 결과값도 바뀌게 되는 구조.

상관쿼리는 먼저 메인쿼리 한 행을 조회하고 해당 행이 서브쿼리의 조건을 충족하는지 확인하여 SELECT를 진행한다.

해석순서가 기존 서브쿼리와 다르게
메인쿼리 1행 -> 1행에 대한 서브쿼리
메인쿼리 2행 -> 2행에 대한 서브쿼리
...
메인쿼리의 행의 수 만큼 서브쿼리가 생성되어 진행된다.


스칼라 서브쿼리

SELECT절에 사용되는 서브쿼리 결과로 1행만 반환한다.
SQL에서 단일 값을 가르켜 '스칼라' 라고 하고 SELECT절에 작성되는 단일행 서브쿼리다.


인라인 뷰 ( INLINE-VIEW )

FROM 절에서 서브쿼리를 사용하는 경우로 서브쿼리가 만든 결과의 집합(RESULT SET)을 테이블 대신에 사용한다.

ROWNUM 컬럼 = 행번호를 나타내는 가상 컬럼으로 SELECT, WHERE, ORDER BY에 사용 가능하다.

WITH

서브쿼리에 이름을 붙여주고 사용시 이름을 사용하게 한다.
인라인뷰로 사용될 서브쿼리에 주로 사용된다.
실행 속도도 빨라진다는 장점이 있다.

RANK() OVER / DENSE_RANK() OVER

  • RANK() OVER : 동일한 순위 이후의 등수를 동일한 인원 수 만큼 건너뛰고 순위 계산 / EX) 공동 1위가 2명이면 다음 순위는 2위가 아니라 3위
  • DENSE_RANK() OVER : 동일한 순위 이후의 등수를 이후의 순위로 계산 / EX) 공동 1위가 2명이어도 다음 순위는 2위

0개의 댓글