MySQL查询中WHERE 1的重要性

时间:2009-12-31 02:30:00

标签: mysql

在进行没有WHERE约束的MySQL查询时,大多数人在查询中使用WHERE 1。但是,省略WHERE 1不会影响查询。这两者有区别吗?一个被认为是最好的做法吗?

3 个答案:

答案 0 :(得分:51)

我认为这不是最佳做法的问题,但人们有时会使用它来使构建动态查询更容易。

string sql = "SELECT * FROM mytable WHERE 1 ";
if ( somecondition ) {
   sql += "AND somefield = somevalue ";
}

if ( someothercondition ) {
   sql += "AND someotherfield = someothervalue ";
}

... etc

如果没有WHERE 1,我需要检查每个if块是否需要输入WHEREAND

答案 1 :(得分:11)

没有必要。 99.9%的时间它只是意味着动态构造了查询,并且放入WHERE 1导致动态条件子句的逻辑更简单,这意味着您可以继续将AND id = 3添加到查询的末尾并赢得不要破坏语法。如果您没有WHERE 1,则必须担心是否存在WHERE条款以及是否在AND之前添加条件。

所以基本上只是懒惰。

答案 2 :(得分:8)

对于自动代码生成器和其他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,这可能不是问题。