Notice
Recent Posts
Recent Comments
Link
Tags
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

JongDDA의 한걸음 한걸음씩

SQL - Sub Query(서브 쿼리) 본문

개발/SQL

SQL - Sub Query(서브 쿼리)

종따 2021. 7. 31. 17:44
728x90

 

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가 잘못 사용될 경우 성능 저하의 원인이 될 수 있으므로 조심해야 한다.

 

 

 

 

 

 

 

 

728x90
반응형

'개발 > 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
Comments