본문 바로가기

Database

8. 서브쿼리

서브쿼리 

하나의 SQL문장 안에 포함된 또 하나의 SQL 문장 

 

예제: 사원 smith의 부서명 조회

 

단일행 서브쿼리

- 서브쿼리의 결과가 한 개의 행만 나오는 것.

- 메인쿼리의 WHERE 절에서 단일행 연산자만 사용해야 한다.(=, <>, >, <, >=, <=)

 

예제1 : James와 같은 부서의 직원들 조회

SELECT ename, job, deptno
FROM emp_table
WHERE deptno = (SELECT deptno
                FROM emp_table
                WHERE ename = 'JAMES');

예제 1 결과

 

예제2: 평균 급여보다 많이 받는 직원들 조회

SELECT ename, sal
FROM emp_table
WHERE sal >= (SELECT AVG(sal)
              FROM emp_table);

예제 2 결과

 

 

다중행 서브쿼리

- 서브쿼리의 결과가 두 건 이상 출력.

- 단일행 연산자는 사용할 수 없으며 다중행 연산자를 사용해야 한다.

  * 다중행 연산자: IN, NOT IN, ANY, ALL, EXISTS

 

1. IN연산자(≒OR연산자)

예제: 급여를 3000 이상 받는 사원이 소속된 부서와 동일한 부서에서 근무하는 사원 조회 * NOT IN은 반대의 결과 가져옴

SELECT ename, sal, deptno      
FROM emp_table
WHERE deptno IN (-- 2번                                             
                 SELECT DISTINCT deptno  -- 1번 
                 FROM emp_table
                 WHERE sal >= 3000);

- 1번(서브쿼리 결과): 급여가 3000이 넘는 사원들의 부서번호(중복 제외) → 10, 20

- 2번(메인쿼리 메인쿼리): deptno가 10 IN(OR) 20인 사원들의 ename, sal, deptno 조회

 

예제 결과

 

 

2. ANY(SOME)

메인쿼리의 비교 조건이 서브쿼리의 여러 결과 중 하나 이상만 만족하면 출력

예제: 부서번호가 30번인 사원들 중 급여를 가장 많이 받는 사원보다 많이 받는 사원 조회

SELECT ename, sal, deptno
FROM emp_table
WHERE sal > ANY(SELECT MIN(sal)     
                FROM emp_table
                WHERE deptno = 30);

- 서브쿼리 결과: 950

- 메인쿼리 결과: 950보다 많이 받는 사원 조회

예제 결과

 

3. ALL 

메인쿼리의 비교조건이 서브쿼리의 검색결과와 모든 값이 일치해야 true.

예제: 부서번호가 30번인 사원들 중 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사원 정보 조회

SELECT ename, sal, deptno
FROM emp_table
WHERE sal > ALL(SELECT sal
                FROM emp_table
                WHERE deptno = 30);

- 서브쿼리 결과: 950, 1250, 1500, 1600, 2850

- 메인쿼리 결과: 950, 1250, 1500, 1600, 2850보다 많은 급여 = 2850보다 많은 급여를 받는 사원

 

4. EXIST

서브쿼리의 데이터가 존재하는지 여부를 따져 존재하는 값만 결과로 출력

예제: dept_table에서 한 명 이상의 사원을 가지고 있는 부서만 조회

SELECT dname, deptno 
FROM dept_table
WHERE EXISTS(SELECT *
             FROM emp_table
             WHERE dept_table.deptno = emp_table.deptno);

예제 결과

'Database' 카테고리의 다른 글

10. 시퀀스/뷰  (0) 2023.05.04
9. 집합연산자  (0) 2023.05.04
7. JOIN  (0) 2023.05.04
6. DML/TRANSACTION  (0) 2023.05.04
5. 단일함수/그룹함수/CASE문  (0) 2023.05.04