SQLD

서브 쿼리와 뷰

비숑주인 2024. 8. 6. 10:34

서브 쿼리

쿼리 안에 존재하는 또 다른 쿼리

서브 쿼리는 메인 쿼리의 컬럼을 자유롭게 사용할 수 있지만,메인 쿼리는 서브 쿼리의 컬럼을 사용할 수 없다. 조회 결과에서브 쿼리 컬럼을 표시해야 한다면, 조인 방식으로 변환하거나 스칼라 서브 쿼리를 사용해야 한다. 

 

서브쿼리 사용 가능 위치

  • SELECT 절 : 스칼라 쿼리
  • FROM 절 : 인라인 뷰
  • WHERE 절
  • HAVING 절
  • ORDER BY 절
  • INSERT문의 VALUES 절
  • UPDATE문의 SET 절

서브쿼리 분류

 

1) 위치에 따른 분류

스칼라 서브쿼리 (Scalar Subquery) Select * 컬럼이 오는 곳에 대부분 위치 가능
* 반드시 하나의 값을 반환
인라인 뷰 (Inline View) From * 테이블명이 올수 있는 곳이 위치 가능
*  동적 뷰 (Dynamic View)라고도 한다.
중첩 쿼리 (Nested Subquery) Where, Having  

2) 동작방식에 따른 분류

Un-Correlated(비연관)
서브 쿼리
* 서브쿼리가 메인쿼리 컬럼을 사용하지 않음
* 메인쿼리에 값을 제공하기 위한 목적으로 주로 사용
Correlated(연관)
서브 쿼리
* 서브쿼리가 메인쿼리의 컬럼을 사용함
* 일반적으로 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할때 사용함

3) 반환형태에 따른 분류

Single Row 서브쿼리
(단일 행 서브쿼리)
* 서브쿼리의 실행결과가 항상 1건
* 단일행 비교 연산자와 함께 사용된다.
Multi Row 서브쿼리
(다중 행 서브쿼리)
* 서브쿼리의 실행 결과가 여러건
* 다중행 비교연산자와 함께 사용된다.
Multi Column 서브쿼리
(다중 컬럼 서브쿼리)
* 서브쿼리의 실행 결과로 여러 컬럼을 반환.
* 메인 쿼리 조건절에 여러컬럼을 돈시에 비교 가능.
* 서브쿼리와 메인쿼리에서 비교하고자 하는 컬럼 개수와 위치가 일치해야한다.

 

A. 단일행 비교 연산자

=, <, <=, >, >=, <>

B. 다중행 비교 연산자

다중행 비교연산자는 단일행 비교연산자로 대체 가능하다. (반대는 안됨)
NULL은 IN 또는 NOT IN 연산자로 비교할 수 없다. 

 

 

서브쿼리 사용시 주의 사항

  1. 서브쿼리는 괄호로 감싸서 사용해야한다.
  2. 서브쿼리는 단일행 또는 복수행 비교연산자와 함게 사용 가능하다.
    • 단일행 비교연산자는 서브쿼리 결과가 반드시 1건이어야한다.
    • 복수행 비교연산자는 서브쿼리 결과 건수와 상관없다.
  3. 서브쿼리에서는 order by를 사용하지 못한다.
    • order by 절은 메인쿼리의 마지막 문장에 위치해야한다.

View (뷰)

가상 테이블

CREATE VIEW 뷰명 AS (
	select ...
);
  
DROP VIEW 뷰명;

1. 뷰 특징

  1. 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용프로그램은 변경하지 않아도 된다.
  2. 편리성 : 복잡한 질의를 뷰로 생성함으로써 단순한 질의 작성이 가능하다.
  3. 보안성 : 보안이 필요한 컬럼을 빼고 생성함으로써 사용자에게 정보를 감출수 있다.