[mysql] Where 절의 알 수없는 열

간단한 쿼리가 있습니다.

SELECT u_name AS user_name FROM users WHERE user_name = "john";

나는 Unknown Column 'user_name' in where clause. 'user_name'이후에도 성명서의 다른 부분에서 언급 할 수 없습니까 select 'u_name as user_name'?



답변

SQL은 오른쪽에서 왼쪽으로 거꾸로 평가됩니다. 따라서 where 절은 select 절 이전에 구문 분석되고 평가됩니다. 이 때문에 u_name에서 user_name으로의 별칭이 아직 발생하지 않았습니다.


답변

이건 어떤가요:

SELECT u_name AS user_name FROM users HAVING user_name = "john";


답변

다음 MySQL 매뉴얼 페이지를 참조하십시오. http://dev.mysql.com/doc/refman/5.0/en/select.html

“select_expr은 AS alias_name을 사용하여 별칭을 부여 할 수 있습니다. 별칭은 표현식의 열 이름으로 사용되며 GROUP BY, ORDER BY 또는 HAVING 절에서 사용할 수 있습니다.”

(…)

WHERE 절이 실행될 때 열 값이 아직 결정되지 않았을 수 있으므로 WHERE 절에서 열 별칭을 참조하는 것은 허용되지 않습니다. B.5.4.4 절.“열 별칭 문제”를 참조하십시오.


답변

select u_name as user_name from users where u_name = "john";

반환해야 할 행 (또는 조인 된 행)을 결정하기 위해 where 절이 먼저 평가됩니다. where 절이 실행되면 select 절이 실행됩니다.

더 나은 방법으로 말하면 다음과 같이 상상해보십시오.

select distinct(u_name) as user_name from users where u_name = "john";

두 번째없이 전반을 참조 할 수 없습니다. 항상 먼저 평가되는 곳은 select 절입니다.


답변

SELECT 문을 사용하여 데이터베이스에 실제로 존재하지 않는 새 필드를 만든 다음과 같은 쿼리를 수행하려는 경우 (적어도 하나의 첨부 파일이있는 모든 노드를 찾고) 그 결과에 대한 별칭은 동일한 문제가 발생합니다.

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;

“WHERE 절에서 알 수없는 ‘attachmentcount’열”이라는 오류가 발생합니다.

솔루션은 실제로 매우 간단합니다. 별칭을 생성하는 문으로 별칭을 바꾸십시오. 예 :

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;

여전히 별칭이 반환되지만 이제 SQL은 알 수없는 별칭에서 지루하지 않아야합니다.


답변

귀하의 정의 alias는 이에 대한 WHERE조항을 사용해야하는 HAVING조항에 의해 환영받지 않습니다.

SELECT u_name AS user_name FROM users HAVING user_name = "john";

또는 원래 열 이름을 WHERE

SELECT u_name AS user_name FROM users WHERE u_name = "john";

하위 쿼리 또는 계산의 결과로 사용자 정의 별칭에 결과가있는 것과 동일 HAVING합니다.WHERE

SELECT u_name AS user_name ,
(SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
FROM users  WHERE u_name = "john" HAVING user_last_name ='smith'


답변

어느 한 쪽:

SELECT u_name AS user_name
FROM   users
WHERE  u_name = "john";

또는:

SELECT user_name
from
(
SELECT u_name AS user_name
FROM   users
)
WHERE  u_name = "john";

후자는 RDBMS가 인라인보기로 푸시하는 술어를 지원하는 경우 전자와 동일해야합니다.