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 |