6

我犯了一个错误并输入:

SELECT * FROM table LIMIT1

代替

SELECT * FROM table LIMIT 1(注意和之间的LIMIT空格1

在 MySQL 的 CLI 中。我预计会收到某种解析错误,但我很惊讶,因为查询返回了表中的所有记录。我的第一个想法是“愚蠢的 MySQL,我敢打赌这会在 PostgreSQL 中返回错误”,但 PostgreSQL 也返回了所有记录。然后用 SQLite 测试它 - 结果相同。

经过一番挖掘,我意识到我在桌子后面输入什么并不重要。只要没有WHERE/ORDER/GROUP子句:

SELECT * FROM table SOMETHING -- works and returns all records in table

SELECT * FROM table WHERE true SOMETHING -- doesn't work - returns parse error

我想这是一种标准化的行为,但我找不到任何解释为什么会这样。有任何想法吗?

4

3 回答 3

12

您的第一个查询等效于使用表别名的此查询:

SELECT * FROM yourtable AS LIMIT1

AS关键字是可选的。表别名允许您使用别名LIMIT1.foo而不是原始表名来引用该表的列。如果您希望在查询中为表提供更短或更描述性的别名,则使用别名会很有用。如果将表连接到自身,则必须使用别名。

SQL lite 文档

AS 关键字可选

于 2012-07-11T12:55:03.177 回答
1

这就是为什么我希望数据库引擎强制使用关键字 AS 作为别名 http://beyondrelational.com/modules/2/blogs/70/posts/10814/should-alias-names-be-preceded-by-as .aspx

于 2012-07-11T13:02:59.177 回答
0
SELECT * FROM table LIMIT1;

LIMIT1这已被 SQL 用作别名,原因LIMIT1不是 SQL 的保留文字。表名后面的东西,不是保留关键字,SQL 总是将其作为表别名。

 SELECT * FROM table LIMIT 1;

当您LIMIT在表名之后使用时,SQL 发现它是一个保留关键字,并根据行为对其进行处理。如果您想在查询中使用保留关键字可以通过将保留文字放在引号中来完成。像..

SELECT * FROM table `LIMIT`;

或者

SELECT * FROM table `LIMIT 1`;

现在 `` 引号下的所有单词都将被视为用户定义的。通常,我们使用日期、时间戳、限制等关键字作为列名会出错。

于 2012-07-11T13:01:49.507 回答