При использовании SQL, есть ли какие-либо преимущества использования =
в WHERE
предложении вместо LIKE
?
Без каких-либо специальных операторов, LIKE
и =
так же, верно?
sql
performance
equals
sql-like
Travis
источник
источник
5
голоса для тега like-operator . Могу ли я попросить вас предложить sql-like как синоним ?Ответы:
Разные операторы
LIKE
и=
разные операторы. Большинство ответов здесь сосредоточены на поддержке групповых символов, что не единственное различие между этими операторами!=
является оператором сравнения, который работает с числами и строками. При сравнении строк оператор сравнения сравнивает целые строки .LIKE
является строковым оператором, который сравнивает символ за символом .Чтобы усложнить ситуацию, оба оператора используют параметры сортировки, которые могут оказать существенное влияние на результат сравнения.
Пример мотивации
Давайте сначала определим пример, в котором эти операторы дают явно разные результаты. Позвольте мне процитировать из руководства MySQL:
Обратите внимание, что эта страница руководства MySQL называется функциями сравнения строк и
=
не обсуждается, что означает, что=
она не является строго функцией сравнения строк.Как
=
работает?SQL Standard § 8.2 описывает , как
=
сравниваются строки:(Акцент добавлен.)
Что это значит? Это означает, что при сравнении строк
=
оператор является лишь тонкой оберткой вокруг текущего сопоставления. Сличение - это библиотека, которая имеет различные правила для сравнения строк. Вот пример двоичного сопоставления из MySQL :Это конкретное сопоставление происходит для сравнения побайтно (именно поэтому оно называется «двоичным» - оно не придает никакого особого значения строкам). Другие сопоставления могут обеспечить более сложные сравнения.
Например, здесь сопоставление UTF-8, которое поддерживает сравнения без учета регистра. Код слишком длинный для вставки, но перейдите по этой ссылке и прочитайте текст
my_strnncollsp_utf8mb4()
. Такое сопоставление может обрабатывать несколько байтов одновременно и может применять различные преобразования (например, сравнение без учета регистра).=
Оператор полностью абстрагируется от капризов обобщению.Как
LIKE
работает?SQL Standard § 8.5 описывает , как
LIKE
сравниваются строки:(Акцент добавлен.)
Это довольно многословно, поэтому давайте разберемся с этим. Пункты ii и iii относятся к групповым символам
_
и%
, соответственно. ЕслиP
не содержит подстановочных знаков, применяется только пункт iv. Это тот случай, который представляет интерес для ОП.В этом случае он сравнивает каждую «подстроку» (отдельные символы)
M
с каждой подстрокой приP
использовании текущего сопоставления.Выводы
Суть в том, что при сравнении строк
=
сравнивается вся строка, тогда какLIKE
сравнивается один символ за раз. Оба сравнения используют текущую сортировку. Это различие приводит к разным результатам в некоторых случаях, о чем свидетельствует первый пример в этом посте.Какой из них вы должны использовать? Никто не может сказать вам это - вам нужно использовать тот, который подходит для вашего случая использования. Не преждевременно оптимизируйте, переключая операторы сравнения.
источник
LIKE
значит, но этот ответ удивительным образом объясняет, что использованиеLIKE
без%
или с_
настоящим совсем не то же самое, что использование=
. Пусть ваш ответ получит тысячу голосов.'AbCdEfG'
, а я его получаюWHERE MyCol = 'abcdefg'
, я все равно получаю эту строку обратно, даже если они явно не являются побайтовымиset charset latin1;
SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
дает 0 иSELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
0 тоже.Оператор equals (=) представляет собой «оператор сравнения сравнивает два значения на равенство». Другими словами, в выражении SQL он не вернет true, если обе стороны уравнения не равны. Например:
Оператор LIKE «реализует сравнение сопоставления с шаблоном», который пытается сопоставить «строковое значение со строкой шаблона, содержащей символы подстановки». Например:
LIKE обычно используется только со строками и равно (я считаю) быстрее. Оператор equals обрабатывает символы подстановки как буквенные символы. Разница в результатах возвращается следующим образом:
И
Вернул бы тот же результат, хотя использование LIKE, как правило, занимало бы больше времени, чем его соответствие шаблону. Тем не мение,
И
Возвращал бы другие результаты, где использование «=» приводит только к результатам с возвращаемым «Chris%», а оператор LIKE возвращает все, что начинается с «Chris».
Надеюсь, это поможет. Некоторая хорошая информация может быть найдена здесь .
источник
Это копия / вставка другого моего ответа на вопрос SQL 'like' vs '=' performance :
Личный пример использования mysql 5.5: у меня было внутреннее соединение между 2 таблицами, одной из 3 миллионов строк и одной из 10 тысяч строк.
При использовании лайка в индексе, как показано ниже (без подстановочных знаков), это заняло около 30 секунд:
используя 'объяснение' я получаю:
При использовании «=» в том же запросе это заняло около 0,1 секунды:
Используя 'объяснение' я получаю:
Как видите,
like
поиск по индексу полностью отменен, поэтому запрос занял в 300 раз больше времени.источник
LIKE
и=
разные.LIKE
это то, что вы будете использовать в поисковом запросе. Это также позволяет использовать подстановочные знаки, такие как_
(простой символьный символ) и%
(многосимвольный символ).=
следует использовать, если вы хотите точные совпадения, и это будет быстрее.Этот сайт объясняет
LIKE
источник
Одно из отличий - помимо возможности использовать подстановочные знаки с LIKE - заключается в конечных пробелах: оператор = игнорирует конечный пробел, но LIKE - нет.
источник
Зависит от системы баз данных.
Обычно без специальных символов, да, = и LIKE одинаковы.
Однако некоторые системы баз данных могут по-разному относиться к настройкам сопоставления с разными операторами.
Например, в MySQL сравнения со строками = on всегда по умолчанию не чувствительны к регистру, поэтому LIKE без специальных символов одинаков. В некоторых других СУБД LIKE нечувствителен к регистру, а = нет.
источник
Для этого примера мы считаем само собой разумеющимся, что varcharcol не содержит
''
и не имеет пустой ячейки против этого столбцаПервое приводит к выводу 0 строк, а второе показывает весь список. = строго совпадает с регистром, в то время как похоже действует как фильтр. если фильтр не имеет критериев, все данные действительны.
like - в силу своего назначения работает немного медленнее и предназначен для использования с varchar и подобными данными.
источник
Если вы ищете точное совпадение, вы можете использовать оба, = и LIKE.
Использование «=» в этом случае немного быстрее (поиск точного соответствия) - вы можете проверить это самостоятельно, дважды выполнив один и тот же запрос в SQL Server Management Studio, один раз - «=», один раз - «LIKE», и затем с помощью «Запрос» / «Включить фактический план выполнения».
Выполните два запроса, и вы должны увидеть результаты дважды, а также два фактических плана выполнения. В моем случае они были разделены на 50% против 50%, но план выполнения «=» имеет меньшую «оценочную стоимость поддерева» (отображается при наведении курсора на крайнее левое поле «ВЫБОР»), но опять же, это действительно не огромная разница.
Но когда вы начнете искать с подстановочными знаками в выражении LIKE, производительность поиска снизится. Поиск "LIKE Mill%" все еще может быть довольно быстрым - SQL Server может использовать индекс для этого столбца, если он есть. Поиск «LIKE% expression%» ужасно медленный, поскольку единственный способ, которым SQL Server может удовлетворить этот поиск, - выполнить полное сканирование таблицы. Так что будьте осторожны с вашими как!
Марк
источник
Использование = позволяет избежать конфликтов символов подстановки и специальных символов в строке при построении запроса во время выполнения.
Это облегчает жизнь программиста, так как не требуется экранировать все специальные символы подстановки, которые могут появиться в предложении LIKE, и не дает ожидаемого результата. В конце концов, = 99% сценария использования, было бы больно каждый раз избегать их.
закатывает глаза в 90-х
Я также подозреваю, что это немного медленнее, но я сомневаюсь, что это важно, если в шаблоне нет подстановочных знаков.
источник
Для решения первоначального вопроса о производительности речь идет об использовании индекса . Когда происходит простое сканирование таблицы, «LIKE» и «=» идентичны . Когда задействованы индексы, это зависит от того, как сформировано предложение LIKE. Более конкретно, каково расположение подстановочных знаков?
Учтите следующее:
Может также быть незначительная разница в создании плана запроса при использовании "=" против "LIKE".
источник
Помимо подстановочных знаков, разница между
=
ANDLIKE
будет зависеть как от типа SQL-сервера, так и от типа столбца.Возьмите этот пример:
При использовании MS SQL Server 2012 конечные пробелы при сравнении будут игнорироваться, за исключением случаев,
LIKE
когда указан тип столбцаVARCHAR
.При использовании MySQL 5.5 конечные пробелы будут игнорироваться для
=
, но не дляLIKE
, как с, такCHAR
иVARCHAR
.При использовании PostgreSQL 9.1 пробелы значимы как
=
приLIKE
использованииVARCHAR
, так и при использовании , но не при использованииCHAR
(см. Документацию ).Поведение с
LIKE
также отличается сCHAR
.Использование тех же данных, что и выше, использование явного
CAST
имени столбца также имеет значение :Это только возвращает строки для "CAST обоих" и "CAST col".
источник
К ключевому слову LIKE, несомненно, прилагается «ценник эффективности». Тем не менее, если у вас есть поле ввода, которое может включать символы подстановки, которые будут использоваться в вашем запросе, я бы рекомендовал использовать LIKE, только если вход содержит один из символов подстановки. В противном случае используйте стандарт, равный для сравнения.
С уважением...
источник
На самом деле все сводится к тому, что вы хотите сделать запрос. Если вы имеете в виду точное совпадение, используйте =. Если вы имеете в виду нечеткое совпадение, используйте LIKE. Сказать, что вы имеете в виду, обычно хорошая политика с кодом.
источник
В Oracle «like» без подстановочных знаков вернет тот же результат, что и «equals», но может потребовать дополнительной обработки. По словам Тома Кайта , Oracle будет использовать «подобное» без подстановочных знаков как «равно» при использовании литералов, но не при использовании переменных связывания.
источник
=
иLIKE
не то же самое;=
соответствует точной строкеLIKE
соответствует строке, которая может содержать символы подстановки (%)источник