带有LIMIT1的SQL返回所有记录
我犯了一个错误,进入:带有LIMIT1的SQL返回所有记录,sql,Sql,我犯了一个错误,进入: 从表LIMIT1中选择* 而不是 从表LIMIT 1中选择*(注意LIMIT和1之间的空格) 在MySQL的CLI中。我希望收到某种解析错误,但我很惊讶,因为查询返回了表中的所有记录。我的第一个想法是“愚蠢的MySQL,我打赌这将在PostgreSQL中返回错误”,但PostgreSQL也返回了所有记录。然后用SQLite对其进行了测试,得到了相同的结果 经过一番挖掘,我意识到我在桌子后进入什么并不重要。只要没有WHERE/ORDER/GROUP子句: SELECT *
从表LIMIT1中选择*
而不是
从表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
我想这是一种标准化的行为,但我找不到任何解释。有什么想法吗?您的第一个查询相当于使用表别名进行的此查询:
SELECT * FROM yourtable AS LIMIT1
AS
关键字是可选的。表别名允许您使用别名LIMIT1.foo
而不是原始表名来引用该表的列。如果希望在查询中为表提供更短或更具描述性的别名,则使用别名可能很有用。如果将表联接到自身,则必须使用别名
从:
LIMIT1
这已被SQL用作别名,因为LIMIT1
不是SQL的保留文字。
表名之后的内容,而该内容不是保留关键字,SQL始终将其作为表别名
SELECT * FROM table LIMIT 1;
当您在表名之后使用LIMIT
时,SQL发现它是一个保留关键字,并根据行为对其进行处理。若您想在查询中使用保留关键字,可以通过将保留文字置于引号中来实现。像
SELECT * FROM table `LIMIT`;
或
现在``引号中包含的所有单词都将被视为用户定义的。
通常,我们会将日期、时间戳、限制等作为列名使用,从而错误地使用关键字。这就是为什么我希望DB引擎强制将关键字用作别名的原因
您可以在查询中为任何表指定别名。这使您能够进行自联接(多次指定同一个表)。@NikolaMarkovinovićSpot on。OP的别名为table
为LIMIT1
您应该将其作为答案发布。建议此处唯一的标签是'sql'该死,忘了它吧。我总是使用“AS”语法。我会在10分钟内接受答案,谢谢。我非常讨厌这些oradoc类型的图形:D+1,我也喜欢这些图形,因为任何新手都很容易理解。
SELECT * FROM table `LIMIT`;
SELECT * FROM table `LIMIT 1`;