Разница между 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 JOINtest
как 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 JOINtest
как 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'
запись не найдена (это правильно)
Итак, по крайней мере, для целых полей это кажется важным разница...