[SQLD] 4-4. SQL 활용 - 서브쿼리, 단일행 서브쿼리, 다중행 서브 쿼리, 다중 컬럼 서브 쿼리, 연관 서브 쿼리, 기타 서브 쿼리, 뷰(view)
|2024. 10. 22. 13:30
A. 서브쿼리
- 서브쿼리 개요
- 하나의 SQL문안에 포함되어 있는 또 다른 SQL문
- 서브쿼리는 메인쿼리의 칼럼을 모두 사용할 수 있음
- 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없음
- 질의 결과에 서브쿼리 칼럼을 표시해야 한다면 조인 방식으로 변환, 함수, 스칼라 서브쿼리(Scalar Subquery)를 사용
- 서브쿼리는 서브쿼리 레벨과는 상관없이 항상 메인쿼리 레벨로 결과 집합이 생성
- 서브쿼리 주의사항
- 괄호를 사용하여 서브쿼리 표시
- 서브쿼리는 단일 행(Single Row)/복수 행(Multiple Row) 비교 연산자와 함께 사용
- 단일 행 비교 연산자는 서브쿼리의 결과가 1 건 이하
- 복수 행 비교 연산자는 서브쿼리의 결과 건수와 상관없음
- 서브쿼리에서는 ORDER BY를 사용하지 못함
- 서브쿼리 사용 위치
- SELECT 절
- FROM 절
- WHERE 절
- HAVING 절
- ORDER BY 절
- INSERT문의 VALUE 절
- UPDATE문의 SET 절
B. 동작하는 방식에 따른 서브쿼리 분류
C. 반환되는 데이터의 형태에 따른 서브쿼리 분류
D. 단일 행 서브 쿼리
1) 단일 행 비교 연산자(=,〈,<=, >, >=,〈〉)와 함께 사용
2) 결과 건수가 반드시 1 건 이하
3) 메인쿼리는 서브쿼리에서 반환된 결과를 이용
E. 다중 행 서브 쿼리
1) 서브쿼리의 결과가 2건 이상
2) 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용
F. 다중 컬럼 서브 쿼리
1) 서브쿼리의 결과로 여러 개의 칼럼이 반환되어 메인쿼리의 조건과 동시에 비교
2) SQL Server에서는 지원되지 않는 기능
G. 연관 서브 쿼리
- 서브쿼리 내에 메인쿼리 칼럼이 사용된 서브쿼리
- 메인쿼리에 존재하는 모든 행에 대해서 반복 수행
- EXISTS 서브쿼리는 항상 연관 서브쿼리로 사용
- EXISTS 서브쿼리는 조건을 만족하는 건이 많아도 조건을 만족하는 1건만 찾으면 검색을 진행하지 않음
H. 기타 서브 쿼리
- SELECT 절에 서브쿼리
1. 스칼라 서브쿼리(Scalar Subquery)
2. 한 행,한 칼럼(1 Row 1 Column)만을 반환
3. 메인쿼리의 결과 건수만큼 반복수행
- FROM 절에 서브쿼리
1. 인라인 뷰(Inline View)
2. 동적으로 생성된 테이블인 것처럼 사용
3. 인라인 뷰에서는 ORDER BY절 사용 가능
- FROM 절에 서브쿼리 : TOP-N 쿼리
1. 인라인 뷰에 먼저 정렬을 수행하고 일부 데이터를 추출하는 것
2. 정렬 결과 중 일부 데이터만을 추출할 수 있는 방법이 필요
3. Oracle은 ROWNUM 연산자를 사용하여 TOP-N 쿼리를 구현
4. SQL Server은 TOP 연산자를 사용하여 TOP-N 쿼리를 구현
I. 뷰 (VIEW)
- 뷰(View)는 데이터 없는 가상 테이블(Virtual Table)
- 뷰 정의(View Definition)로 구현
- 뷰 정의 질의를 재작성(Rewrite)하여 쿼리 수행
- 존재하는 뷰를 참조해서도 신규 뷰 생성 가능
- 뷰를 포함하는 뷰를 잘못 생성하는 경우 성능 문제가 발생할 수 있음
- CREATE VIEW문을 통해서 생성
- DROP VIEW문으로 삭제