본문 바로가기
🖊️Certificate/📌SQLD

[SQLD] 2과목 - 2장) 1절. 서브 쿼리

by 빛나고요 2024. 3. 7.
BIG

2과목. SQL 기본 및 활용
2장. SQL 활용
1절. 서브 쿼리

# 서브쿼리
- 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 말함
- 반드시 괄호로 묶어야 함
  ex) SELECT 안에 SELECT문, INSERT/UPDATE/DELETE 안에 SELECT문

# 서브쿼리 사용 가능한 곳
① SELECT 절
② FROM 절
③ WHERE 절
④ HAVING 절
⑤ ORDER BY 절
⑥ DML(INSERT, DELETE, UPDATE)절

* GROUP BY 절은 사용 X

# 서브 쿼리 종류
① 동작하는 방식에 따라
- UN-CORRELATED(비연관) 서브쿼리
  · 서브쿼리가 메인쿼리 컬럼을 가지고 있지 않은 형태의 서브쿼리
  · 메인쿼리에 서브쿼리가 실행된 결과 값을 제공하기 위한 목적으로 사용

- CORRELATED(연관) 서브쿼리
  · 서브쿼리가 메인쿼리 컬럼을 가지고 있는 형태의 서브쿼리
  · 일반적으로 메인쿼리가 먼저 수행된 후에 서브쿼리에서 조건이 맞는지 확인하고자 할 때 사용

② 위치에 따라
- 스칼라 서브쿼리
  · SELECT 에 사용하는 서브쿼리
  · 서브쿼리 결과를 마치 하나의 컬럼처럼 사용하기 위해 주로 사용
  ·  문법
SELECT * or 컬럼명 or  표현식,
       (SELECT * or 컬럼명 or 표현식
       FROM 테이블명 or 뷰명
       WHERE 조건)
FROM 테이블명 or 뷰명;

- 인라인뷰
  · FROM 절에 사용하는 서브쿼리
  · 서브쿼리 결과를 테이블처럼 사용하기 위해 주로 사용
  · 문법
SELECT * or 컬럼명 or  표현식,
       (SELECT * or 컬럼명 or 표현식
FROM 테이블명 or 뷰명)
WHERE 조건;

- WHERE 절 서브쿼리
  · 가장 일반적인 서브쿼리
  · 비교 상수 자리에 값을 전달하기 위한 목적으로 주로 사용(상수항의 대체)
  · 리턴 데이터의 형태에 따라 단일행 서브쿼리, 다중행 서브쿼리, 다중컬럼 서브쿼리, 상호연관 서브쿼리로 구분
  · 문법
SELECT * or 컬럼명 or  표현식
FROM 테이블명 or 뷰명
WHERE 조건연산자 (SELECT * or 컬럼명 or 표현식
FROM 테이블명 or 뷰명
WHERE 조건);

# WHERE 절 서브쿼리 종류
- 단일행 서브쿼리
  · 서브쿼리 결과가 1개의 행이 리턴
  · 연산자 종류
    ➢ =  같다
    ➢ <>  같지 않다
    ➢ >  크다
    ➢ >=  크거나 같다
    ➢ <  작다
    ➢ <=  작거나 같다

- 다중행 서브쿼리
  · 서브쿼리 결과가 여러 행이 리턴
  · ‘=’, ‘>’, ‘<’와 같은 비교 연산자 사용 불가
  · 서브쿼리 결과를 하나로 요약하거나 다중행 서브쿼리 연산자 사용
   ex) ALL(2000, 3000): 최대값(3000)보다 큰 행들 반환
   ALL(2000, 3000): 최소값(2000)보다 작은 행들 반환
   ANY(2000, 3000): 최소값(2000)보다 큰 행들 반환
   ANY(2000, 3000): 최대값(3000)보다 작은 행들 반환

- 다중컬럼 서브쿼리
  · 서브쿼리 결과가 여러 컬럼이 리턴되는 형태
  · 메인쿼리와의 비교 컬럼이 2개 이상
  · 대소 비교 전달 불가(두 값을 동시에 묶어 대소 비교 불가능)

- 상호연관 서브쿼리
  · 메인쿼리와 서브쿼리의 비교를 수행하는 형태
  · 비교할 집단이나 조건은 서브쿼리에 명시(메인쿼리 절에는 서브쿼리 컬럼이 정의되지 않았기 때문에 에러 발생

# 인라인뷰(Inline View)
- 쿼리 안의 뷰의 형태로 테이블처럼 조회할 데이터를 정의하기 위해 사용
- 테이블명이 존재하지 않기 때문에 다른 테이블과 조인 시 반드시 테이블 별칭 명시(단독으로 사용 시 불필요)
- WHERE 절 서브쿼리와 다르게 서브쿼리 결과를 메인 쿼리의 어느 절에서도 사용할 수 있음
- 인라인뷰의 결과와 메인쿼리 테이블과 조인할 목적으로 주로 사용
- 모든 연산자 사용 가능

# 스칼라 서브쿼리
- SELECT 절에 사용하는 쿼리로, 마치 하나의 컬럼처럼 표현하기 위해 사용(단 하나의 출력 대상만 표현 가능)
- 각 행마다 스칼라 서브쿼리 결과가 하나여야 함(단일행 서브쿼리 형태)
- 조인의 대체 연산

# 서브 쿼리 주의 사항
- 특별한 경우(TOP-N 분석 등)을 제외하고는 서브 쿼리절에 ORDER BY 절을 사용 불가
- 단일 행 서브쿼리와 다중 행 서브쿼리에 따라 연산자의 선택이 중요

댓글