MySQL WHERE와 HAVING: 계산된 열을 사용하여 쿼리 최적화
MySQL 데이터베이스 작업에서 WHERE
과 HAVING
절 사이의 선택은 계산 열을 처리할 때 쿼리 효율성에 큰 영향을 미칩니다. 최적화된 SQL을 작성하려면 이들의 고유한 역할을 이해하는 것이 중요합니다.
계산된 열의 전략적 배치
SELECT
문 내에서 생성된 열(예: SELECT 1 AS "number"
)과 같은 계산된 열은 일반적으로 HAVING
이 아닌 WHERE
절 뒤에 와야 합니다. 이는 WHERE
에서는 계산이나 집계 전 데이터를 필터링하는 반면, HAVING
에서는 이러한 작업 후를 필터링하기 때문입니다.
WHERE 절의 한계
계산된 열에 WHERE
을 사용하면 오류가 발생하는 경우가 많습니다. WHERE
조건은 기존 테이블 열이나 별칭을 참조해야 합니다. 계산된 값에 직접 연산을 수행할 수 없습니다.
WHERE와 HAVING의 주요 차이점
WHERE
절: 문이 실행되기 전에SELECT
행을 필터링합니다. 조건은 모든 테이블 열에 적용할 수 있지만 SELECT
목록
HAVING
절: 문과 집계 함수가 적용된 후SELECT
행을 필터링합니다. 선택한 열, 별칭 또는 집계 함수 결과에 조건을 적용할 수 있습니다.
성능 고려 사항
큰 테이블의 경우 WHERE
절에 계산된 열을 배치하면 계산 비용이 많이 들 수 있습니다. HAVING
은 축소된 데이터 세트(SELECT
문의 결과)에서 작동하여 불필요한 행 필터링을 최소화하므로 이러한 시나리오에서 성능 이점을 제공합니다.
예시
샘플 테이블을 살펴보겠습니다.
<code class="language-sql">CREATE TABLE `table` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `value` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `value` (`value`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</code>
10개의 행으로 채워집니다(ID 및 값 범위는 1~10):
<code class="language-sql">INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);</code>
다음 쿼리는 동일한 결과를 산출합니다.
<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- Returns 5 rows SELECT `value` v FROM `table` HAVING `value`>5; -- Returns 5 rows</code>
그러나 EXPLAIN
에서는 결정적인 성능 차이가 드러납니다.
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5; -- Uses index but scans more rows EXPLAIN SELECT `value` v FROM `table` HAVING `value`>5; -- Uses index efficiently, scans fewer rows</code>
둘 다 인덱스를 사용하는 반면, WHERE
는 테이블의 더 큰 부분을 스캔하여 필터링하는 반면, HAVING
는 사전 필터링된 더 작은 하위 집합에서 더 효율적으로 작동합니다. 이러한 차이는 데이터 세트가 클수록 점점 더 뚜렷해집니다. 따라서 계산 열의 경우 HAVING
가 일반적으로 더 나은 성능을 제공합니다.
위 내용은 MySQL의 WHERE와 HAVING: 계산된 열에 각 절을 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!