[Day 11 | DB] 서브쿼리(Subquery)

y♡ding·2024년 10월 28일
0

데브코스 TIL

목록 보기
66/163

서브쿼리(Subquery)는 하나의 SQL 문 안에서 다른 SQL 문을 중첩하여 사용하는 쿼리입니다. 보통 특정 조건을 만족하는 데이터를 조회하거나, 메인 쿼리에서 사용할 값을 미리 계산하기 위해 사용됩니다.

예 : 'SCOTT' 사원의 급여보다 큰 급여를 받는 사원에 대한 정보

SELECT empno, ename, job, sal
FROM emp
WHERE sal >= (SELECT sal FROM emp WHERE ename = 'SCOTT');
  1. 서브쿼리: (SELECT sal FROM emp WHERE ename = 'SCOTT')emp 테이블에서 'SCOTT' 사원의 급여를 조회합니다. => 결과 : 3000
  2. 메인 쿼리: WHERE sal > (서브쿼리 결과) 조건을 통해 SCOTT의 급여(3000)보다 큰
  3. 급여를 받는 사원들의 정보를 조회합니다.

서브쿼리 유형

1. 단일행 서브쿼리 (Single-Row Subquery)

  • 정의: 단일행 서브쿼리는 하나의 행(단일 값)을 반환하는 서브쿼리입니다.
  • 사용 용도: 특정 값이나 조건을 비교할 때 유용합니다.
  • 연산자: =(같다), <(작다), >(크다) 등 단일 값 비교 연산자와 함께 사용됩니다.

수업예제

-- 최고 급여를 받는 사원 정보 출력
select empno, ename, sal 
from emp 
where sal = (select max(sal) from emp);
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7839 | KING  | 5000.00 |
+-------+-------+---------+

-- 20번 부서에서 최고 급여를 받는 사원보다 많은 급여를 받는 사원 정보 출력
select empno, ename, sal 
from emp 
where sal >= (select max(sal) from emp where deptno = 20);
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7788 | SCOTT | 3000.00 |
|  7839 | KING  | 5000.00 |
|  7902 | FORD  | 3000.00 |
+-------+-------+---------+

2. 복수행 서브쿼리 (Multi-Row Subquery)

  • 정의: 복수행 서브쿼리는 여러 행을 반환하는 서브쿼리입니다.
  • 사용 용도: 여러 값과 비교하거나, 목록에 포함된 값들을 조건으로 사용할 때 유용합니다.
  • 연산자: IN, ANY, ALL다중 값 비교 연산자와 함께 사용됩니다.
-- 부서별 최고 급여를 받는 사원에 대한 정보 출력
select empno, ename, deptno, sal
from emp
where (deptno, sal) in (select deptno, max(sal) from emp group by deptno);

-- 위 쿼리는 부서별로 최고 급여를 받는 여러 사원이 있을 경우, 모든 사원의 정보를 출력
+-------+-------+--------+---------+
| empno | ename | deptno | sal     |
+-------+-------+--------+---------+
|  7698 | BLAKE |     30 | 2850.00 |
|  7788 | SCOTT |     20 | 3000.00 |
|  7839 | KING  |     10 | 5000.00 |
|  7902 | FORD  |     20 | 3000.00 |
+-------+-------+--------+---------+
  • 서브쿼리 (SELECT MAX(sal) FROM emp GROUP BY deptno)는 각 부서별 최대 급여를 반환합니다. => (2850, 3000, 5000)
  • 메인 쿼리는 sal이 각 부서의 최대 급여에 해당하는 모든 직원을 조회합니다.

< 또는 > 연산자와 ANY의 조합

ANY는 서브쿼리의 하나 이상의 값과 비교하여 조건을 만족하는 경우 TRUE를 반환합니다. ANY<, > 연산자를 함께 사용하면 서브쿼리 결과 중 최소/최대 값에 기반하여 조건을 설정할 수 있습니다.

WHERE column < ANY (서브쿼리) : 서브쿼리 결과 중 최대값보다 작은 컬럼 값
WHERE column > ANY (서브쿼리) : 서브쿼리 결과 중 최소값보다 큰 컬럼 값

< 또는 > 연산자와 ALL의 조합

ALL은 서브쿼리의 모든 값과 비교하여 조건을 만족해야 TRUE를 반환합니다. ALL<, > 연산자를 함께 사용하면 서브쿼리 결과의 최대값 또는 최소값과 비교하여 범위를 좁힐 수 있습니다.

WHERE column < ALL (서브쿼리) : 서브쿼리 결과 중 최소값보다 작은 컬럼 값
WHERE column > ALL (서브쿼리) : 서브쿼리 결과 중 최대값보다 큰 컬럼 값

sal < any (서브쿼리) : 서브쿼리 결과 중 최대값보다 작은 sal 값
sal > any (서브쿼리) : 서브쿼리 결과 중 최소값보다 큰 sal 값
sal < all (서브쿼리) : 서브쿼리 결과 중 최소값보다 작은 sal 값
sal > all (서브쿼리) : 서브쿼리 결과 중 최대값보다 큰 sal 값

-- 예시 쿼리

-- 모든 부서의 최고 급여보다 작은 급여를 가진 사원
select empno, ename, sal
from emp
where sal < all (select max(sal) from emp group by deptno);

-- 특정 부서의 최저 급여보다 높은 급여를 가진 사원
select empno, ename, sal
from emp
where sal > any (select min(sal) from emp where deptno = 10);

-- 직책이 manager인 사원들의 급여가 전체보다 적은 사원들에 대한 정보 
SELECT *
FROM employees
WHERE salary < (SELECT AVG(salary) FROM employees WHERE job_id = 'MANAGER');

-- MILLER보다 늦게 입사한 사원의 사번, 이름, 입사일을 추출
SELECT employee_id, name, hire_date
FROM employees
WHERE hire_date > (SELECT hire_date FROM employees WHERE name = 'MILLER');

-- 10월부터의 사원을 모두 찾아 입사한 사원에 대한 사번, 이름, 입사일
SELECT employee_id, name, hire_date
FROM employees
WHERE hire_date >= '2023-10-01';

0개의 댓글

관련 채용 정보