서브쿼리
- WHERE절에 SELECT SELECT * FROM 테이블명 WHERE 조건식 = (SELECT * FROM 테이블 명 ...)
- * 괄호 안에 쿼리가 들어감.
- SELECT절에 SELECT - 스칼라 서브쿼리 SELECT ( SELECT * FROM 테이블명 ) AS 별명 FROM 테이블명
- * 괄호 안에 쿼리가 들어감.
- FROM절에 SELECT - 뷰 SELECT * FROM (SELECT * FROM 테이블) ** 가상테이블 = 뷰
--메인 쿼리
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문을 메일 쿼리로 작성.
서브쿼리의 특징
- 서브쿼리는 연산자 등의 비교 또는 조회 대상 오른쪽에 놓이며 괄호 ( )로 묶어서 사용.
- 특수한 몇몇 경우를 제외한 대부분의 서브쿼리에서는 ORDER BY절을 사용 할 수 없음.
- 서브쿼리의 SELECT절에 명시한 열은 메인쿼리의 비교 대상과 같은 자료형과 같은 개수로 지정해야 함. 즉, 메인쿼리의 비교 대상 데이터가 하나라면 서브쿼리의 SELECT절 역시 같은 자료형인 열을 하나만 지정해야함.
- 서브쿼리에 있는 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를 반환 |
'SQL' 카테고리의 다른 글
| [SQL] SQL 속 또 다른 SQL, 서브쿼리_3 (0) | 2025.12.01 |
|---|---|
| [SQL] SQL 속 또 다른 SQL, 서브쿼리_2 (0) | 2025.12.01 |
| [SQL] 조인 (0) | 2025.12.01 |
| [SQL] 다중행 함수와 데이터 그룹화_2 (0) | 2025.12.01 |
| [SQL] 다중행 함수와 데이터 그룹화_1 (0) | 2025.12.01 |