Разница между 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-полей это кажется важным отличием...