서브쿼리

조예빈·2024년 4월 4일
0

Oracle

목록 보기
8/26
post-custom-banner

서브쿼리(SUBQUERY)

  • SQL문을 실행하는 데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT문
  • 여러 데이터를 가져올 때는 비효율적임(join이 더 간편하기 때문)
SELECT *
FROM EMP
WHERE SAL > (SELECT SAL
             FROM EMP
             WHERE ENAME = 'JONES');

특징

  1. 서브쿼리는 연산자와 같은 비교 또는 조회 대상의 오른쪽에 놓이며 괄호()로 묶어 사용함
  2. 대부분의 서브쿼리에서는 ORDER BY절을 사용할 수 없음
  3. 서브쿼리의 SELECT절에 명시한 열은 메인쿼리의 비교 대상과 같은 자료형과 같은 개수로 지정해야 함. 즉, 메인쿼리의 비교 대상 데이터가 하나라면 서브쿼리의 SELECT절 역시 같은 자료형인 열을 하나 지정해야 함
  4. 서브쿼리에 있는 SELECT문의 결과 행 수는 함께 사용하는 메인쿼리의 연산자 종류와 호환 가능해야 함. 예를 들어 메인쿼리에 사용한 연산자가 단 하나의 데이터로만 연산이 가능한 연산자라면 서브쿼리의 결과 행 수는 반드시 하나여야 함

사용 위치

  • where 조건문
  • 칼럼(스칼라 서브쿼리)
  • having 절
  • from (인라인뷰) : 또다른 SQL인 느낌

단일행 서브쿼리

  • 실행 결과가 단 하나의 행으로 나오는 서브쿼리
  • 서브쿼리에서 출력되는 결과가 하나이므로 메인쿼리와 서브쿼리 결과는 단일행 연산자를 사용하여 비교

날짜형 데이터

  • 단일행 서브쿼리는 서브쿼리 결과 값이 날짜(DATE) 자료형일 때도 사용 가능

함수

  • 서브쿼리에서 특정 함수를 사용한 결과 값이 하나일 때도 단일행 서브쿼리로 사용 가능
SELECT E.EMPNO, E.ENAME, E.JOB, E.SAL, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.DEPTNO = 20
AND E.SAL > (SELECT AVG(SAL) FROM EMP);

다중행 서브쿼리

  • 실행 결과 행이 여러 개로 나오는 서브쿼리
  • 단일행 연산자 사용 못함
  • 다중행 연산자를 사용해야 메인쿼리와 비교 가능
다중행 연산자설명
IN메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치하는 데이터가 있으면 TRUE
ANY,SOME메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 TRUE
ALL메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 TRUE
EXISTS서브쿼리의 결과가 존재하면(행이 1개 이상이면) TRUE

다중열 서브쿼리(복수열 서브쿼리)

  • 서브쿼리의 SELECT절에 비교할 데이터를 여러 개 지정하는 방식
  • 메인쿼리에 비교할 열을 괄호로 묶어 명시하고 서브쿼리에는 괄호로 묶은 데이터와 같은 자료형 데이터를 SELECT절에 명시하여 사용할 수 있음

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

  • FROM절에서도 서브쿼리를 사용할 수 있음 -> 인라인뷰(inline view)
  • 특정 데이터가 아닌 SELECT문을 통해 일부 데이터를 먼저 추출해 온 후 별칭을 주어 사용할 수 있음
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;

상호 연관 서브쿼리(correlated subquery)

  • 메인 쿼리에 사용한 데이터를 서브쿼리에서 사용하고, 서브쿼리의 결과 값을 다시 메인쿼리로 돌려주는 방식
  • 성능을 떨어뜨리는 원인이 될 수 있어 사용 빈도가 높지 않음
SELECT *
FROM EMP E1
WHERE SAL > (SELECT MIN(SAL)
			 FROM EMP E2
             WHERE E2.DEPTNO = E1.DEPTNO)
ORDER BY DEPTNO, SAL;

SELECT 절에 사용하는 서브쿼리

  • 스칼라 서브쿼리
  • SELECT절에 하나의 열 영역으로서 결과를 출력할 수 있음
  • SELECT문에 들어가는 서브쿼리는 무조건 결과값이 하나만 나와야 함
  • 스칼라 서브쿼리가 포함된 쿼리의 실행은'데이터 개수+1'만큼 실행된다는 단점이 있음
--조인을 사용하지 않고 직원명, 부서명 출력
SELECT ENAME AS "직원명",
    (SELECT DNAME FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO) AS "부서명"
FROM EMP;

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러
post-custom-banner

0개의 댓글