[15] SUBQUERY
15.1. 서브쿼리
- 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다.
- 하나의 SQL문으로 풀 수 없는, 조금 더 복잡한 데이터를 추출할 때,
- 서브쿼리는 메인 쿼리의 컬럼을 모두 사용할 수 있지만, 메인 쿼리는 서브쿼리의 컬럼을 사용할 수 없다.
- 서브쿼리를 괄호로 감싸서 사용한다.
- 서브쿼리는 단일 행(SINGLE ROW)또는 복수 행(MULTIPLE ROW) 비교 연산자와 함께 사용 가능하다.
- 단일 행(SINGLE ROW) 비교 연산자는 반드시 1건 이하여야 한다.
- 복수 행(MULTIPLE ROW) 비교 연산자는 서브쿼리의 결과 건수와 상관없다.
- 서브쿼리에서는 ORDER BY를 사용하지 못한다.
- ORDER BY절은 메인 쿼리의 마지막 문제이 위치하여야 한다.
- 서브쿼리가 사용 가능한 위치
- SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT문의 VALUES, UPDATE문의 SET
15.2. 서브쿼리 구분
- 중첩 서브쿼리
- WHERE절
- 인라인 뷰
- FROM절
- 스칼라 서브쿼리
- SELECT절
15.3. 서브쿼리 구분2
단일행 서브쿼리
- 하나의 값을 리턴하는 서브쿼리이다.
- 일반적인 연산자 모두 사용가능하다. (=, >, <, AND, OR, NOT)
다중행 서브쿼리
- 리턴 값이 여러 개의 레코드이다.
- 결과를 처리하는 전용 연산자가 있다. (IN, ALL, ANY, EXISTS)
15.4. 연산자
ANY 연산자
- 값을 서브쿼리에 의해서 반환된 값과 비교한다.
- 서브쿼리의 값이 어떠한 값이라도 만족을 하면 조건이 성립한다.
- 여러 개 레코드의 OR 효과
- 메인 쿼리에서 가장 작은 값보다 큰 것만 추출한다.
ALL 연산자
- 서브쿼리에 의해 반환된 값과 비교한다.
- 서브쿼리의 모든 값이 만족을 해야만 조건이 성립된다.
- 여러 개의 레코드의 AND효과
- 메인 쿼리에서 가장 큰 값보다 큰 것만 추출한다.
IN / EXISTS 연산자
- 서브쿼리 내에 집합이 존재하는지에 대한 존재 여부만 판단한다.
- 결과값 중에 있는 것 중에서의 존재여부이다.
- IN은 전체 레코드를 스캔한다. EXISTS는 존재여부만 확인하고 스캔하지 않는다.
- 존재하면 TRUE, 존재하지 않으면 FALSE
- 연산 시 부하가 줄어든다.
'DBMS' 카테고리의 다른 글
[DBMS] 트랜잭션(Transaction) - CRUD, 4대 특징 ACID, SAVE POINT, ROLLBACK, COMMIT (0) | 2023.03.28 |
---|---|
[DBMS] 분석함수 - LAG, LEAD, UNBOUNDED PRECEDING, CURRENT ROW, UNBOUNDED FOLLOWING (0) | 2023.03.27 |
[DBMS]GROUPING SETS - CUBE(), ROLLUP(), GROUPING SET() (0) | 2023.03.16 |
[DBMS]DBMS Review - JOIN, 데이터가공, 날짜, 문자, COUNT, MAX, MIN, AVG, SUM (0) | 2023.03.15 |
[DBMS]JOIN 2 - UNION, INTERSECT, EXCEPT (0) | 2023.03.14 |
댓글