서브쿼리
하나의 SQL문장 안에 포함된 또 하나의 SQL 문장
예제: 사원 smith의 부서명 조회
단일행 서브쿼리
- 서브쿼리의 결과가 한 개의 행만 나오는 것.
- 메인쿼리의 WHERE 절에서 단일행 연산자만 사용해야 한다.(=, <>, >, <, >=, <=)
예제1 : James와 같은 부서의 직원들 조회
SELECT ename, job, deptno
FROM emp_table
WHERE deptno = (SELECT deptno
FROM emp_table
WHERE ename = 'JAMES');
예제2: 평균 급여보다 많이 받는 직원들 조회
SELECT ename, sal
FROM emp_table
WHERE sal >= (SELECT AVG(sal)
FROM emp_table);
다중행 서브쿼리
- 서브쿼리의 결과가 두 건 이상 출력.
- 단일행 연산자는 사용할 수 없으며 다중행 연산자를 사용해야 한다.
* 다중행 연산자: 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 |