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

Какая разница между

SELECT foo FROM bar WHERE foobar='$foo'

И

SELECT foo FROM bar WHERE foobar LIKE'$foo'

Ответы

Ответ 1

LIKE может выполнять подстановочные знаки:

SELECT foo FROM bar WHERE foobar LIKE "Foo%"

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

Ответ 2

= в SQL выполняет точное сопоставление.

LIKE выполняет сопоставление подстановочных знаков, используя символ "%" в качестве символа совпадения символов и символ "_" в качестве символа соответствия одного символа. "\" - это escape-символ по умолчанию.

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

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

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

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

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

Ответ 3

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

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

SELECT * FROM test AS a LEFT JOIN test AS b ON a.field1 LIKE b.field2

создаст

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

тогда

SELECT * FROM test AS a LEFT JOIN test AS b ON a.field1 = b.field2

создаст

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

Ответ 4

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

Ответ 5

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

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

select * from state where state='PA'

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

Немного о google не болит...

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

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

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

Без символа% символа предложение LIKE очень похоже на знак равенства вместе с предложением WHERE.

Ответ 9

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

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

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

Ответ 10

Похоже, что вышло из PHP script. Намерение состояло в том, чтобы сопоставить содержимое переменной $foo с полем foo, но я уверен, что она должна была быть записана в двойные кавычки, поэтому содержимое $foo будет отправлено в запрос.

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

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

Ответ 11

В моем случае я нахожу Like быстрее, чем =

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

  • = возвращает неизменные строки в 0.156 сек постоянно

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

Ответ 12

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

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

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

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

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

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

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

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

Итак, по крайней мере для INTEGER-полей это кажется важным отличием...