JongDDA의 한걸음 한걸음씩
SQL - Sub Query(서브 쿼리) 본문
Sub Query(서브 쿼리)
하나의 쿼리 안에 또 다른 하나의 쿼리가 담겨 있는 것을 말한다.
문법 구조
SELECT 컬럼
FROM TABLE 또는 VIEW
WHRER 조건 연산자 (SELECT 컬럼
FROM TABLE
WHERE 조건 );
위 문법에서 괄호 안에 있는 쿼리를 Sub Query(서브 쿼리 또는 Inner Query)라고 부르고 나머지 괄호 밖 쿼리를 Main Query(또는 Outer Query)라고 부른다.
쿼리의 수행 순서를 보면 서브쿼리가 먼저 수행되어 결과를 만들고 그 결과값을 메인쿼리로 전해준다. 메인쿼리는 그 값을 받아 나머지 쿼리를 수행하여 최종 결과를 출력하게 된다. 반드시 서브쿼리가 먼저 수행되는 것은 아니며 어떤 경우에는 메인쿼리가 먼저 수행되는 경우도 있다.
** Sub Query(서브 쿼리) 작성시 주의사항
- Sub Query(서브 쿼리) 부분은 WHERE절에 연산자 오른쪽에 위치해야 하며 반드시 괄호로 묶어야 한다.
- 특별한 경우를 제외하고 Sub Query(서브 쿼리)절에 Order by 절이 올 수 없다.
- 단일행 Sub Query(서브 쿼리)와 다중행 Sub Query(서브 쿼리)에 따라 연산자를 잘 선택해야 한다.
Sub Query(서브 쿼리)의 종류
단일행 Sub Query(Single Row Sub Query)
: 단일행 Sub Query란 Sub Query의 수행 결과값이 1개의 행만 출력되는 것을 말한다.
: 가장 일반적으로 많이 사용되는 유형이며 Sub Query를 수행한 결과가 1건만 나오고 이 결과를 Main Query로 전달해서 Main Query를 수행하게 된다.
단일행 Sub Query WHERE 절에서 사용되는 연산자
연산자 | 의미 |
= | 같다 |
<> | 같지 않다 |
> | 크다 |
>= | 크거나 같다 |
< | 작다 |
<= | 작거나 같다 |
EX) JONES 사원보다 더 많이 급여
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ( SELECT SAL
FROM EMP
WHERE ENAME = 'JONES');
다중행 Sub Query(Multi Row Sub Query)
: Sub Query의 결과가 2건 이상 출력되는 것을 말한다.
: 단일행 연산자를 사용할 수 없으며 아래와 같이 별도의 연산자를 사용해야 한다.
다중행 Sub Query WHERE 절에서 사용되는 연산자
연산자 | 의미 |
IN | 서브 쿼리 결과와 같은 값을 찾는다 |
EXISTS | 서브 쿼리의 값이 있을 경우 메인 쿼리를 수행한다. |
>ANY | 서브 쿼리 결과 중에서 최솟값을 반환한다. |
<ANY | 서브 쿼리 결과 중에서 최댓값을 반환한다. |
<ALL | 서브 쿼리 결과 중에서 최솟값을 반환한다. |
>ALL | 서브 쿼리 결과 중에서 최댓값을 반환한다. |
-> ANY, ALL은 연산자의 방향에 따라 최댓값, 최솟값이 달라진다.
EX) 부서번호가 10인 사원의 봉급과 같은 사원의 이름과 봉급 출력
SELECT ENAME, SAL
FROM EMP
WHERE SAL IN ( SELECT SAL FROM EMP WHERE DEPTNO = 10);
** EXISTS 와 IN 의 차이
: EXISTS 연산자는 Sub Query의 결과가 있으면 그 결과에 관계없이 Main Query를 수행하지만 IN 연산자는 Sub Query에 결과가 있으면 그 결과에 해당되는 메인 쿼리를 수행하는 것이다.
SELECT ENAME, SAL, DEPTNO
FRM-OM EMP
WHERE EXISTS ( SELECT SAL FROM EMP WHERE DEPTNO = 10);
다중 컬럼 Sub Query(Multi Column Sub Query)
: Sub Query의 결과가 여러 컬럼일 경우를 말한다.
: 주로 Primary Key를 여러 컬럼을 합쳐서 만들었을 경우 한꺼번에 비교하기 위해 자주 사용된다.
EX) EMP 테이블을 조회하여 각 직업별로 최대 봉급을 가진 사원들의 이름, 직업, 봉급을 출력
SELECT ENAME, JOB, SAL
FROM EMP
WHERE (JOB, SAL) IN ( SELECT JOB, MAX(SAL)
FROM EMP
GROUP BY JOB);
-> Sub Query에서 두 개의 컬럼을 동시에 Main Query로 넘겨서 비교한다.
상호 연관 Sub Query
: Main Query 값을 Sub Query에 주고 Sub Query에 수행한 후 그 결과를 다시 Main Query로 반환해서 수행하는 Sub Query를 말한다. 즉, Main Query와 Sub Query가 서로 데이터를 주고받는 형태이다.
EX) EMP 테이블에서 사원들 중 자신의 직급의 평균봉급과 같거나 많이 받는 사원들의 이름, 직업, 봉급 출력
SELECT ENAME, JOB, TO_CHAR(SAL,'$999,999.999') "SAL"
FROM EMP A
WHERE SAL >= (SELECT AVG(SAL)
FROM EMP B
WHERE A.JOB = B.JOB);
-> Main Query를 먼저 수행해서 직업을 구한 다음 Sub Query에 전달해 주고 그 값을 받은 Sub Query가 수행되어 결과를 다시 Main Query로 전달해 준다. 그 후에 다시 받은 값을 가지고 Main Query가 최종적으로 수행되는 형태이다.
이는 Sub Query가 잘못 사용될 경우 성능 저하의 원인이 될 수 있으므로 조심해야 한다.
'개발 > SQL' 카테고리의 다른 글
SQL - VIEW(뷰) (0) | 2021.07.28 |
---|---|
SQL - DML(데이터 조작 언어) (0) | 2021.07.28 |
SQL - DDL(데이터 정의 언어) (0) | 2021.07.26 |
SQL - 조인(JOIN) (0) | 2021.07.25 |
SQL - 복수행 함수(그룹함수), GROUP BY 절 (0) | 2021.07.25 |