【问题标题】:Importance of WHERE 1 in MySQL queriesWHERE 1 在 MySQL 查询中的重要性
【发布时间】:2009-12-31 02:29:59
【问题描述】:

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我不认为这是最佳实践问题,但人们有时会使用它来更轻松地构建动态查询。

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

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

    【讨论】:

    • @Eric WHERE 1WHERE 1 = 1 之间有速度差异吗?
    • @fire - 不知道,你会通过测试来找出答案,但我认为任何体面的优化器都会消除这两个表达式,因为它们与查询无关。
    【解决方案2】:

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

    所以基本上只是懒惰。

    【讨论】:

    • +1 但这不仅仅是懒惰。它也更简单、更快、更安全
    • KISS 原则 :)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多