#mysql #sql #mysql-workbench #mysql-error-1064
#mysql #sql #mysql-workbench #mysql-ошибка-1064
Вопрос:
Я использую следующий запрос для получения данных из базы данных mysql и получаю неправильные данные. Я хочу показать release_year с 1990 по 2000 год, но он показывает мне все.
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
.
Ответ №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:
Всегда полезно использовать логический and
и or
приоритет.
Попробуйте:
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
это была ваша предполагаемая логика, добавление круглой скобки делает ваше намерение понятным для следующего пользователя, который просматривает запрос.
Комментарии:
1. У вас есть ссылка на ваш комментарий об оптимизации
IN
? Мне было бы интересно посмотреть, что они сделали (не то чтобы им пришлось много делать, учитывая, насколько плохойOR
является производительность).2. @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');
Если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте ниже.