子句在何处的未知列

时间:2020-03-06 14:55:46  来源:igfitidea点击:

我有一个简单的查询:

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

我在where子句中得到"未知列'user_name'"。即使在"选择'u_name作为用户名"之后,我是否也不能在语句的其他部分中引用'user_name'?

解决方案

你不能。直到返回时间,user_name才存在。

否,我们不需要选择正确的名称。如果我们为表提供了别名,则可以使用它。

已更正:

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

SQL从右到左向后评估。因此,where子句在select子句之前进行分析和评估。因此,尚未发生u_name到user_name的别名。

任何一个:

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支持谓词推入内联视图,则后者应与前者相同。

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 u.username FROM users u;"),但必须使用所引用列的实际名称。 AS仅影响字段的返回方式。

据我所知,在MS-SQL 2000/5中。过去我对此一直犯规。

参见下面的MySQL手册页:http://dev.mysql.com/doc/refman/5.0/en/select.html

"A select_expr can be given an alias
  using AS alias_name. The alias is used
  as the expression's column name and
  can be used in GROUP BY, ORDER BY, or
  HAVING clauses."

(...)

It is not permissible to refer to a column alias in a WHERE clause,
  because the column value might not yet be determined when the WHERE
  clause is executed. See Section B.5.4.4, “Problems with Column
  Aliases”.

SELECT user_name
FROM
(
SELECT name AS user_name
FROM   users
) AS test
WHERE  user_name = "john"

第1行和第2行导致" WHERE"子句中的未知列,并由第3行解决:

  • $ sql =" SELECT * FROM users where username = ="。$ userName;`
  • $ sql =" SELECT * FROM users where username = ="。$ userName。"";
  • $ sql =" SELECT * FROM users where where username ='"。$ userName。"'";`

关于什么:

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