将"Where 0 = 1"解析为全表或只返回列名

Fri*_*ndy 21 sql sql-server

我遇到了这个问题:

SQL Server:选择Top 0?

我想问一下我是否使用了查询

SELECT * FROM table WHERE 0=1
Run Code Online (Sandbox Code Playgroud)

要么

SELECT TOP 0 * FROM table
Run Code Online (Sandbox Code Playgroud)

它会立即返回列名,还是继续解析整个表,最后返回零结果?

我有一个10,000行的生产表 - 它会检查WHERE每一行的条件吗?

mar*_*c_s 31

SQL Server查询优化器足够聪明,可以发现这种WHERE情况永远不会true在任何行上产生结果,所以它实际上并不打算扫描表.

如果你查看这样一个查询的实际执行计划,很容易看到没有任何事情并且查询立即返回:

在此输入图像描述


小智 15

MySql非常智能,可以检测到它,并知道它无法做到.

desc SELECT * FROM table WHERE 0=1;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


San*_*mar 5

在查询中

SELECT * FROM table WHERE 0=1
Run Code Online (Sandbox Code Playgroud)

WHERE子句永远不会成立,因此SQL Server不会扫描您的所有表.

并在查询中

SELECT TOP 0 * FROM table
Run Code Online (Sandbox Code Playgroud)

您正在指定,TOP 0因此SQL Server非常智能,因此它永远不会扫描您的表以返回0行.

这两个查询都只返回列标题.