在SQL中,“WHERE 1”是什么意思?

26

有时phpMyAdmin会生成如下查询:

SELECT * 
FROM  `items` 
WHERE 1 
LIMIT 0 , 30

我在想像这样的查询中,WHERE 1 是否有任何含义。


5
这样做的原因很简单 - 如果你正在动态生成一个查询字符串,那么它比仅在不需要时重组语句以删除'WHERE'子句的特殊情况更容易陈述为始终成立。 - Rushyo
2
特别是在PHP中,常见的做法是通过将字符串连接在一起来构建SQL语句。因此,在phpMyAdmin中,他们可能会这样定义$sql = "SELECT * FROM item WHERE " . $whereClause,其中$whereClause变量在其他地方定义。解决不需要实际的where子句的问题的一种(粗糙)方法是使用这种技术。 - Kirk Woll
phpMyAdmin即使没有必要,也会始终使用LIMIT,原因是相同的。 - o0'.
3个回答

47
它没有。它意味着始终为真,因此它不会对查询产生任何过滤影响。查询规划器可能会忽略该子句。
通常在通过连接过滤条件构建客户端查询时使用它。
因此,如果您的基本查询存储在类似于此的字符串中(示例在PHP中,但它肯定适用于许多其他语言):
$sql = "select * from foo where 1 ";

那么你只需要使用一个 AND 子句将许多过滤条件连接起来,无论它是你正在使用的第一个条件还是其他条件:

// pseudo php follows...
if ($filter_by_name) {
    $sql = $sql . " and name = ? ";
}
if ($filter_by_number) {
    $sql = $sql . " and number = ? ";
}
// so on, and so forth.

听起来phpMyAdmin查询生成器似乎更喜欢始终有一个WHERE子句,而不是只有在没有条件时删除它。 - FrustratedWithFormsDesigner
2
FrustratedWithFormsDesigner - 是 Windows Forms 还是 Oracle Forms? - flq
@Frank:或者WebForms。不过,它们都很糟糕。 :) - rsenna

8

WHERE 1 是“true”或“everything”的同义词。

它是一种快捷方式,使他们无需从生成的SQL中删除where子句。

否则,您需要编写类似以下内容:

$sql = "SELECT * FROM `errors`";
if ($hasWhereClause == true) {
  $sql .= " WHERE $whereClause";
}
$sql .= "LIMIT 0 , 30";

4
我猜这是字符串连接的产物:如果没有指定条件,就会输出“1”。这样就不必决定是否应该输出WHERE关键字。
此外,您始终可以输出它并使用“AND”和“OR”连接条件。您不必决定第一个条件不应以AND、OR关键字开头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接