Database

DB/Mysql 서브쿼리(subquery)

코딩알파 2021. 9. 3. 02:08
728x90

테이블.txt
0.00MB

서브쿼리

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의 최대값보다 크다는 뜻이다.

728x90