>데이터 베이스 >MySQL 튜토리얼 >MySQL WHERE 절에서 열 별칭을 사용할 수 없는 이유는 무엇입니까?

MySQL WHERE 절에서 열 별칭을 사용할 수 없는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-22 08:17:13219검색

Why Can't I Use a Column Alias in a MySQL WHERE Clause?

MySQL WHERE 절이 열 별칭을 허용하지 않음: 오류 설명

#1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery'과 같은 MySQL 쿼리 오류가 발생했나요? 이는 일반적으로 guaranteed_postcode 절 내에서 열 별칭(예: 아래 예의 WHERE)을 사용하려고 할 때 발생합니다.

문제가 있는 쿼리는 다음과 같습니다.

<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE `guaranteed_postcode` NOT IN 
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia')
)</code>

근본 원인은? MySQL의 WHERE 절은 별칭이 정의된 SELECT을 처리합니다. 따라서 guaranteed_postcode 절 실행 중에는 별칭 WHERE이 아직 인식되지 않습니다.

MySQL 설명서 설명:

MySQL 문서에는 WHERE 절에 열 별칭이 허용되지 않는다고 명시되어 있습니다. 이는 쿼리 실행 순서에 따른 제한 사항입니다.

해결책: 하위 쿼리 또는 HAVING 절

이 문제를 해결하려면 두 가지 주요 옵션이 있습니다.

  1. 중첩 하위 쿼리: SUBSTRING 절의 하위 쿼리 내에 직접 WHERE 함수를 포함합니다.
<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN 
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia')
)</code>
  1. HAVING 절(덜 효율적임): 가능하지만 HAVING을 사용하는 것은 일반적으로 이 시나리오에서 덜 효율적입니다. HAVING은 기본 행 필터링이 아닌 집계 후 필터링을 위해 설계되었습니다. 쿼리를 재구성해야 합니다. 자세한 설명은 WHEREHAVING를 비교하는 다른 자료를 참고하세요.

올바른 접근 방식 선택:

이 특별한 경우에는 중첩된 하위 쿼리(옵션 1)가 더 깔끔하고 효율적인 솔루션을 제공합니다. WHERE 절의 범위 내에서 별칭 계산을 적용하여 문제를 직접 해결합니다. 집계를 수행하지 않는 한 HAVING을 사용하지 마세요.

위 내용은 MySQL WHERE 절에서 열 별칭을 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.