Разница между LIKE и = в MYSQL?

в чем разница между

SELECT foo FROM bar WHERE foobar='$foo'

и

SELECT foo FROM bar WHERE foobar LIKE'$foo'

12 ответов


как можно сделать сопоставление:

SELECT foo FROM bar WHERE foobar LIKE "Foo%"

Если вам не нужно сопоставление шаблонов, используйте = вместо LIKE. Это быстрее и безопаснее. (Вы используете параметризованные запросы, верно?)


= в SQL делает точное соответствие.

как делает шаблоны, с помощью '%' в качестве многофункционального символ-матч и '_' в качестве одного символа символ матча. "\"является escape-символом по умолчанию.

foobar = '$foo' и foobar LIKE '$foo' будет вести себя одинаково, потому что ни одна строка не содержит подстановочный знак.

foobar LIKE '%foo' будет соответствовать чему-либо, заканчивающемуся на "foo".

LIKE также ESCAPE предложение, чтобы вы могли установить escape характер. Это позволит вам сопоставить литерал " % " или " _ " в строке. Вы также можете сделать NOT LIKE.

сайт MySQL имеет документация по оператору LIKE. Синтаксис

expression [NOT] LIKE pattern [ESCAPE 'escape']

пожалуйста, имейте в виду, что MySQL будет делать отливки в зависимости от ситуации: LIKE будет выполнять строковое литье, тогда как = будет выполнять int cast. Учитывая ситуацию:

    (int)   (vchar2)
id  field1  field2
1   1       1
2   1       1,2

выбрать * От test как LEFT JOIN test как b на a.field1 как b.field2

будет

id  field1  field2  id  field1  field2
1   1       1       1   1       1
2   1       1,2     1   1       1

, тогда как

выбрать * От test как LEFT JOIN test как b на a.field1 = б.поле2

будет

id  field1  field2  id  field1  field2
1   1       1       1   1       1
1   1       1       2   1       1,2
2   1       1,2     1   1       1
2   1       1,2     2   1       1,2

по данным справочная страница MYSQL, конечные пробелы значимы в LIKE, но не =, и вы можете использовать подстановочные знаки, % для любых символов и _ точно для одного символа.


Я думаю, что с точки зрения скорости = быстрее, чем нравится. Как указано, = делает точное совпадение и, как можно использовать подстановочный знак, если это необходимо.

Я всегда использую = знак, когда я знаю значения чего-то. Например

select * from state where state='PA'

тогда для подобных я использую такие вещи, как:

select * from person where first_name like 'blah%' and last_name like 'blah%'

Если вы используете Oracle Developers Tool, вы можете протестировать его с помощью Explain, чтобы определить влияние на базу данных.


конечный результат будет таким же, но механизм запросов использует другую логику для получения ответа. Как правило, такие запросы записывают больше циклов, чем запросы"=". Но когда подстановочный знак не указан, я не уверен, как оптимизатор может относиться к этому.


С пример в вашем вопросе нет никакой разницы.

но, как сказал Джесси, вы можете сделать сопоставление подстановочных знаков

SELECT foo FROM bar WHERE foobar LIKE "Foo%"

SELECT foo FROM bar WHERE foobar NOT LIKE "%Foo%"

Подробнее:

http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html


немного OG google не повредит...

предложение WHERE со знаком равенства ( = ) отлично работает, если мы хотим сделать точное совпадение. Но может быть требование, когда мы хотим отфильтровать все результаты, где "foobar "должен содержать"foo". Это можно обработать с помощью предложения SQL LIKE вместе с предложением WHERE.

Если предложение SQL LIKE используется вместе с символами%, оно будет работать как подстановочный знак.

SELECT foo FROM bar WHERE foobar LIKE'$foo%'

без символа % как предложение очень аналогично знаку равенства вместе с предложением WHERE.


в вашем примере они семантически равны и должны возвращать один и тот же вывод.

однако, как даст вам возможность сопоставления шаблонов с подстановочными знаками.

вы также должны отметить, что = может дать вам повышение производительности в некоторых системах, поэтому, если вы, например, ищете номер exakt, = будет предпочтительным методом.


выглядит очень похоже на взятый из php-скрипта. Целью было сопоставить содержимое переменной $foo на foo поле базы данных, но я уверен, что оно должно было быть написано в двойные кавычки, поэтому содержимое $foo будет введено в запрос.

как вы выразились, нет никакой разницы.

это потенциально может быть медленнее, но я уверен, что MySQL понимает, что в строке поиска нет подстановочных знаков, поэтому он не будет делать, как скороговорка соответствия в конце концов, так что на самом деле, никакой разницы.


в моем случае я найти Like быть быстрее, чем =

  • Like получил несколько строк в 0.203 секунд в первый раз, а затем 0.140 секунд

  • = возвращает те же строки в 0.156 секундах постоянно

сделай свой выбор


Я нашел важное различие между LIKE и знак равенства = !

пример: у меня есть таблица с полем " ID "(тип: int (20) ) и запись, содержащая значение"123456789"

если я это сделаю:

SELECT ID FROM example WHERE ID = '123456789-100'

найдена запись с ID = ' 123456789 '(неверный результат)

если я это сделаю:

SELECT ID FROM example WHERE ID LIKE '123456789-100'

запись не найдена (это правильно)

Итак, по крайней мере, для целых полей это кажется важным разница...