【发布时间】:2009-12-31 02:29:59
【问题描述】:
在没有 WHERE 约束的情况下进行 MySQL 查询时,大多数人在查询中使用 WHERE 1。但是,省略 WHERE 1 不会影响查询。两者有区别吗?一种被认为是最佳做法吗?
【问题讨论】:
标签: mysql
在没有 WHERE 约束的情况下进行 MySQL 查询时,大多数人在查询中使用 WHERE 1。但是,省略 WHERE 1 不会影响查询。两者有区别吗?一种被认为是最佳做法吗?
【问题讨论】:
标签: mysql
我不认为这是最佳实践问题,但人们有时会使用它来更轻松地构建动态查询。
string sql = "SELECT * FROM mytable WHERE 1 ";
if ( somecondition ) {
sql += "AND somefield = somevalue ";
}
if ( someothercondition ) {
sql += "AND someotherfield = someothervalue ";
}
... etc
如果没有WHERE 1,我需要检查每个if 块是否需要放入WHERE 或AND。
【讨论】:
WHERE 1 和 WHERE 1 = 1 之间有速度差异吗?
没必要。 99.9% 的时间它只是意味着查询是动态构造的,并且放入 WHERE 1 会导致动态条件子句的逻辑更简单,这意味着您可以继续将 AND id = 3 添加到查询的末尾并且它不会破坏句法。如果您没有WHERE 1,则必须担心是否有WHERE 子句以及是否在条件前面加上AND。
所以基本上只是懒惰。
【讨论】:
对于自动代码生成器和其他 SQL 语句操作器来说,这是一种少见的情况。通过以where 1(或where 1 = 1)开始过滤部分,您的自动代码生成器只需添加带有and 前缀的新过滤器。
否则你会得到如下代码:
query = "select * from tbl"
sep = " where "
foreach clause in all_clauses:
query = query + sep + clause
sep = "and "
这不像:
query = "select * from tbl where 1 = 1"
foreach clause in all_clauses:
query = query + " and " + clause
它应该非常与任何体面的 DBMS 几乎没有区别,因为执行引擎应该在执行查询之前去除这些子句。
这是否是最佳实践取决于您是否愿意在查询生成器中使用“更干净”的代码,或者您是否愿意让公司 DBA 试图追踪您并因为使用这种愚蠢的做法而将您殴打致死子句 :-) 当然,如果您使用的是 MySQL,您可能成为 DBA,所以这可能不是问题。
【讨论】: