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

时间:2016-05-24 06:02:26

标签: sql sql-server

我遇到了这个问题:

SQL Server: Select Top 0?

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

SELECT * FROM table WHERE 0=1

SELECT TOP 0 * FROM table

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

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

4 个答案:

答案 0 :(得分:31)

SQL Server查询优化器非常智能,可以确定此WHERE条件 永远不会 在任何行上生成true结果,所以它实际上并不打算扫描桌子。

如果您查看此类查询的实际执行计划,很容易看到 nothing 正在完成并且查询立即返回:

enter image description here

答案 1 :(得分:15)

MySql非常智能,可以检测到它,并知道无法做到这一点。

desc SELECT * FROM table WHERE 0=1;

enter image description here

答案 2 :(得分:5)

在查询中

SELECT * FROM table WHERE 0=1

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

并在查询中

SELECT TOP 0 * FROM table

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

两个查询都只返回列标题。

答案 3 :(得分:2)

两个查询都用于获取一组空表;

SELECT TOP 0 * FROM table
SELECT * FROM table WHERE 0=1

以及实现以下目标:

  1. 获得相同的列名结构
  2. 用于返回列详细信息,但没有数据
  3. 并希望查询以检查连接性