서브쿼리
하나의 SQL문에 포함된 또 하나의 SQL문.
알려지지 않은 기준을 이용한 검색을 위해 사용.
- 메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계.
→ 서브쿼리는 메인쿼리의 칼럼을 모두 사용할 수 있지만, 메인 쿼리는 서브 쿼리의 칼럼을 사용할 수 없다.
서브쿼리 주의사항
① 서브쿼리를 괄호로 감싸서 사용한다.
② 서브쿼리는 단일 행(Single Row) 또는 복수 행(Multiple Row) 비교 연산자와 함께 사용 가능하다.
→ 단일 행 비교연산자는 서브 쿼리의 결과가 반드시 1건 이하.
→ 복수 행 비교연산자는 서브 쿼리의 결과 건수와 상관 없음.
③ 서브쿼리에서는 ORDER BY를 사용하지 못한다.
→ ORDER BY절은 SELECT 절에서 오직 한 개만 올 수 있기 때문에 메인쿼리의 마지막 문장에 위치해야 한다.
서브쿼리 종류
종류 | 설명 |
Un-Correlated(비연관) 서브쿼리 | 서브쿼리가 메인쿼리 칼럼을 가지고 있지 않은 형태. 메인 쿼리에 서브쿼리가 실행된 결과 값을 제공하기 위한 목적으로 사용. |
Correlated(연관) 서브쿼리 | 서브쿼리가 메인쿼리 칼럼을 가지고 있는 형태. 메인쿼리가 수행된 후 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 사용. |
서브쿼리 사용 가능한 위치
- SELECT 절
- FROM 절
- WHERE 절
- HAVING 절
- ORDER BY 절
- INSERT 문 VALUES 절
- UPDATE 문 SET 절
반환되는 데이터의 형태에 따른 서브쿼리
1) 단일 행(Single Row) 서브쿼리
서브쿼리의 실행 결과가 항상 1건 이하.
→ 메인 쿼리에서 단일 행 비교 연산자(=, <, <=, >, >=, <>)를 통해 쿼리 수행.
→ 테이블 전체에 하나의 그룹함수를 적용할 때는 그 결과값이 1건 생성되기 때문에 단일 행 서브쿼리로 사용 가능.
2) 다중 행(Multi Row) 서브쿼리
서브쿼리의 실행 결과가 여러 건.
→ 메인 쿼리에서 다중 행 비교 연산자(IN, ALL, ANY, SOME)를 통해 쿼리 수행.
↓ 다중행 비교 연산자 ↓
- IN (서브쿼리)
: 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건.
(메인쿼리의 비교조건이 서브쿼리의 결과중에서 하나라도 일치하면 참.)
- 비교연산자 ALL (서브쿼리)
: 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건.
→ '>'를 사용했다면 메인쿼리는 서브쿼리의 모든 결과값을 만족해야하므로, 서브쿼리 결과의 최대값보다 큰 모든 건이 조건을 만족.
- 비교연산자 ANY (서브쿼리)
: 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건.
→ '>'를 사용했다면 메인쿼리는 서브쿼리의 값들 중 어떤 값이라도 만족하면 되므로, 서브쿼리 결과의 최소값보다 작은 모든 건이 조건을 만족.
- EXISTS (서브쿼리)
: 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건.
→ EXISTS 서브쿼리는 항상 연관 서브쿼리로 사용된다.
→ 조건을 만족하는 건이 여러 건이더라도 조건을 만족하는 1건만 찾으면 추가적인 검색을 진행하지 않는다.
3) 다중 칼럼(Multi Column) 서브쿼리
서브쿼리의 실행 결과로 여러 칼럼 반환.
→ 메인쿼리의 조건과 여러 칼럼을 동시에 비교
서브쿼리와 메인쿼리에서 비교하고자 하는 칼럼 개수와 위치가 동일해야 한다.
그 밖의 위치에서 사용하는 서브쿼리
1) SELECT (스칼라 서브쿼리)
한 칼럼, 한 행(1 Column 1 Row)만을 반환.
→ 서브쿼리에서 끝마친 값 하나를 SELECT 함.
→ 단일 행 서브쿼리.
→ 칼럼을 쓸 수 있는 대부분의 곳에서 사용 가능.
2) FROM (인라인 뷰 서브쿼리)
SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰. (Dynamic View)
→ 데이터베이스에 해당 정보가 저장되지 않음. (임시 뷰, 임시 테이블)
→ 서브쿼리를 끝마친 테이블 하나를 FROM 에서 테이블로 잡음.
→ 테이블 명이 올 수 있는 곳에서 사용 가능.
- 서브쿼리의 칼럼은 메인쿼리에서 사용할 수 없으나, 인라인 뷰는 동적으로 생성된 테이블이기 때문에 SQL문에서 자유롭게 참조할 수 있다.
→ 인라인 뷰를 사용하는 것은 JOIN 방식을 사용하는 것과 같다.
- 인라인 뷰에서는 ORDER BY 절을 사용할 수 있다.
TOP-N 쿼리
인라인 뷰에 먼저 정렬을 수행하고 정렬된 결과 중에서 일부 데이터를 추출하는 것.
TOP-N 쿼리를 수행하기 위해서는 정렬 작업, 정렬 결과 중 일부 데이터만 추출할 수 있는 방법이 필요.
→ Oracle의 ROWNUM (추출하고자 하는 데이터 건수 제약)
SELECT ...
FROM (SELECT ...
FROM
WHERE
ORDER BY )
WHERE ROWNUM <= 5;
3) HAVING (중첩 서브쿼리)
그룹함수와 함께 사용될 때 Grouping 된 결과에 대해 부가적인 조건을 주기 위해 사용.
'데이터베이스 > 데이터베이스 공부' 카테고리의 다른 글
TRUNCATE, DELETE, DROP 차이 (0) | 2022.08.29 |
---|---|
외래키 제약 조건 설정(ON DELETE, ON UPDATE, 참조 작업, CASCADE, SET NULL, SET DEFAULT, RESTRICT, NO ACTION) (0) | 2022.08.29 |
절차형 SQL (PL/SQL, 저장 모듈, 프로시저, 사용자 정의 함수, 트리거) (0) | 2022.08.28 |
SELF JOIN(셀프 조인, 셀프 조인 개념, 셀프 조인 표현식) (0) | 2022.08.27 |
[ORACLE] 계층형 쿼리(START WITH, CONNECT BY, PRIOR, ORDER SIBLINGS BY) (0) | 2022.08.26 |