MySQL НЕ ВКЛЮЧЕН и НЕ НРАВИТСЯ

#mysql

#mysql

Вопрос:

Следующий запрос

 SELECT * FROM items WHERE field1 NOT LIKE '%a%' AND NOT LIKE '%b%' AND
NOT LIKE '%c%'
  

эквивалентно

 SELECT * FROM items WHERE field1 NOT IN ('a', 'b', 'c');
  

Вообще говоря, какой наилучший способ исключить определенные строковые значения из запроса MySQL?

Ответ №1:

Они не эквивалентны, потому что первый будет соответствовать:

 Mike
Tom
  

Поскольку в приведенных выше словах нет A, B и C. но не

 Apple Cobler
  

Который содержит A, B и C. Второй будет соответствовать чему угодно, кроме:

 a
b
c
  

Я думаю, что ваш второй запрос (НЕ ВХОДИТ) — лучший способ ИСКЛЮЧИТЬ определенные строки, при условии, что вам не нужно сопоставлять подстановочные знаки с возможными значениями. Обратите внимание, что предложение LIKE является более дорогостоящим с точки зрения производительности, потому что оно должно выполнять прямую оценку для каждой строки, а не просто набирать индекс.

Ответ №2:

Ваш первый запрос:

 SELECT * FROM items WHERE field1 NOT IN ('a', 'b', 'c');
  

такой же, как этот:

 SELECT * FROM items WHERE field1 != 'a' AND field1 != 'b' AND field1 != 'c'
  

Таким образом, ваши два запроса НЕ эквивалентны. Вместо вашего первого запроса вы также могли бы сделать что-то вроде этого

 SELECT * FROM items WHERE (field1 REGEXP '[abc]') = 0
  

Смотрите руководство по регулярному выражению для получения дополнительной информации

Ответ №3:

Нет, оба запроса не эквивалентны.

 if (field1 = 'abcde')
  

тогда первый запрос проигнорирует эту строку, потому что ‘abcde’ удовлетворяет всем условиям

 abcde Like '%a%'
abcde Like '%b%'
abcde Like '%c%' 
  

Однако второй запрос не проигнорирует результат, потому что он извлечет все записи, где поле 1 не равно a, b и c.

http://www.w3schools.com/sql/sql_like.asp

http://www.w3schools.com/sql/sql_in.asp