코진남

서브쿼리 란? 본문

Database

서브쿼리 란?

woojin126 2021. 12. 12. 15:21

서브 쿼리는 SQL문을 실행하는데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에

사용하는 SELECT문을 의미한다. 서브쿼리의 결과 값을 사용하여 기능을 수행하는 영역은

메인쿼리라고 부른다.

서브쿼리 특징

1.서브쿼리는 연산자와 같은 비교 또는 조회 대상의 오른쪽에 놓이며 괄호 ()로 묶어서 사용한다.

2.특수한 몇몇 경우를 제외한 대부분의 서브쿼리에서는 ORDER BY 절을 사용할 수 없다.

3.서브쿼리의 SELECT절에 명시한 열은 메인쿼리의 비교 대상과 같은 자료형과 같은 개수로 지정해야 한다. 즉 메인쿼리의 비교 대상 데이터가 하나라면 서브쿼리의 SELECT 절 역시 같은 자료형인 열을 하나 지정 해야한다.

4.서브쿼리에 있는 SELECT문의 결과 행 수는 함께 사용하는 메인쿼리의 연산자 종류와 호환 가능해야 한다.

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

단일행 서브쿼리

단일행 서브쿼리는 실행 결과가 단 하나의 행으로 나오는 서브쿼리를 뜻한다.

서브쿼리에서 출력되는 결과가 하나이므로 메인쿼리와 서브쿼리 겨과는 다음과 같이 단일행 연산자를 사용하여 비교한다.

단일행 연산자

> , >=, =, <= , < , <> , ^= , !=

예제)

예를 들어 20번 부서에 속한 사원 중 전체 사원의 평균 급여보다 높은 급여를 받는 사원

정보와 소속 부서 정보를 함께 조회하는 경우를 생각해보자.

SELECT E.EMPNO, E.ENAME, E.JOB, E.SAL, D.DEPTNO, D.DNAME, D.LOC FROM EMP E INNER JOIN DEPT D ON(E.DEPTNO = D.DEPTNO) WHERE E.DEPTNO=20 AND E.SAL > (SELECT AVG(SAL) FROM EMP);

결과 값

다중행 서브쿼리

다중행 서브쿼리는 실행 결과 행이 여러 개로 나오는 서브쿼리를 가리킨다.

앞에서 살펴본 단일행 서브쿼리와 달리 서브쿼리 결과가 여러 개이므로 단일행 연산자는 사용할수 없고 다중행 연산자를 사용해야 메인쿼리와 비교할 수 있다.

다중행 연산자

*IN : 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true

*ANY,SOME : 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true

*ALL:메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true

*EXISTS: 서브쿼리의 결과가 존재하면 true

IN 연산자 예제)

각 부서별 최고 급여와 동일한 급여를 받는 사원 정보 출력

SELECT * FROM EMP WHERE SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);

결과)

ANY 연산자 예제)

30번 부서 사원들의 최대 급여보다 적은 급여를 받는 사원 정보 출력

SELECT * FROM EMP WHERE SAL < ANY(SELECT SAL FROM EMP WHERE DEPTNO=30) ORDER BY SAL,EMPNO;

tip) 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true 이니까

서브쿼리문에서 DEPTNO=30 인 부서중 가장 큰 SAL보다만 작으면 된다.

결과

ALL 연산자 예제)

SELECT * FROM EMP WHERE SAL > ALL (SELECT SAL FROM EMP WHERE DEPTNO = 30);

결과

'Database' 카테고리의 다른 글

트랜잭션  (0) 2021.12.12
다중행 서브쿼리  (0) 2021.12.12
서브쿼리,단일행 서브쿼리  (0) 2021.12.12
서브쿼리 ON, WHERE 차이점  (0) 2021.12.12
오라클 데이터 처리 가공 함수모음  (0) 2021.12.12