Разница между LIKE и = в MYSQL? - PullRequest
17 голосов
/ 16 июня 2009

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

SELECT foo FROM bar WHERE foobar='$foo'

И

SELECT foo FROM bar WHERE foobar LIKE'$foo'

Ответы [ 12 ]

28 голосов
/ 16 июня 2009

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

LIKE выполняет сопоставление с подстановочными знаками, используя «%» в качестве символа совпадения из нескольких символов и «_» в качестве символа сопоставления из одного символа. '\' - управляющий символ по умолчанию.

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

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

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

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

expression [NOT] LIKE pattern [ESCAPE 'escape']
19 голосов
/ 16 июня 2009

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

SELECT foo FROM bar WHERE foobar LIKE "Foo%"

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

6 голосов
/ 18 июня 2013

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

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

ВЫБРАТЬ * ОТ test КАК LEFT JOIN test КАК b НА a.field1 LIKE 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 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
3 голосов
/ 16 июня 2009

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

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

select * from state where state='PA'

Тогда для лайков я использую такие вещи, как:

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

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

3 голосов
/ 16 июня 2009

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

1 голос
/ 16 июня 2009

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

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

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

1 голос
/ 16 июня 2009

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

0 голосов
/ 03 сентября 2017

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

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

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

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

Найдена запись с идентификатором = '123456789' (неверный результат)

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

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

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

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

0 голосов
/ 11 апреля 2012

В моем случае Like быстрее =

  • Like выбрал количество строк в 0,203 секунды в первый раз, затем 0,140 секунды

  • = возвращает извлеченные одинаковые строки за 0,156 с постоянно

Возьми свой выбор

0 голосов
/ 16 июня 2009

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

Как вы понимаете, разницы нет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...