[DataBase] 다중열 서브쿼리

다중열 서브쿼리 



다중열 서브쿼리는 서브쿼리의 SELECT 절에 비교할 데이터를 여러 개 지정하는 방식입니다 . 

다음과 같이 메인쿼리에 비교할 열을 괄호로 묶어 명시하고 서브쿼리에서는 괄호로 묶은 데이터와 같은 자료형 데이터를 SELECT 절에 명시하여 사용합니다 . 

SELECT * FROM EMP
  WHERE(DEPTNO,SAL) IN (SELECT DEPTNO, MAX(SAL)
                    FROM EMP  
                  GROUP BY DEPTNO);





FROM 절에 사용하는 서브쿼리와 WITH절 

WHERE가 아닌 FROM 절에서도 서브쿼리를 사용할 수 있습니다 . 

FROM 절에 사용하는 서브쿼리는 인라인 뷰라고 부르기도 합니다 . 

인라인 뷰의 특징은 전체 데이터가 아닌 SELECT 문을 통해 일부 데이터를 먼저 추출해 온 후 별칭을 주어 다음과 같이 사용합니다 . 

SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, DNAME, D.LOC
    FROM (SELECT * FROM EMP WHERE DEPTNO = 10 ) E10,
         (SELECT * FROM DEPT) D
      WHERE E10.DEPTNO = D. DEPTNO ;





데이터 규모가 너무 크거나 현재 작업에 불필요한 열이 너무 많아 일부 행과 열만 사용하고자 할 때 유용합니다 . 


WITH 절 사용하기 

WITH
E10 AS (SELECT * FROM EMP WHERE DEPTNO = 10),
D   AS (SELECT * FROM DEPT)
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
    FROM E10, D
  WHERE E10.DEPTNO = D.DEPTNO ;





FROM 절을 사용하는 것보다 다소 번거롭지만 , 여러 개의 서브쿼리가 몇백 줄이상 넘나드는 규모가 되었을 때 더 유용하게 사용할 수 있습니다 . 


SELECT 절에 사용하는 서브쿼리 

서브쿼리는 SELECT절에도 사용합니다 . 

흔히 스칼라 서브쿼리 라고 부릅니다 . 

이 서브 쿼리는 SELECT 절에 하나의 영역으로서 결과를 출력합니다 . 

SELECT EMPNO, ENAME, JOB, SAL,
        (SELECT GRADE
          FROME SALGRADE
        WHERE E.SAL BETWEEN LOSAL AND HISAL) AS SALGRADE,
      DEPTNO,
      (SELECT DNAME
        FROM DEPT
       WHERE E.DEPTNO = DEPT.DEPTNO) AS DNAME
    FROM EMP E ;

SELECT 절에 명시하는 서브쿼리는 반드시 하나의 결과만 반환하도록 작성해야 합니다 .