1. Subquery
- where 절에 포함됨
- 두 테이블의 중복되는 데이터를 연관 관계(Relation)를 만들어 참조
- 다른 테이블을 참조하는 키 = 외래 키(FK, Foreign Key)
- 테이블의 행을 유일하게 결정하는 키 = 기본 키(PK, Primary Key)
-- 1. 서브쿼리 (where)
-- 중복해서 만들지 않는다. = 변경에 대처하기 힘들다.
-- 연관 관계를 가지도록 테이블을 두 개 만든다. (relation)
-- 다른 테이블을 참조하는 키를 FK(Foreign Key)
-- 내 테이블에서 행을 유일하게 결정하는 키를 PK(Primary Key)
-- DALLAS에서 일하는 직원을 추출해주세요.
SELECT *
FROM emp
where deptno = (
SELECT deptno
FROM dept
where loc = 'DALLAS'
);


-- 문제 : RESEARCH 부서의 직원을 출력해주세요.
select *
from emp
where deptno = (
select deptno
from dept
where dname = 'RESEARCH'
);


-- 김재수 학생의 담당 교수를 출력해주세요.
select *
from professor
where profno = (
select profno
from student
where name = '김재수'
);

2. Inline View
- from 절에 포함됨
- 별칭을 where, group by에 기본적으로 사용할 수 없음 (SQL 동작 순서)
- 별칭을 포함한 테이블을 처음에 올려주면 사용 가능 (from 연산이 1순위)
- 이 테이블은 따로 이름이 없어서 이름 지정이 필요
-- 2. Inline View (from에 select)
-- 아래 경우는 오류 발생 (SQL 실행 순서)
select ename, sal*12 '연봉'
from emp
where 연봉 = 9600;
-- 해결법
-- 새로 만든 테이블은 이름이 필요
select e.*
from (
select ename, sal*12 '연봉'
from emp
) e
where 연봉 = 9600;

-- having과 동일한 역할 (사용할 필요 없어짐)
select *
from (
select avg(sal) 'avg_sal'
from emp
group by deptno
) e
where e.avg_sal < 2000;
select avg(sal) 'avg_sal'
from emp
group by deptno
having avg_sal < 2000;

3. Scalar Subquery
- select 절에 포함됨
- 결과값이 스칼라(1개)일때만 사용 가능
- 커서를 다른 테이블에 옮기기 위해 별칭 사용
-- 3. Scalar Subquery (select 절에 서브쿼리)
-- 결과값이 Scalar (행과 값이 딱 1개)
select d.deptno, d.dname, d.loc, (
select count(*)
from emp
where deptno = d.deptno
) '직원수'
from dept d;

Subquery
- 규칙을 찾는 것이 가장 중요
- 규칙을 찾아서 연산 횟수를 감소 = 속도 증가
- 규칙을 찾기 위해서는 직접 DB 테이블을 보면서 실제 동작을 확인해볼 것

Share article