javaboiii의 DataBase

DB - 서브쿼리(Subquery)

javaboiii 2024. 8. 18. 20:15

DataBase

서브쿼리

 - SQL문 안에 포함된 SQL문

기준 유형
서브쿼리 위치 SELECT절, WHERE절, FROM절 (=> Inline View)
결과 컬럼 / 행의 수 단일행 서브쿼리 / 다중행 서브쿼리
단일컬럼 서브쿼리 / 다중컬럼 서브쿼리
메인 쿼리와의 연관성 연관(상관) 서브쿼리 / 비연관 서브쿼리

 

- 서브쿼리는 메인쿼리의 컬럼 모두 사용 가능

- 메인쿼리는 서브쿼리의 컬럼 사용 불가

   Inline View에 정의된 컬럼만 사용 가능

 

결과 컬럼 / 행의 수에 따른 구분

서브쿼리 종류 설명
Single Row
(단일행)
서브쿼리의 실행 결과로 항상 1건 이하의 행을 반환
단일행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용
Multi Row
(다중행)
서브쿼리의 실행 결과로 여러 건의 행 반환 가능
다중행 비교 연산자(IN, ALL, ANY, SOME, EXISTS)와 함께 사용
Single Column
(다일 컬럼)
서브ㅜ커리의 실행 결과로 하나의 컬럼을 반환
Multi Column 서브쿼리의 실행 결과로 여러 컬럼을 반환
서브쿼리와 메인쿼리의 비교 연산 수행 시, 비교하는 컬럼 개수와 위치가 동일해야 함

 

EXIST 연산자

 - 조건을 만족하는 값이 존재하는지 여부를 확인

 - 조건이 만족되는 1건만 찾으면 더 이상 검색하지 않음(속도가 빠름)

 - 주로 참/거짓의 조건 판단용으로 사용됨

 

연관(Correlated) 서브쿼리

 - 메인쿼리의 컬럼이 서브쿼리에서 사용된 쿼리

 

연관 서브쿼리의 특징

 - 메인쿼리의 컬럼이 서브쿼리에서 사용된 쿼리

    비연관 서브쿼리 : 서브쿼리에서 메인쿼리의 컬럼을 사용하지 않음

 

 - 메인쿼리가 먼저 수행되고, 그 후에 서브쿼리가 수행됨

    테이블의 별칭을 이용하여 메인 쿼리에서 서브쿼리로 정보 전달

    서브쿼리가 메인쿼리의 값을 이용, 그 후에 서브쿼리의 결과를 메인쿼리가 이용

 

 - 서브 쿼리에서 메인쿼리의 컬럼과 서브쿼리의 컬럼 간 비교가 이루어짐

    메인쿼리에서는 서브쿼리의 컬럼 사용 불가

 

스칼라 서브쿼리(Scalar Subquery)

 - 하나의 값을 반환하는 서브쿼리

    단일 행, 단일 컬럼

    하나의 값을 반환한다는 점에서 함수(Function)의 특성을 가짐

    공집합을 반환하는 경우 NULL이 대응됨

 

 - 컬럼이 올 수 있는 대부분의 곳에서 사용 가능

    SELECT절, WHERE절, 함수의 인자, ORDER BY절, CASE절, HAVING절 

 

뷰(View)

 - 테이블은 실제로 데이터를 갖고 있지만, 뷰는 실제 데이터를 갖지 않음

    뷰 정의(View Definition, SQL 텍스트 파일)만 갖고 있음

    쿼리에서 뷰가 사용되면 DBMS 내부적으로 질의를 재작성(Rewrite)

 

- 실제 데이터를 가지고 있지 않지만 테이블의 역할 수행

    가상 테이블(Virtual Table)이라고도  함

 

 - CREATE VIEW문을 통해 VIEW 생성

 

 - 생성된 뷰는 테이블과 동일한 형태로 사용 가능

 - 파싱 시점에 DBMS가 내부적으로 뷰 해당 부분을 SQL문으로 재작성

 

 - DROP VIEW문을 통해 VIEW 제거

뷰의 장점 설명
독립성 테이블 구조가 변경시, 뷰만 변경되고 뷰를 사용하는 응용 프로그램은 변경될 필요가 없음
편리성 복잡한 질의를 뷰로 생성하여 질의의 가독성을 높임
보안성 민감한 정보(급여정보 등)를 제외하고 뷰를 생성하여, 사용자로부터 정보를 보호할 수 있음

 

인라인 뷰

 - FROM절에서 사용되는 서브쿼리

 - 실행 순간에만 임시적으로 생성되며 DB에 저장되지 않음

     인라인 뷰(Inline View) = 동적 뷰(Dynamic View) == 이름도 없고 저장안

     일반 뷰 = 정적 뷰(Static View) == 이름도 있고 저장됨

 

 - 인라인 뷰의 SELECT문에서 정의된 컬럼은 메인 쿼리에서 사용가능

     일반적으로 서브쿼리에서 정의된 컬럼은 메인 쿼리에서 사용 불가

'javaboiii의 DataBase' 카테고리의 다른 글

DB - 데이터 모델링의 이해  (0) 2024.08.23
DB - 다중 행 함수(Multi-Row Function)  (0) 2024.08.20
DB - DCL(Data Control Language)  (0) 2024.08.15
DB - TCL(Transaction Control Language)  (0) 2024.08.13
DB - JOIN  (0) 2024.08.12