서브쿼리란
쿼리 안의 쿼리
서브쿼리의 종류
* 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 |
---|