서브쿼리란

쿼리 안의 쿼리


서브쿼리의 종류

 

* WHERE절에서 사용

- 단일행 서브쿼리

서브쿼리의 결과가 1건인 서브쿼리
비교연산자(=,<,>등)는 단일행만 사용가능

 

 

- 다중 행 서브쿼리

서브쿼리의 결과가 여러건인 서브쿼리
다중행 비교연산자(IN, ALL, ANY, SOME) 사용

 

 

- 다중 칼럼 서브쿼리

여러컬럼을 한번에 비교한다

 

 

- 연관 서브쿼리

서브쿼리 안에서 메인쿼리의 컬럼을 사용한다

 

 

* 스칼라 서브쿼리 (SELECT절에서 사용)

서브쿼리 결과가 1셀만 반환

 

 

* 인라인 뷰 (FROM절에서 사용)

서브쿼리 결과를 테이블처럼 사용

 

 

* HAVING절에서 사용

그룹핑된 결과에 조건을 주기 위해 사용

 

 

* VALUES(INSERT문에서 사용)

서브쿼리의 결과를 삽입하기 위해 사용

 

 

* SET(UPDATE문에서 사용)

서브쿼리 결과로 수정하기 위해 사용

 


서브쿼리 사용시 고려할것

서브쿼리와 조인의 성능에 대한 부분을 고려해보아야 한다.

 

데이터의 양이 적은경우엔 큰 차이가 없지만

데이터가 많을수록 서브쿼리를 사용할 때 성능이 저하될 수 있다.

(무조건 서브쿼리가 성능을 저하시킨다는것은 아니고, 서브쿼리가 더 빠른 상황도 있다.)

 

* 서브쿼리가 메인쿼리보다 먼저 실행된 후 메인쿼리가 실행됨

* 몇몇 DBMS에서는 서브쿼리 최적화가 제한적이여서 가능한 사용하지 않는게 좋을수도 있음

* 서브쿼리가 어디에 어떻게 있느냐에 따라 인덱스를 제대로 활용하지 못하여

풀스캔같이 비효율적인 작업이 발생할 수 있음

 

-> 조인이 가능한경우 서브쿼리보다 최적화 된 조인을 사용한다

-> CTE (WITH)를 사용한다.

 

인라인뷰냐 스칼라냐

DMBS를 어떤것을 사용하냐, 어떤쿼리냐에 따라 달라지므로
꼭 ㅇㅇ가 좋다 라는 법은 없다.

 

복잡한 쿼리의 경우 인라인뷰를 사용하여 쿼리를 여러 단계로 분할하는것이 좋은 경우가 많고

단순한 추가정보를 가져오는데에는 스칼라 서브쿼리가 적합한 경우가 많다

'DB' 카테고리의 다른 글

[SQL/Oracle] 날짜 함수 정리  (0) 2023.09.27

+ Recent posts