개인공부

서브쿼리

lby132 2021. 6. 15. 21:57

서브쿼리란 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