ALTIBASE HDB 5.3.3 기초강좌
SUBQUERY 0 0 72,414

by Altibase 서브쿼리 SUBQUERY IN ANY ALL EXISTS [2012.01.25]


  서브쿼리는 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 의미합니다.

SUBQUERY 개념

  SQL 에 포함된 또 다른 SQL을 서브쿼리라고 합니다. 서브쿼리는 SELECT절, FROM절, WHERE절, HAVING절에 사용될 수 있습니다.

  서브쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되며 서브쿼리에서는 메인 쿼리의 모든 컬럼을 참조할 수 있지만 메인 쿼리에서는 서브쿼리의 컬럼을 참조할 수 없습니다.

  • [그림] 서브쿼리 개념
  • 서브쿼리 개념

SUBQUERY 유형

단일행 서브쿼리
  • 서브쿼리에서 한 행에 대한 결과 값만 반환하는 것을 단일행 서브쿼리라고 합니다

다중행 서브쿼리
  • 서브쿼리에서 여러 행에 대한 결과 값을 반환하는 것을 다중행 서브쿼리라고 합니다.

다중열 서브쿼리
  • 서브쿼리에서 여러 열에 대한 결과 값을 반환하는 것을 다중열 서브쿼리라고 합니다.

SUBQUERY 구문

 
SELECT select_list
FROM table_name
WHERE 표현식 연산자 (SELECT select_list
                       FROM table_name
                       WHERE 조건식);
    
  • 표현식 연산자 : subquery는 비교 연산자 우측에 () 안에 작성한다.

SUBQUERY 예제

  employee 테이블에서 gildong보다 급여를 많이 받는 사원을 출력하시오.

 
iSQL> SELECT ename, salary
      FROM employee
      WHERE salary > (SELECT salary
                      FROM employee
                      WHERE ename = 'gildong') ;
    

SUBQUERY 연산자

단일행 SUBQUERY 연산자

  WHERE 절에서 사용된 서브쿼리에서 한 개의 결과 값만 반환할 경우 사용하는 연산자는 다음과 같습니다. 이 외의 연산자를 사용할 경우 에러가 발생할 수 있습니다.

연산자 의미
= 같음
> 보다 큼
>= 크가나 같음
< 보다 작음
<= 작거나 같음
, != 같지 않음

단일행 SUBQUERY 연산자 예제

  20번 사원과 같은 부서에서 일하는 사원을 출력하시오.

 
iSQL> SELECT ename, dno
      FROM employee
      WHERE dno = (SELECT dno
                   FROM employee
                   WHERE eno = 20) ;
    

다중행 SUBQUERY 연산자

  다중 행 subquery를 이용하여 데이터를 비교할 경우에는 다중 행 연산자를 사용합니다. 만약 다중 행 subquery에 단일 행 연산자를 사용한다면, 다음과 같은 오류가 발생합니다.

  "A single-row subquery returns more than one row"

연산자 의미
IN subquery 결과에 존재하는 임의의 값과 일치
ANY subquery 결과에 존재하는 어느 하나의 값이라도 만족
ALL subquery 결과에 존재하는 모든 값에 만족
EXISTS subquery 결과를 만족하는 값이 존재하는지 여부를 확인

다중행 SUBQUERY 예제

  각 부서에서 급여를 가장 적게 받는 사원들을 출력하시오

 
iSQL> SELECT dno, ename, salary
      FROM employee
      WHERE salary = (SELECT MIN(salary)
                      FROM employee
                      GROUP BY dno);
[ERR-31002 : A single-row subquery returns more than one row.]


iSQL> SELECT dno, ename, salary
      FROM employee
      WHERE salary IN (SELECT MIN(salary)
                       FROM employee
                       GROUP BY dno) ;

10 rows selected.  
    

SCALAR SUBQUERY

SCALAR SUBQUERY 개념

  SELECT 의 target 절에서 사용하는 서브쿼리를 스칼라 서브쿼리라고 합니다.

  스칼라 서브쿼리는 메인 서브쿼리의 row수 만큼 반복되어 실행이 되고, 만약 조건에 만족하는 스칼라 서브쿼리의 결과가 없다면 NULL 을 리턴하게 됩니다.

SCALAR SUBQUERY 예제

  사원 정보와 각 사원이 속한 부서의 평균 급여를 함께 출력하시오.

 
iSQL> SELECT ename, salary, (SELECT AVG(salary) FROM employee WHERE dno = e.dno) avg_sal 
      FROM employee e;
      
ENAME            SALARY       AVG_SAL     
-------------------------------------------
HSCHOI           2000000      2150000     
KSKIM            1800000      1800000
    

INLINE VIEW

INLINE VIEW 개념

  SELECT 의 FROM 절에서 사용하는 서브쿼리를 inline view라고 합니다. view와는 달리 inline view에서 사용하는 SELECT문을 저장하지 않기 때문에 dynamic view 라고도 부릅니다.

  다른 서브쿼리와는 다르게 inline view에서 질의하는 칼럼들을 메인 서브쿼리에서 사용할 수 있습니다.

INLINE VIEW 예제

  사원 정보와 각 사원이 속한 부서의 평균 급여를 함께 출력하라.

 
iSQL> SELECT e.ename, e.salary, a.avg_sal
      FROM employee e, (SELECT dno, AVG(salary) avg_sal FROM employee GROUP BY dno) a
      WHERE e.dno = a.dno;
    
ENAME             SALARY       AVG_SAL     
-----------------------------------------
HSCHOI            2000000      2150000     
JHCHOI            2300000      2150000     
HYCHOI            1700000      1340000     
KWKIM              980000      1340000     
YHBAE             4000000      2438250
…
    

- 강좌 URL : http://www.gurubee.net/lecture/2179

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입