Какая разница между
SELECT foo FROM bar WHERE foobar='$foo'
И
SELECT foo FROM bar WHERE foobar LIKE'$foo'
Какая разница между
SELECT foo FROM bar WHERE foobar='$foo'
И
SELECT foo FROM bar WHERE foobar LIKE'$foo'
LIKE может выполнять подстановочные знаки:
SELECT foo FROM bar WHERE foobar LIKE "Foo%"
Если вам не требуется сопоставление шаблонов, используйте вместо = LIKE. Это быстрее и безопаснее. (Вы используете параметризованные запросы, верно?)
= в 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']
Пожалуйста, помните также, что MySQL будет выполнять отливки в зависимости от ситуации: LIKE будет выполнять строковое литье, тогда как = будет выполнять int cast. Учитывая ситуацию:
(int) (vchar2)
id field1 field2
1 1 1
2 1 1,2
SELECT * FROM
test
AS a LEFT JOINtest
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 JOINtest
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
Согласно справочная страница MYSQL, конечные пробелы имеют значение LIKE, но not =, и вы можете использовать подстановочные знаки,% для любых символов, и _ для одного символа.
Я думаю, что с точки зрения скорости = быстрее, чем 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, чтобы определить влияние на базу данных.
Конечный результат будет таким же, но механизм запроса использует другую логику, чтобы получить ответ. Как правило, запросы LIKE записывают больше циклов, чем запросы "=". Но когда не задан символ подстановки, я не уверен, как оптимизатор может это обработать.
С примером в вашем вопросе нет разницы.
Но, как Джесси сказал, что вы можете использовать подстановочный знак
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
Немного о google не болит...
Предложение WHERE с равным знаком (=) отлично работает, если мы хотим сделать точное совпадение. Но может быть требование, когда мы хотим отфильтровать все результаты, где foobar должен содержать "foo". Это можно обрабатывать с помощью предложения SQL LIKE вместе с предложением WHERE.
Если предложение SQL LIKE используется вместе с символами%, то оно будет работать как шаблон.
SELECT foo FROM bar WHERE foobar LIKE'$foo%'
Без символа% символа предложение LIKE очень похоже на знак равенства вместе с предложением WHERE.
В вашем примере они семантически равны и должны возвращать тот же результат.
Однако LIKE даст вам возможность сопоставления шаблонов с подстановочными знаками.
Вы также должны заметить, что = может дать вам повышение производительности в некоторых системах, поэтому, если вы, например, ищете номер exakt, = будет предпочтительным методом.
Похоже, что вышло из PHP script. Намерение состояло в том, чтобы сопоставить содержимое переменной $foo
с полем foo
, но я уверен, что она должна была быть записана в двойные кавычки, поэтому содержимое $foo будет отправлено в запрос.
Как вы выразились, нет никакой разницы.
Возможно, он будет медленнее, но я уверен, что MySQL понимает, что в строке поиска нет подстановочных знаков, поэтому он не будет делать LIKE patter-matching в конце концов, так что действительно, никакой разницы.
В моем случае я нахожу 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'
Запись не найдена (это правильно)
Итак, по крайней мере для INTEGER-полей это кажется важным отличием...