[MySQL] 서브쿼리 (Subquery)

Jaehyeong Kwon·2022년 8월 8일
0

1. 서브쿼리

서브쿼리란 부모 쿼리 안에 작성하는 내부의 SELECT 쿼리이며, 주로 부모 쿼리의 FROM과 WHERE의 조건으로 사용됩니다. 서브쿼리라고 특별한 문법이 있는게 아니라, SELECT를 괄호 ()로 묶어서 가독성을 높입니다.

DELETE FROM items WHERE id = (SELECT MIN(id) FROM products); 가장 작은 id를 조회한 데이터를 부모 쿼리의 조건절에서id 값으로 활용하는 예제

  • 부모 쿼리 : DELETE FROM items WHERE id = ()
  • 서브 쿼리 : (SELECT MIN(id) FROM products

서브 쿼리의 결과를 Items 테이블에 추가하는 예제.

INSERT INTO items (SELECT * FROM products);

  • INSERT 하려는 items 테이블의 서브 쿼리의 결과 컬럼들이 같아야 에러가 발생하지 않는다.

2. 서브 쿼리의 종류

서브 쿼리는 사용되는 위치에 따라 종류를 나눠볼 수 있습니다.

1) 서브 쿼리 위치에 따른 분류

  • 중첩 서브 쿼리 (Nested Subquery)
    - WHERE 절에 나타나는 서브쿼리
  • 인라인 뷰 (Inline View)
    - FROM 절에 나타나는 서브쿼리
  • 스칼라 서브쿼리 (Scalar Subquery)
    - SELECT 절에 나타나는 서브쿼리

2) 중첩 서브쿼리 - 서브쿼리 반환에 따른 분류

  • 단일 행 서브쿼리 (Single Row Subquery)
    - 하나의 컬럼으로 구성된 조회 결과 행 하나를 Outer 쿼리에 반환합니다.
  • 다중 행 서브쿼리 (Multiple Row Subquery)
    - IN, ANY, ALL, EXISTS 등의 연산자로 얻은 서브쿼리 결과 여러개의 행을 outer 쿼리에 반환합니다.

3) 서브쿼리가 파싱되는 관점에 따른 분류

  • Simple Subquery
    - 각 테이블에 대해서만 한 번 평가되는 쿼리를 말합니다.
  • 상관 서브 쿼리 (Correlated Subquery)
    - 중첩 서브쿼리의 한 종류입니다.
  • Simple Subqueryd와 달리 테이블 단위가 아닌, 각 행에 대해서 한 번 평가됩니다.

일반적으로 join 연산이 서브쿼리 연산보다 성능이 좋기 때문에, 서브쿼리는 join으로 바꿀 수 있으면 성능 측정 과정을 통해 바꾸는 것이 좋습니다.

profile
나무와 같이 성장하는 사람

0개의 댓글