Я столкнулся с довольно своеобразным синтаксисом в MySQL, а именно с наличием символа «-» в условии WHERE в следующем запросе.
SELECT
users.id
FROM
users
WHERE
users.account_status >= 3
AND users.account_status NOT IN (8 , 9)
AND - users.registration_status = 14
AND users.id IN (229);
Я исследовал этот синтаксис в здесь?
Может ли это указывать на преобразование значения столбца «регистрационный_статус» в отрицательное число?
Это не «преобразование в отрицательное число», а смена знака. Т.е. если users.registrationstatus
, например, -1
, то - users.registration status
будет +1
.. AND - users.registration_status = 14 ..
— плохая практика, это условие не подлежит SARG. Используйте .. AND users.registration_status = -14 ..
демоДа, он меняет знак user.registration_status перед сравнением его с 14 в вашем запросе.
Это унарный оператор минус . Следующие выражения эквивалентны:
- users.registration_status = 14
0 - users.registration_status = 14
users.registration_status = -14
причем последнее, вероятно, является наиболее очевидным (ясность кода важна!)
Следующие выражения логически эквивалентны. Но есть разница на этапе выполнения, в вычислительной сложности и потреблении ресурсов. Последний вариант является предпочтительным.
@Akina Я не проверял и не знаю деталей MySQL/MariaDB, но предполагаю, что оптимизатор запросов создает один и тот же план запроса для всех из них, поскольку они могут быть статически преобразованы в одно каноническое выражение.
Я предполагаю, что оптимизатор запросов создает для всех один и тот же план запроса. Я привожу демонстрационную скрипту в комментарии к вопросу, где вы можете увидеть разницу в планах выполнения. Это верно как для MySQL, так и для MariaDB. Вы можете протестировать то же самое для других СУБД.
Да, это Измените знак оператора аргумента.