MySQL查询中WHERE 1的重要性

Bri*_*ian 20 mysql

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

Eri*_*lje 51

我不认为这是最佳实践的问题,但人们有时会使用它来使构建动态查询更容易一些.

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

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

... etc
Run Code Online (Sandbox Code Playgroud)

没有WHERE 1在那里我需要检查每个if块我是否需要放入一个WHERE或一个AND.


cle*_*tus 11

这不是必需的.99.9%的时间它只是意味着动态构造了查询,并WHERE 1为动态条件子句带来了更简单的逻辑,这意味着您可以继续添加AND id = 3到查询的末尾,它不会破坏语法.如果你没有,WHERE 1你必须担心是否有一个WHERE条款以及是否先添加条件AND.

所以它基本上只是懒惰.

  • +1但它不仅仅是懒惰.它也更简单,更快速,更安全 (7认同)

pax*_*blo 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 "
Run Code Online (Sandbox Code Playgroud)

这不像以下那样干净:

query = "select * from tbl where 1 = 1"
foreach clause in all_clauses:
    query = query + " and " + clause
Run Code Online (Sandbox Code Playgroud)

它应该对任何体面的DBMS 产生很小的影响,因为执行引擎应该在执行查询之前去掉那些类型的子句.

它是否是最佳实践取决于您是否宁愿在查询生成器中使用"更干净"的代码,或者您是否宁愿让公司DBA试图跟踪您并使用这些愚蠢的条款将您击败致死: - )当然,如果你使用MySQL,你可能 DBA,这可能不是问题.