Существует три записи:
Я хочу получить результат без (a = 7 и b = 836).
результат пуст при выполнении sql, например select * from test where a!=7 and b!=836
, но он получил правильный результат, используя select * from test where a<>7 or b<>836
.
У меня есть два вопроса:
Разница в ваших логических операторов, and
и or
в сочетании с круглыми скобками.
select * from test where a!=7 and b!=836
Этот запрос будет выбирать, где BOTH ваших операторов вернет true, то есть оба не 7, а b не 836. Это ничего не вернет, нет записи, где оба они являются истинными.
select * from test where !(a=7 and b=836)
Когда вы кладете круглые скобки вокруг вашего and
вы двигаетесь логика вокруг. Это утверждение означает, что все записи НЕ соответствуют любой записи, где оба равно 7 и b равно 836. Таким образом, внутри скобки она соответствует первой записи, а затем инвертирует этот выбор.
select * from test where a<>7 or b<>836
<>
- это то же самое, что и !=
(Ссылка на документацию). Но в этом запросе вы используете or
. Таким образом, он будет соответствовать любой записи, где a не 7, и любая запись, которая не является 836. Таким образом, будет соответствовать как вторая, так и третья строки.
Для получения дополнительных материалов ознакомьтесь с Законами Де Моргана. !(a and b)
равно !a or !b
. Больше объяснений здесь и здесь.
На самом деле! = И <> точно то же самое. См. Документацию.
<>
является стандартом sql !=
нестандартным.
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_not-equal