서브쿼리란 select문 안에 또 다시 select문이 있는 쿼리 이다.
서브쿼리는 위치에 따라 명칭이 다른데 from절에서 사용하는 인라인뷰, select문에 사용하는 스칼라 서브쿼리,
일반적으로 where절에 사용하는 것을 서브쿼리라고 한다.
1.서브쿼리
where절에 사용하는 서브쿼리
select * from emptest where empno = (select empno from emptest where ename = 'test1');
2.인라인 뷰
from절에 사용하는 서브쿼리
select * from (select rownum num, empno, ename from emptest) where num = 4;
3.스칼라 서브쿼리
select문에 사용하는 서브쿼리
select empno as "사원번호", ename as "이름", (select round(avg(sal) from emptest) as "평균급여"
from emptest;
4.연관 서브쿼리(correlated subquery)
서브쿼리 내에서 메인 쿼리의 컬럼을 사용하는 것
select * from emptest a where a.deptno = (select deptno from dept where a.deptno = dept.deptno);
단일 행 서브쿼리, 다중 행 서브쿼리
- 서브쿼리가 반환하는 행의 갯수에 따라 분류가 된다.
- 단일행 서브쿼리는 하나의 행만 반환되는 서브쿼리로, 비교연산자(=,<,<=,>=,<>)를 상요합니다.
- 다중행 서브쿼리는 여러 행을 반환하는 서브쿼리로 IN, ANY, ALL, EXISTS를 사용해 비교합니다.
다중행 비교연산자
IN -- 서브쿼리의 결과 중 하나만 동일하면 참
select * from emptest, dept where emptest.deptno = dept.deptno and emptest.empno in
(select empno from emptest where sal > 2900);
-서브쿼리의 결과가 emptest.empno에 있으면 조회
All -- 서브쿼리의 조건에 모두 맞으면 조회
select * from emptest, dept where emptest.deptno = dept.deptno and dept.deptno <= all(20,10);
- deptno가 20보다 작거나 같고 10보다 작거나 같은 행을 조회
ANY -- 서브쿼리 결과 중 하나라도 맞으면 조회
select * from emptest, dept where emptest.deptno = dept.deptno and dept.deptno <= any
((select deptno from dept where deptno = 20),5);
EXISTS -- 서브쿼리 결과가 하나라도 메인쿼리에 존재하면 조회
select * from emptest, dept where emptest.deptno = dept.deptno and exists
(select empno from emptest where sal>4900);
'개인공부' 카테고리의 다른 글
mysql Group by 와 Having (0) | 2021.06.16 |
---|---|
[SQL] 두 테이블의 값 비교, 한쪽에 없는 것 추출방법은? (0) | 2021.06.15 |
Foreign Key : 외래키 (0) | 2021.06.15 |
mysql ifnull (0) | 2021.06.14 |
배치 (0) | 2021.06.10 |