我犯了一个错误并输入了:
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
我猜这是一种标准化的行为,但我找不到任何解释为什么会这样。有什么想法吗?
答案 0 :(得分:12)
您的第一个查询等同于使用表别名的此查询:
SELECT * FROM yourtable AS LIMIT1
AS
关键字是可选的。表别名允许您使用别名LIMIT1.foo
而不是原始表名来引用该表的列。如果您希望在查询中为表提供更短或更具描述性的别名,则使用别名会很有用。如果将表连接到自身,则必须使用别名。
答案 1 :(得分:1)
这就是为什么我希望数据库引擎强制使用关键字AS作为别名 http://beyondrelational.com/modules/2/blogs/70/posts/10814/should-alias-names-be-preceded-by-as.aspx
答案 2 :(得分:0)
SELECT * FROM table LIMIT1;
LIMIT1
这已被SQL视为别名,因为LIMIT1
不是SQL的保留字面。
表名后面的东西,不是保留的关键字,总是被SQL作为表别名。
SELECT * FROM table LIMIT 1;
当你在表名之后使用LIMIT
时,SQL发现它是一个保留关键字,并根据行为为它工作。如果要在查询中使用保留关键字可以通过将保留文字放在引号中来完成。像..
SELECT * FROM table `LIMIT`;
OR
SELECT * FROM table `LIMIT 1`;
现在``引号下的所有单词都将被视为用户定义。 通常我们错误地将日期,时间戳,限制等... 关键字用作列名。