230322 DB_SubQuery_02(IN,EXISTS,ANY,ALL)

Myung A Lee·2023년 3월 22일
0

DB

목록 보기
10/15
post-thumbnail

Sub Query

  • 쿼리 안의 쿼리라는 뜻으로 사전에 추출된 내용에서 재 검색 하거나. 검색된 내용을 가상 컬럼을 만들어 추가 할 수 있다. 즉, 서브쿼리를 사용하는 이유는 가져온 데이터를 재정제 하기 위함이다.
  • IN, EXISTS, ANY, ALL 키워드를 사용할 수 있다.

1. IN

  • '=' 비교만 가능하며 OR 조건의 검색 결과 내용을 가져온다.
  • 서브쿼라가 먼저 동작 된 후 메인쿼리가 동작 된다.
  • EX)
    - select ename, job from emp e where deptno in (2,4);
    - select deptno from dept d where loc in ('LA','boston');
    - select ename, job from emp e where deptno in (select deptno from dept d where loc in ('LA','boston'));

2. EXISTS

  • 메인쿼리 실행 후 서브쿼리 조건을 비교 한다.

  • EXISTS는 메인쿼리를 통해 데이터를 확보해 놓고, 서브쿼리로 조건을 걸러내기 때문에 IN보다 사용은 복잡하지만 속도면에서 우월하다.

  • 해당 결과가 있는지 없는지 1 or 0을 반환
    - select exists (select deptno from dept d where loc in ('LA','boston')) as yn;
    - exists의 반환값이 1이면 데이터를 조회
    select from emp where 1;
    select ename, job,deptno from emp where exists (select deptno from dept d where loc in ('LA','boston'));
    - exists의 반환값이 0이면 데이터를 보여주지 않는다.
    select
    from emp where 0;
    select ename, job,deptno from emp where exists (select deptno from dept where loc='korea');

  • 사용 예
    - 1) 메인 쿼리 : 11개의 조회된 데이터를 먼저 확보하고
    select ename, job,deptno from emp e;
    - 2) exists : 확보한 데이터 중에서 조건에 맞는 값이 존재하는지를 확인
    - dept와 emp의 공통되는 컬럼이 있으므로 그 둘을 하나씩 맞춰가는 것
    select ename, job,deptno from emp e where exists (select deptno from dept d where e.deptno = d.deptno);
    - 3) 2의 결과로 확보한 데이터에 loc in ('LA','boston')) 조건을 추가
    select ename, job,deptno from emp e where exists (select deptno from dept d where e.deptno = d.deptno and (loc in ('LA','boston')));

3. ANY

  • =ANY : IN 과 같은 효과
    select ename, job from emp e where deptno
    IN (select deptno from dept where loc = 'LA' or loc = 'boston');
    select ename, job from emp e where deptno
    = ANY (select deptno from dept where loc = 'LA' or loc = 'boston');

  • > ANY : 최소값 보다 크면
    - 직책이 manager 인 직원의 입사일이 가장 빠른 사람 보다 늦은 이름과, 직책, 입사일
    select ename, job, hiredate from emp
    where hiredate > ANY(select hiredate from emp where job = 'manager')
    order by hiredate;

  • < ANY : 최대값 보다 작으면
    - 직책이 manager 인 직원의 입사일이 가장 늦은 사람 보다 빠른 이름과, 직책, 입사일
    select ename, job, hiredate from emp
    where hiredate < ANY(select hiredate from emp where job = 'manager')
    order by hiredate;

4. ALL

  • ALL : ANY와 비슷하다.(부등호를 쓸 수 있다는 점에서...)

1) = ALL

  • AND 조건을 사용 한다.(조건의 값이 복수개로 오면 사용 할 수 없다.)
    select ename, job from emp where deptno = all(select deptno from dept where loc = 'newyork');
    select ename, job from emp where deptno = all(
    select deptno from dept where loc = 'newyork' and deptname ='sales'
    );

2) > ALL

  • 최대값 보다 크면
  • 직책이 manager 인 직원의 입사일이 가장 늦은 사람 보다 더 늦은 이름과, 직책, 입사일
    select ename, job, hiredate from emp
    where hiredate > ALL(select hiredate from emp where job = 'manager')
    order by hiredate;

3) < ALL

  • 최소값 보다 작으면
  • 직책이 manager 인 직원의 입사일이 가장 빠른 사람 보다 더 빠른 이름과, 직책, 입사일
    select ename, job, hiredate from emp
    where hiredate < ALL(select hiredate from emp where job = 'manager')
    order by hiredate;

0개의 댓글