서브쿼리는 다른 select 문장의 절에 내장된 select 문장입니다.
서브쿼리를 사용하여 간단한 문장을 강력한 문장으로 만들수 있습니다.
테이블 자체의 데이터에 의존 하는 조건으로 테이블의 행을 검샐할 필요가 있을 때 서브쿼리는 아주 유용합니다.
예를 한번 보겠습니다.
다음의 SQL 절에 서브쿼리를 작성할수 있습니다.
- SELECT 절(스칼라 서브쿼리)
- FROM 절(인라인뷰)
- WHERE 절
- HAVING 절
- ORDER BY 절
- INSERT 문의 VALUES 절
- UPDATE 문의 SET 절
- CREATE TABLE 문의 AS 절
다음은 서브쿼리르 사용할 때 지켜야할 사항들입니다.
서브쿼리는 괄호로 둘러싸야 합니다.
서브쿼리는 비교 연산자의 오른쪽에 있어야 합니다.
서브쿼리는 ORDER BY 절에 포함할 수 없습니다.
SELECT 문장에 대해서는 오직 하나의 ORDER BY 절을 가질 수 있으며, SELECT 문자의 제일 마지막에 있어야 합니다.
서브쿼리에서는 두 종류의 비교연산자를 사용합니다. 단일 행 서브쿼리에는 단일 행 연산자를 사용해야 하며, 다중 행 서브쿼리에는 다중 행 연산자를 사용해야 합니다.
단일 행 서브쿼리
단일 행 서브쿼리는 내부 SELECT 문장으로부터 하나의 행을 리턴하는 질의 입니다.
이런 유형의 서브쿼리는 단일 행 연산자를 사용합니다.
다음표는 단일행 연산자의 목록을 보여줍니다.
연산자 | 설명 |
= | 같다 |
> | 보다 크다 |
>= | 보다 크거나 같다 |
< | 보다 작다 |
<= | 보다 작거나 같다 |
<> | 같지않다 |
다음 구문은 103번 사원의 직무와 같은 사원의 이름과 직무, 그리고 입사일을 출력합니다.
103번 사원은 오직 한명입니다. 그러므로 서브쿼리는 최대 한 개 행을 리턴합니다.
다중 행 서브쿼리
Nancy의 급여보다 많은 급여를 받는 사원의 이름과 급여를 출력하는 문제에서 다른 사원의 이름을 이용하여 같은 문제를 해결하려 할 때 질의가 정상 실행되지 않을 수 있습니다.
다음 구문은 David보다 많은 급여를 받는 사원의 이름과 급여를 출력하기 위해 작성했습니다.
위 구문을 실행시키면 다음과 같은 에러가 발생합니다. 에러의 의미는 단일 행 서브쿼리가 한개행보다 많은 행을 리턴했다는 의미입니다. 위 구문에서 WHERE 절의 비교 연산자는 한번에 여러개 값과 비교할 수 없습니다.
First_name = David 가 여러행이 존재하기 때문에 단일행 서브쿼리가 실행되지 않는다.
서브쿼리 결과가 2개행 이상일 경우 다중 행 서브쿼리라고 부릅니다. 서브쿼리가 다중행 서브쿼리일 경우 사용되는 연산자가 다릅니다.
연산자 | 설명 |
IN | 목록의 어떤 값과 같은지 확인합니다( IN 가장많이 쓰입니다.) |
ANY,SOME | 값을 서브쿼리에 의해 리턴된 각각의 값과 비교합니다. 하나라도 만족하면됩니다. |
ALL | 값을 서브쿼리에 의해 리턴된 모든값과 비교합니다. 모든값과 비교해서 만족해야 합니다. |
EXISTS | 결과를 만족하는 값이 존재하는지 여부를 확인합니다. |
ALL과 ANY의 차이점 | <ANY : 가장 큰 값 보다 작으면 됩니다. > ANY : 가장 작은 값보다 크면 됩니다. <ALL : 가장 작은 값보다 작아야합니다. > ALL : 가장 큰 값보다 커야합니다. =ANY: IN과 같은 역할을 합니다. |
다음 구문은 이름이 David인 사원들 중에서 어느 한사람의 급여보다 많은 급여를 받는 사원의 이름과 급여를 출력합니다.
다음 구문은 David와 같은 부서에 근무하는 사원의 이름(First_name)과 부서번호, 직무를 출력합니다. IN 연산자와 서브쿼리를 이용하였습니다.
스칼라 서브쿼리
스칼라(Scalar) 서브쿼리 select 절 사용하는 서브쿼리입니다.
스칼라 서브쿼리를 이용하면 다양한 결과를 도출할 수 있으며, 특히 조인을 수행할 시 조인할 행의 수를 줄여 성능을 향상시킬 수 있습니다.
SQL Developer 에서 위 두 구문을 각각 실행한 다음 [f10] 키를 누르면 실행계획을 볼수 있습니다.
인라인뷰(Inline view)
인라인뷰는 from 절에 서브쿼리가 온 것을 말합니다. from 절에는 테이블 또는 뷰가 올 수 있습니다.
그런데 서브쿼리를 from 절에 사용해 하나의 테이블 또는 뷰처럼 사용할 수 있습니다.
뷰는 하나의 독립적인 select문이므로 from 절에 사용하는 서브쿼리도 하나의 뷰로 볼 수 있습니다.
그래서 from 절에 오는 뷰를 인라인 뷰라고 부릅니다.
다음에는 문제를 한번 같이 풀어보도록할게요.
'DB' 카테고리의 다른 글
뷰(View) (0) | 2022.01.05 |
---|---|
DML-1 (0) | 2022.01.04 |
DML(DATA MANIPULATION LANGUAGE) (0) | 2022.01.04 |
SQL-JOIN이란? (0) | 2021.12.31 |
SQL - 다양한 함수(문자,숫자 날짜) (0) | 2021.12.28 |