본문 바로가기
SQL

[SQL] SQL 속 또 다른 SQL, 서브쿼리_1

by lmyourpearl 2025. 12. 1.

서브쿼리

  1. WHERE절에 SELECT SELECT * FROM 테이블명 WHERE 조건식 = (SELECT * FROM 테이블 명 ...)
  2. * 괄호 안에 쿼리가 들어감.
  3. SELECT절에 SELECT - 스칼라 서브쿼리 SELECT ( SELECT * FROM 테이블명 ) AS 별명 FROM 테이블명
  4. * 괄호 안에 쿼리가 들어감.
  5. FROM절에 SELECT - 뷰 SELECT * FROM (SELECT * FROM 테이블) ** 가상테이블 = 뷰
  6.  
--메인 쿼리
SELECT 조회할 열
	FROM 조회할 테이블
 WHERE 조건식   (SELECT 조회할 열
                  FROM  조회할 테이블
                  WHERE 조건식) -- 서브쿼리

서브쿼리(subquery)

SQL 구문을 실행하는 데 필요한 데이터를 추가로 조회하고자 SQL구문 내부에서 사용하는 SELECT문을 의미하며, 서브쿼리의 결괏값을 사용하여 기능을 수행하는 영역은 메인쿼리 (main query)라고 함.

서브쿼리는 실제로 INSERT문, UPDATE문, DELETE문, CREATE문 등 다양한 SQL 구문에서 사용.

-- 이름이 JONES인 사원의 급여 출력하기
SELECT SAL
    FROM EMP
WHERE ENAME = 'JONES';


-- 급여가 2975보다 높은 사원 정보 출력하기
SELECT *
    FROM EMP
  WHERE SAL > 2975;
  
  
  -- 서브쿼리로 JONES의 급여보다 높은 급여를 받는 사원 정보 출력
SELECT *
    FROM EMP
  WHERE SAL > (SELECT SAL
               FROM  EMP
               WHERE ENAME = 'JONES');
  • 지금 JONES의 급여보다 높은 급여를 받는 사원을 찾고자 2개의 SELECT문을 작성했는데, 서브쿼리를 사용하면 SELECT문 2개를 하나로 합칠 수 있음.
  • 이들 SELECT문 중 WHERE절의 조건식에 들어갈 기준 급여(JONES의 급여)를 구하는 SELECT문이 서브쿼리가 되고 이 기준 급여보다 높은 급여를 받은 사원을 조회하는 SELECT문을 메일 쿼리로 작성.

 

서브쿼리의 특징

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

** 서브쿼리는 메인쿼리의 연산자와 함께 상호 작용하는 방식에 따라 크게 단일행 서브쿼리와 다중행 서브쿼리로 나뉨.


실행 결과가 하나인 단일행 서브쿼리

단일행 서브쿼리(single-row subquery)는 실행 결과가 행 하나인 서브쿼리를 뜻하며, 서브쿼리가 출력하는 결과가 하나이므로 메인쿼리와 서브쿼리 결과는 단일행 연산자를 사용하여 비교

단일행 연산자
> = < <> ^=
초과 이상 같음 이하 미만 같지 않음    

 

단일행 서브쿼리와 날짜형 데이터

단일행 서브쿼리는 서브쿼리 결괏값이 날짜(DATE) 자료형일 때도 사용할 수 있음.

-- 서브쿼리의 결괏값이 날짜인 경우

SELECT *
    FROM EMP
  WHERE HIREDATE < (SELECT HIREDATE
                      FROM EMP
                      WHERE ENAME = 'BLAKE');

 

단일행 서브쿼리와 함수

-- 서브쿼리 안에서 함수를 사용한 경우
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);

서브쿼리에서 특정 함수를 사용한 결괏값이 하나일 때 역시 단일행 서브쿼리로 사용 가능.


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

다중행 서브쿼리(multiple-row subquery)는 실행 결과가 여러 행인 서브쿼리를 말하며, 단일행 서브쿼리와 달리 결과가 여러 행이므로 단일행 연산자는 사용할 수 없고 다중행 연산자를 사용해야 메인쿼리와 비교할 수 있음

다중행 연산자 설명
IN 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true를 반환.
ANY, SOME 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true를 반환.
ALL 메인쿼리의 조건식을 서브쿼리의 결과가 모두 만족하면 true를 반환.
EXISTS 서브쿼리의 결과가 있다면(즉, 행이 1개 이상이라면) true를 반환