SQL 서브쿼리

천소진·2022년 11월 14일
0

Study

목록 보기
17/29

서브쿼리 ?

: SQL문을 실행하는데 필요한 데이터를 추가로 조회하기 위해 추가로 넣는 SQL문
: 특정 데이터의 값을 기준으로 비교할 때 사용.

WHERE 서브쿼리

  • 특징
    : 연사자와 같이 비교, 조회 대상의 오른쪽에 놓으며 ( )로 묶어서 표현
    : 특수한 경우를 제외하고, 서브쿼리 안에 order by 절은 사용 불가함.
    : select 절에 명시한 열은 메인쿼리의 비교 대상과 같은 자료형과 개수로 지정되어야 함.
    ex)
//이름이 JONES 인 사원의급여
select sal from emp
where ename = 'JONES';
              +
//급여가 2975보다 높은 사원의 정보 
select *from emp
where sal >2975;
              ↓

//JONES의 급여보다 높은 사원
select * from emp 
where sal>(select sal from emp where ename = 'JONES');

1. 단일행 서브쿼리

  • 하나의 값으로 비교하는 서브쿼리 ( A 보다 크거나같다 , A와 같지 않다 ...)
    ==> 단일행 연산자 :비교연산자 >A , !=A....

2. 다중행 서브쿼리 (IN, ANY, SOME ,ALL, EXISTS)

  • IN
    : 서브쿼리의 여러 결과 값들중 해당되는것이 있을때 값을 내줌.
    ex)
//각 부서별 최고 급여와 동일한 급여를 받는 사람
select deptno, ename
from emp
where sal in (select max(sal) from emp group by deptno) //서브: 그룹별 최고급여 (10= A, 20=B, 30=C..)
order by deptno;					           사원들 급여가 최고급여들(A,B,C..) 중 하나에 속한다면 출력.
  • ANY,SOME
    : 서브 쿼리의 여러 결과 값중 메인쿼리의 조건식의 결과가 하나로도 true라면 메인쿼리의 조건식을 true 로 반환.(OR와 비슷)
    : =ANY, =SOME 은 IN과 같은 결과 값을 내줌.
    ex)
select deptno, ename from emp
where sal= any (select max(sal) from emp group by deptno)    
order by deptno;                                                          
                                                           ==> IN 사용했을때와 같은 결과.
select deptno, ename from emp
where sal= some (select max(sal) from emp group by deptno)
order by deptno;

select *from emp 
where sal = any (1000,2000,3000);    // 1000,2000,3000 중에 
where sal > any (1000,2000,3000);    // 최소인 1000 보다 큰값 
where sal >= any (1000,2000,3000);   // 1000을 포함하며 1000보다 큰값
where sal < any (1000,2000,3000);    // 최대인 3000 보다 작은값 
where sal =< any (1000,2000,3000);  // 3000을 포함하며 3000보다 작은값
where sal <> any (1000,2000,3000);  // 다나와 이상해
  • ALL
    :서브쿼리의 여러 결과 값중 메인쿼리의 조건식의 결과가 모두 true 일때만 메인쿼리의 조건식을 true로 반환 (AND와 비슷)

ex)

select *from emp 
where sal = all (1000,2000,3000);     // 안나와 
where sal > all (1000,2000,3000);     // 최대인 3000보다 큰값만 
where sal >= all (1000,2000,3000);   // 3000을 포함하고 3000보다 큰값만
where sal < all (1000,2000,3000);     // 최소인 1000보다 작은값만
where sal =< all (1000,2000,3000);   // 1000을 포함하고 1000보다 작은값만
where sal <> any (1000,2000,3000);  // 1000,2000,3000만 제외한 나머지값만

//10번 부서의 사람들보다 입사일이 빠른사람
select * from emp 
where hiredate < all(select hiredate from emp where deptno =10);
  • EXISTS
    : 서브 쿼리의 결과가 존재한다면 메인쿼리 결과 출력. (BOOLEAN과 비슷 TRUE or FALSE)

ex)

select * from emp 
where exists (select sal from emp where deptno = 30);     //==> 30번 부서의급여가 존재하므로 출력.

select * from emp 
where exists (select sal from emp where deptno = 50);     //==> 50번 부서는 존재하지 않으므로 불가.

FROM 서브쿼리


  • : 사용자에게 맞춤형으로 제공되는 가상의 테이블

  • 인라인 뷰
    : from 절에 직접 테이블명을 명시하고 테이블 내의 데이터 규모가 클때 데이터의 일부만 필요할 때 효율성을 높이기 위해 사용.

ex)

//부서번호 10번의 사원정보와 부서정보를 출력
select e10.empno, e10.ename, e10.deptno, d.dname, d.loc  
from (select *from emp where deptno= 10) e10,  //10번 부서의 직원들 정보만있는 e10이라는 가상 테이블 생성.
       (select *from dept) d
where e10.deptno =d.deptno;

WITH 서브쿼리

: select 문 앞에서 먼저 객체테이블을 생성해서 변수로 쓸수 있게 해줌.

ex)

//부서번호 10번의 사원정보와 부서정보를 출력
WITH e10 as (select * from emp where deptno = 10),   //select 문 앞에서 e10 과 d 라는 객체를 먼저 생성.
        d as (select * from dept)
select e10.empno, e10.ename, e10.deptno, d.dname, d.loc
from e10,d
where e10.deptno= d.deptno;

SELECT 서브쿼리

  • 스칼라서브쿼리 : 반드시 하나의 결과만 반환해야함. ==> 여러개가 필요하면 여러개의 서브쿼리를 넣으면됨.

ex)

//emp 테이블에 없는 급여등급과 부서 이름을 포함하여 출력.
select empno, ename, job,sal,
         (select grade from salgrade where e.sal between losal and hisal )as SALGRADE ,
         deptno, (select dname from dept where e.deptno= dept.deptno) as DNAME
from emp e;

  ==> salgrade 테이블에 있는 정보로 얻은 결과를 하나의 행으로 가져옴.

0개의 댓글