포스트

MySQL Subquery

MySQL Subquery

종류와 특징

구분반환 형태주요 사용 위치연산자/구문명칭핵심 용도
단일 컬럼단일 행SELECT,
WHERE,
HAVING
=, >, <스칼라 서브 쿼리
단일 값 서브 쿼리
단일 값이 필요한 모든 곳
 다중행WHERE,
HAVING
IN. ANY, ALL다중 행 서브쿼리
값 목록 서브쿼리
리스트 서브쿼리
컬럼 서브 쿼리
값 목록과 비교
다중 컬럼단일 행WHERE,
HAVING
(c1, c2) IN다중 컬럼 서브 쿼리여러 커럼 값을 정확히 1:1로 비교
 다중행WHERE,
HAVING
(c1, c2) IN다중 컬럼 서브 쿼리여러 컬럼 조합이 목록에 포함되는지 비교
다중 컬럼다중 행FROMFROM (...) as alias테이블 서브쿼리
인라인뷰
파생 테이블
가상의 테이블을 생성하여 다른 테이블과 JOIN 등 재가공

소개

  • SQL 쿼리 문 안에 포함된 또 다른 SELECT 쿼리를 의미
  • 여러 단계로 나누어 처리해야 할 문제를 하나의 쿼리로 해결할 수 있게 함
  • 서브쿼리가 먼저 실행되고 그 결과가 메인쿼리에서 사용
  • 반환하는 행과 열의 수 사용되는 위치에 따라 종류가 나뉨

스칼라 서브쿼리

  • 단일 행 단일 열의 값을 반환하는 서브쿼리
  • 스칼라는 단 하나의 값을 의미
  • =, >, < 같은 단일 행 연산자와 함께 사용
  • 서브 쿼리의 결과가 반드시 하나의 행만 반환하도록 주의해야 하먀 그렇지 않으면 오류가 발생

다중 행 서브쿼리

  • 여러 행의 결과를 반환하는 서브 쿼리
  • IN, ANY, ALL 같은 다증 행 연산자와 함께 사용
  • IN은 목록에 포함된 값과 일치하는지 확인하며 가장 직관저깅고 흔하게 사용
  • ANYALL은 주로 비교 연산자와 쓰이며 MIN이나 MAX 집계 함수로 대체하는 것이 더 명확할 수 있음

다중 컬럼 서브 쿼리

  • 두 개 이상의 컬럼을 반한하는 서브쿼리
  • WHERE 절에서 여러 컬럼을 동시에 비교해야 할 때 유용
  • WHERE (컬럼, 컬럼2) = (서브쿼리) 형테로 사용
  • 서브쿼리가 여러 행을 반환할 때는 IN 연산자를 사용

상관 서브쿼리

  • 메인쿼리와 서브쿼리가 서로 연관 관계를 맺고 동작하는 서브 쿼리
  • 메인쿼리의 각 행에 대해 서브쿼리가 반복적으로 실행
  • 서브쿼리는 메인 쿼리의 컬럼 값을 참조하여 결과를 계산
  • EXISTS는 서브쿼리의 결과 값이 존재하는지 여부만 확인하며 결과 행이 하나라도 있으면 TRUE를 반환하기 때문에 서브쿼리 테이블이 매우 클 때 IN 보다 효율적인 경우가 많음
  • NOT EXISTS는 서브쿼리 결과가 존재하지 않을 때 TRUE를 반환하여 특정 조건에 해당하지 않는 데이터를 찾을 때 사용

SELECT 서브쿼리

  • SELECT 절에 위치하는 서브쿼리로 결과가 하나의 컬럼처럼 동작
  • 반드시 하나의 값만 반환하는 스칼라 서브쿼리여야 함
  • 비상관 서브쿼리는 메인쿼리의 모든 행에 동일한 값을 보여 줌
  • 상관 서브쿼리는 메인쿼리의 각 행과 상호작용하여 행마다 다른 계산 결과를 보여 줌
  • 상관 서브쿼리는 메인쿼리의 행 수만큼 반복 실행되므로 성능 저하에 주의해야 함

테이블 서브쿼리

  • FROM 절에 위치하는 서브쿼리로 인라인 뷰(Inline View)라고도 부름
  • 서브쿼리의 실행 결과가 하나의 독립된 가상 테이블처럼 사용
  • 집계나 그룹핑된 결과를 다시 한 번 조인하거나 필터링해야 할 때 유용
  • FROM 절의 서브쿼리는 반드시 별칭(Alias)을 가져야 함

서브쿼리 vs JOIN

  • 많은 문제는 서브쿼리와 JOIN 두 가지 방법으로 모두 해결 할 수 있음
  • 일반적으로 데이터베이스 옵티마이저는 JOIN을 더 효울적으로 처리하여 성능이 좋은 경우가 많음
  • 최신 옵티마이저는 간단한 서브쿼리를 JOIN으로 자동 변환하기도 함
  • 가독성 측면에서는 서브쿼리가 논리적 단계를 명확히 보여줘 더 쉬울 때가 있음
  • JOIN을 우선 고려하되 쿼리가 너무 복잡해지면 가독성이 좋은 서브 쿼리를 사용하고 성능이 의심될 때는 반드시 측정해야 함

참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.