반응형

 

서브쿼리

 

: SQL 구문 안에 또 다른 select 구문이 있는 것을 말한다.

= select 문이 2개 이상

 

from절에 사용하는 경우 view와 같이 독립된 테이블처럼 활용되어 inline view라고 부른다.

참조성 여부에 따라 연관 또는 비연관 서브쿼리로 구분된다.

괄호로 묶어 작성해야 하며 연산자의 오른쪽에 나타나진다. 또한 단일 행 연산자(=, >, < 등)와 복수 행 연산자(in, not in, any, all 등)를 사용한다.

 

- 서브쿼리 종류

단일 행 서브쿼리 : select문장으로 부터 단 하나의 행만을 검색

다중 행 서브쿼리 : select문장으로 부터 하나 이상의 행을 검색

단일 열 서브쿼리 : select문장으로 부터 단 하나의 열만을 검색

다중 열 서브쿼리 : select문장으로 부터 하나 이상의 컬럼을 검색

from절 상의 서브쿼리 (inline view) : from절 상에 오는 서브쿼리로 view처럼 작동

상관관계 서브 쿼리 : 메인쿼리와 서브쿼리를 연관지어 참조하여 사용

 

 

 

단일 행 서브쿼리

 

: 오직 한 개의 행(값)만 반환

단일 행 연산자(=, >, >=, <, <=, <>, !=)만 사용할 수 있음

 

-- 단일 행 서브쿼리
-- 단일 행 연산자(=, >, >=, <, <=, <>, !=)만 사용할 수 있음
select ename, job from emp
    where job = (select job from emp where empno = 7369);

 

결과 화면1

 

 

 

다중 행 서브쿼리

 

: 하나 이상의 행(값)을 반환.

복수 행 연산자(in, not in, any, all, exists)를 사용할 수 있음

 

-- 다중 행 서브쿼리
-- in 연산자
select empno, ename, sal, deptno
    from emp
    where sal in (select max(sal) from emp group by deptno);

 

결과 화면2 : in&nbsp;연산자에 입력된 값 중에서 하나라도 일치하는 것이 있으면 리스트에 조회

 

-- 부서에서 가장 급여가 높은 사람
select max(sal) from emp group by deptno;

 

결과 화면3

 

 

-- 다중 행 서브쿼리
-- any 연산자 : 조건 하나라도 허용되면 출력
select ename, sal from emp
    where deptno != 20
    and sal > any(select sal from emp where job = '관리자');

 

결과 화면3 : any

 

select sal from emp where job = '관리자';

 

결과 화면4

 

= ANY 하나라도 만족하는 값이 있으면 결과를 리턴 (IN과 동일)
> ANY 값들 중 최소값 보다 크면 결과를 리턴
>= ANY 값들 중 최소값 보다 크거나 같으면 결과를 리턴
< ANY 값들 중 최대값 보다 작으면 결과를 리턴
<= ANY 값들 중 최대값 보다 작거나 같으면 결과를 리턴
<> ANY 모든 값들 중 다른 값만 리턴 (값이 하나일 때만 가능, 사용X)

 

 

 

-- all 연산자
-- 350 이상인 사람들
select ename, sal from emp
    where deptno != 20
    and sal > all(select sal from emp where job = '영업사원');

 

결과 화면5 : 350 이상인 경우만 출력된다.

 

select sal from emp where job = '영업사원';

 

결과 화면6

 

 

-- exists 연산자 = self join
-- : "한 건이라도 존재하면" TRUE 없으면 FALSE를 리턴
-- 관리자로 등록되어 있는 사원 조회
select empno, ename, sal from emp e
    where exists (select empno from emp where e.empno = mgr);

 

결과 화면7 : exists 연산자 - 서브쿼리의 데이터가 존재하는지 여부를 따져 존재 시 그 값만 반환

 

 

 

다중 열 서브쿼리

 

: 결과값이 두 개 이상의 컬럼반환.

여러 개의 컬럼을 쌍으로 묶어서 비교

기준 컬럼들을 괄호로 묶고 그에 대응되는 컬럼들은 기준 컬럼과 갯수가 동일해야 함. 컬럼들의 이름은 같지 않아도 됨.

 

-- 다중 열 서브쿼리
-- pairwise(쌍비교) 서브쿼리
select empno, sal, deptno, comm from emp
    where (sal, deptno, comm) in (select sal, deptno, comm from emp where deptno = 30 and comm is not null);

 

결과 화면8 : pairwise 쌍 비교 서브쿼리

 

select sal, deptno, comm from emp where deptno = 30 and comm is not null;

 

결과 화면9

 

 

 

from절 상의 서브쿼리 (inline view)

 

: from절 상에 오는 서브쿼리.

 

-- from절 상의 서브쿼리 (inline view)
-- 급여가 20부서의 평균 급여보다 크고 사원을 관리하는 사원으로서 40부서에 속하지 않은 사원의 정보를 보여주는 SQL문
select b.empno, b.ename, b.job, b.sal, b.deptno
    from (select empno 
        from emp where sal > (select avg(sal) from emp where deptno = 20)) a,
        emp b
    where a.empno = b.empno
    and b.mgr is not null
    and b.deptno != 40;

 

결과 화면10

 

-- 20부터에서의 평균 급여는 650만원
select avg(sal) from emp where deptno = 20;

 

결과 화면11

 

-- 급여가 650보다 큰 empno
select empno 
        from emp where sal > (select avg(sal) from emp where deptno = 20);

 

결과 화면12

 

 

 

상관관계 서브 쿼리

 

: 바깥쪽 쿼리의 컬럼 중 하나가 안쪽 서브쿼리의 조건에 이용되는 처리 방식

 

-- 상관관계 서브쿼리
-- 사원을 관리할 수 있는 사원의 평균급여보다 급여를 많이 받는 사원의 정보를 출력
select empno, ename, sal
    from emp e
    where sal > (select avg(sal) sal from emp where e.empno = mgr);

 

결과 화면13

 

 

 

집합 쿼리 (union, intersect, minus)

 

 

- union : 합집합

-- 집합 쿼리 (union, intersect, minus)
-- union : 순수한 합집합
select deptno from emp
union
select deptno from dept;

 

결과 화면14

 

 

- union all : 중복되는 것까지 전부 포함한 합집합

-- 집합 쿼리 (union, intersect, minus)
-- union all : 중복되는 것까지 전부 포함
select deptno from emp
union all
select deptno from dept;

 

결과 화면15

 

 

- intersect : 교집합

-- 집합 쿼리 (union, intersect, minus)
-- intersect : 교집합
select deptno from emp
intersect
select deptno from dept;

 

결과 화면16

 

 

- minus : 차집합

-- minus : 차집합
select deptno from dept
minus
select deptno from emp;

 

결과 화면17

 

 

반응형