MySQL Subquery
MySQL Subquery
종류와 특징
| 구분 | 반환 형태 | 주요 사용 위치 | 연산자/구문 | 명칭 | 핵심 용도 |
|---|---|---|---|---|---|
| 단일 컬럼 | 단일 행 | SELECT,WHERE,HAVING | =, >, < 등 | 스칼라 서브 쿼리 단일 값 서브 쿼리 | 단일 값이 필요한 모든 곳 |
| 다중행 | WHERE,HAVING | IN. ANY, ALL | 다중 행 서브쿼리 값 목록 서브쿼리 리스트 서브쿼리 컬럼 서브 쿼리 | 값 목록과 비교 | |
| 다중 컬럼 | 단일 행 | WHERE,HAVING | (c1, c2) IN … | 다중 컬럼 서브 쿼리 | 여러 커럼 값을 정확히 1:1로 비교 |
| 다중행 | WHERE,HAVING | (c1, c2) IN … | 다중 컬럼 서브 쿼리 | 여러 컬럼 조합이 목록에 포함되는지 비교 | |
| 다중 컬럼 | 다중 행 | FROM | FROM (...) as alias | 테이블 서브쿼리 인라인뷰 파생 테이블 | 가상의 테이블을 생성하여 다른 테이블과 JOIN 등 재가공 |
소개
- SQL 쿼리 문 안에 포함된 또 다른 SELECT 쿼리를 의미
- 여러 단계로 나누어 처리해야 할 문제를 하나의 쿼리로 해결할 수 있게 함
- 서브쿼리가 먼저 실행되고 그 결과가 메인쿼리에서 사용
- 반환하는 행과 열의 수 사용되는 위치에 따라 종류가 나뉨
스칼라 서브쿼리
- 단일 행 단일 열의 값을 반환하는 서브쿼리
- 스칼라는 단 하나의 값을 의미
=,>,<같은 단일 행 연산자와 함께 사용- 서브 쿼리의 결과가 반드시 하나의 행만 반환하도록 주의해야 하먀 그렇지 않으면 오류가 발생
다중 행 서브쿼리
- 여러 행의 결과를 반환하는 서브 쿼리
IN,ANY,ALL같은 다증 행 연산자와 함께 사용IN은 목록에 포함된 값과 일치하는지 확인하며 가장 직관저깅고 흔하게 사용ANY와ALL은 주로 비교 연산자와 쓰이며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 라이센스를 따릅니다.