article thumbnail image
Published 2022. 1. 1. 21:33
728x90

서브쿼리는 다른  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 절에 오는 뷰를 인라인 뷰라고 부릅니다. 

 

 

다음에는 문제를 한번 같이 풀어보도록할게요.

728x90

'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
복사했습니다!