서브쿼리
: 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);
다중 행 서브쿼리
: 하나 이상의 행(값)을 반환.
복수 행 연산자(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);
-- 부서에서 가장 급여가 높은 사람
select max(sal) from emp group by deptno;
-- 다중 행 서브쿼리
-- any 연산자 : 조건 하나라도 허용되면 출력
select ename, sal from emp
where deptno != 20
and sal > any(select sal from emp where job = '관리자');
select sal from emp where job = '관리자';
= 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 = '영업사원');
select sal from emp where job = '영업사원';
-- exists 연산자 = self join
-- : "한 건이라도 존재하면" TRUE 없으면 FALSE를 리턴
-- 관리자로 등록되어 있는 사원 조회
select empno, ename, sal from emp e
where exists (select empno from emp where e.empno = mgr);
다중 열 서브쿼리
: 결과값이 두 개 이상의 컬럼을 반환.
여러 개의 컬럼을 쌍으로 묶어서 비교
기준 컬럼들을 괄호로 묶고 그에 대응되는 컬럼들은 기준 컬럼과 갯수가 동일해야 함. 컬럼들의 이름은 같지 않아도 됨.
-- 다중 열 서브쿼리
-- 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);
select sal, deptno, comm from emp where deptno = 30 and comm is not null;
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;
-- 20부터에서의 평균 급여는 650만원
select avg(sal) from emp where deptno = 20;
-- 급여가 650보다 큰 empno
select empno
from emp where sal > (select avg(sal) from emp where deptno = 20);
상관관계 서브 쿼리
: 바깥쪽 쿼리의 컬럼 중 하나가 안쪽 서브쿼리의 조건에 이용되는 처리 방식
-- 상관관계 서브쿼리
-- 사원을 관리할 수 있는 사원의 평균급여보다 급여를 많이 받는 사원의 정보를 출력
select empno, ename, sal
from emp e
where sal > (select avg(sal) sal from emp where e.empno = mgr);
집합 쿼리 (union, intersect, minus)
- union : 합집합
-- 집합 쿼리 (union, intersect, minus)
-- union : 순수한 합집합
select deptno from emp
union
select deptno from dept;
- union all : 중복되는 것까지 전부 포함한 합집합
-- 집합 쿼리 (union, intersect, minus)
-- union all : 중복되는 것까지 전부 포함
select deptno from emp
union all
select deptno from dept;
- intersect : 교집합
-- 집합 쿼리 (union, intersect, minus)
-- intersect : 교집합
select deptno from emp
intersect
select deptno from dept;
- minus : 차집합
-- minus : 차집합
select deptno from dept
minus
select deptno from emp;
'데이터베이스' 카테고리의 다른 글
[Database] 17장 연습문제5 (0) | 2023.12.29 |
---|---|
[Database] 16장 다른 Table로부터 데이터 입력, 테이블 복사 (0) | 2023.12.28 |
[Database] 14장 SQL 연습문제4 (2) | 2023.12.27 |
[Database] 13장 함수 모음2 (0) | 2023.12.26 |
[Database] 12장 함수 모음1 (0) | 2023.12.22 |