[Oracle] 서브 쿼리

서브 쿼리란?

SQL문 내부에서 SELECT 문을 사용하는 것을 의미한다.

아래와 같이 조건식에 새로운 SELECT문이 들어가는 형식

SELECT 조회할 열
  FROM 조회할 테이블
 WHERE 조건식 (SELECT 조회할 열
                FROM 조회할 테이블
               WHERE 조건식 )

 

예시)  EMP테이블에서 'JONES' 보다 급여가 높은 사원의 이름을 불러오는 쿼리

SELECT ENAME
FROM EMP
WHERE SAL > ( SELECT SAL
		FROM EMP
               WHERE ENAME = 'JONES');

결과

 

단일행 서브쿼리

실행 결과가 단 하나의 행으로 나오는 서브쿼리를 뜻한다.

위 예시가 단일행 서브쿼리이다.

다중행 서브쿼리 

실행 결과가 여러 행인 서브 쿼리

IN, ANY, SOME, EXISTS 과 같은 연산자를 통해 활용할 수 있다.

IN

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

부서별 최고 급여 중 동일한 급여를  사원 정보를 출력

 

ANY,  SOME  (동일함)

SELECT * 
  FROM EMP
  WHERE SAL < ANY (SELECT MAX(SAL)
         	   FROM EMP
                   GROUP BY DEPTNO);

ANY에 = 연산를 하면 IN과 똑같은 기능이다.

ANY는 서브쿼리의 값들 중 하나라도 일치하면  TRUE를 반환한다.

 

 

ALL

ANY, SOME과 달리 모든 결과가 조건에 만족할 경우  TRUE

SELECT * 
  FROM EMP
  WHERE SAL < ALL (SELECT MAX(SAL)
         	   FROM EMP
                   GROUP BY DEPTNO);

부서별 최대급여 중 제일 낮은 급여보다 낮은 급여를 받는 직원을 불러오는 것 

 

EXISTS

IN 과 비슷하지만 IN은 일치하는 값만 불러오는 반면,

EXISTS는 일치하는 값이 하나라도 있으면 모두 불러온다는 차이점이 있다.

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

 

다중열 서브쿼리

비교할 열이 여러 개인 경우

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

 

FROM 절 서브쿼리

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

테이블을 1개 행을 전부 가져와서 별칭을 붙여주는 방식 = 가독성이 떨어지는 문제가 발생

=>  WITH 절 사용

WITH 절 서브쿼리

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

FROM, WITH 둘 다 같은 결과

 

SELECT 절 서브쿼리

"스칼라 서브쿼리" 라고도 부른다

 

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

'데이터베이스 > Oracle' 카테고리의 다른 글

[Oracle] 계층형 쿼리  (2) 2024.03.07
[Oracle] docker oracle 설치  (0) 2023.07.11
[Oracle] Trigger 연습  (0) 2023.04.13
[Oracle] JOIN  (0) 2023.04.07
Oracle 설치 및 SCOTT 계정 활성화  (0) 2023.04.06