在进行没有WHERE约束的MySQL查询时,大多数人在查询中使用WHERE 1。但是,省略WHERE 1不会影响查询。这两者有区别吗?一个被认为是最好的做法吗?
答案 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
块是否需要输入WHERE
或AND
。
答案 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,这可能不是问题。