【问题标题】:MySQL returns wrong results with the BETWEEN clauseMySQL 使用 BETWEEN 子句返回错误结果
【发布时间】:2019-08-20 21:54:49
【问题描述】:

我正在使用以下查询从 mysql 数据库中获取数据,但我得到了错误的数据。我想显示从 1990 年到 2000 年的 release_year,但它显示了所有内容。

SELECT title,release_year
FROM FILMS
WHERE 
    release_year BETWEEN 1990 AND 2000
    AND budget > 1000000000
    AND language ='Spanish'
    OR language = 'French';

我尝试切换查询的顺序,但它似乎不起作用,或者我尝试在 release_year between 1990 AND 2000 中添加括号。

【问题讨论】:

    标签: mysql sql mysql-workbench mysql-error-1064


    【解决方案1】:

    你有一个逻辑优先问题。

    这些是您的过滤条件:

    release_year BETWEEN 1990 AND 2000 
    AND budget > 1000000000 
    AND language ='Spanish'
    OR language = 'French'
    

    在逻辑运算符中,OR 的优先级低于 AND,因此在语法上等价于:

    ( 
        release_year BETWEEN 1990 AND 2000 
        AND budget > 1000000000 
        AND language ='Spanish'
    )
    OR language = 'French'
    

    现在您可以看到,该表达式将允许任何法国电影,无论其发行年份和预算如何。

    你可能想要:

    release_year BETWEEN 1990 AND 2000 
    AND budget > 1000000000 
    AND ( language ='Spanish' OR language = 'French')
    

    可以简写为:

    release_year BETWEEN 1990 AND 2000 
    AND budget > 1000000000 
    AND language IN ('Spanish', 'French')
    

    【讨论】:

      【解决方案2】:

      强制逻辑andor 优先总是一个好主意。

      试试:

      SELECT title,release_year 
      FROM FILMS 
      WHERE release_year between 1990 AND 2000 
      AND budget > 1000000000 
      AND (language ='Spanish' OR language = 'French')
      ;
      

      SELECT title,release_year 
      FROM FILMS 
      WHERE release_year between 1990 AND 2000 
      AND budget > 1000000000 
      AND language IN ('Spanish', 'French')
      ;
      

      最新版本的 MySQL 已对 IN 进行了优化,使其性能优于等效的 OR 条件集。

      注意,我说 "always" 是因为即使 (a and b) or c 是您的预期逻辑,添加括号也会让下一个查看查询的人清楚您的意图。

      【讨论】:

      • 您对IN 的优化有评论吗?我很想看看他们做了什么(鉴于OR 的性能往往很糟糕,他们不必做太多事情)。
      • @Nick 我真的没有参考资料;这只是我在这里看到的其他可靠贡献者所说的。
      【解决方案3】:

      试试这个..

      SELECT title,release_year 
      FROM FILMS WHERE release_year >= 1990 
      AND release_year <= 2000 
      AND budget > 1000000000 
      AND (language ='Spanish' OR language = 'French');
      

      如果您有任何问题,请在下方评论。

      【讨论】:

        猜你喜欢
        • 2019-11-22
        • 2021-11-22
        • 2018-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2013-11-07
        • 1970-01-01
        相关资源
        最近更新 更多