MySQL使用BETWEEN子句返回错误的结果

时间:2019-03-29 22:27:42

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

我正在使用以下查询从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上加上括号。

enter image description here

3 个答案:

答案 0 :(得分:5)

尝试一下。

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

如有任何疑问,请在下面评论。

答案 1 :(得分:4)

您有一个逻辑上的先决条件问题。

这些是您的过滤条件:

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 :(得分: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条件集。

注意,我说“总是” 是因为,即使(a and b) or c是您想要的逻辑,加上括号也会使您的意图对查看查询的下一个人清楚。