Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有LIMIT1的SQL返回所有记录_Sql - Fatal编程技术网

带有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`;