DB/Mysql 서브쿼리(subquery)
서브쿼리
SELECT 내부에 하나의 SELECT문이 존재하는 형태를 뜻합니다.
문법
SELECT 컬럼 FROM 테이블명 WHERE 조건 (SELECT 컬럼명 FROM 테이블명); |
서브쿼리 특징
- 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확이 구분할수있다.
- 복잡한 JOIN이나 UNION 과 같은 동작을 수행할 수 있는 다른 방법을 제공한다.
- JOIN이나 UNION보다 읽기 편하다.
단일행 서브쿼리
서브쿼리 수행 결과가 하나의 행만을 반환하는것.
단일행 비교 연산자 종류 : = , > , >= , < , <= , <>
Q) 사원들의 평균급여보다 높은 급여를 받는 직원들의 이름(ename)을 출력하시오.
select ename from emp where sal >(select avg(sal) from emp); |

Q) MILLER의 부서명을 출력하시오.
select dname from dept where deptno = (select deptno from emp where ename ='miller'); |

다중행 서브쿼리
서브쿼리 수행 결과가 2개 이상의 행을 반환하는것.
다중연산자 : IN, ANY , SOME , EXIST, ALL
IN : 메인 쿼리의 비교조건이 서브쿼리의 결과 중에서 하나라도 일치하면 참인 연산자
>ANY: 최솟값 반환 (<ALL)
<ANY: 최댓값 반환 (>ALL)
EXISTS: 서브쿼리의 값이 있을경우 반환
ANY/SOME 은 거의 비슷하다고 보면된다. OR연산자와 똑같다.
Q) 20번 부서의 직원들 중 가장 높은 급여를 받는 사람보다, 낮은 급여를 받는 직원들의 이름, 급여를 출력하시오.
select ename, sal from emp where sal <any(select sal from emp where deptno =20); |

<ANY는 OR 연산자로 값중 어느것 하나만 참이면 참이다.
여기서 SAL<ANY는 최대값을 기준으로 작은값을 뜻한다.
Q) 30번부서에서 가장 낮은 급여를 받는 사람보다 많은 급여를 받는 직원들의 DEPTNO, ENAME, SAL을 출력하시오.
select deptno,ename, sal from emp where sal >any(select sal from emp where deptno =30); |

ALL 연산자는 ANY와 다르게 AND연산자이다. 즉 모두 참인 연산자이다.
Q) 30번부서의 최대 급여를 받는 직원보다 높은 급여를 받는 직원의 DEPTNO, ENAME, SAL을 출력하시오.
select deptno, ename, sal from emp where sal >all(select sal from emp where deptno =30); |

ALL은 AND연산자로 모두 참이다.
SAL>ALL의 값이 모두 참이니 ALL의 최대값보다 크다는 뜻이다.