В чем разница между LIKE и = в SQL?

Есть ли разница между:

SELECT * FROM users WHERE username="davyjones"

и

SELECT * FROM users WHERE username LIKE "davyjones"

person aviraldg    schedule 01.10.2009    source источник
comment
возможный дубликат Equals(=) vs. LIKE   -  person Mark E. Haase    schedule 01.08.2014
comment
Здесь предстоящий вывод такой же, но если я говорю о потреблении времени, то предложение where занимает больше времени, чем предложение like, если я представляю, что этот запрос выполняется на большом наборе данных.   -  person Mukkarram Moin    schedule 05.12.2020


Ответы (13)


В соответствии со стандартом SQL разница заключается в обработке завершающих пробелов в столбцах CHAR. Пример:

create table t1 ( c10 char(10) );
insert into t1 values ('davyjones');

select * from t1 where c10 = 'davyjones';
-- yields 1 row

select * from t1 where c10 like 'davyjones';
-- yields 0 rows

Конечно, при условии, что вы запускаете это на стандартной СУБД. Кстати, это одно из основных различий между CHAR и VARCHAR.

person Milan Babuškov    schedule 01.10.2009
comment
почему второй пример дает 0 строк? Эти два состояния выглядят эквивалентно мне, учитывая ваши тестовые данные - person Mike Marshall; 01.10.2009
comment
потому что «тест» хранится как «тест» + 4 пробела. Стандарт SQL говорит, что LIKE не должен соответствовать этому, а = должен. Для столбцов VARCHAR разницы нет. - person Milan Babuškov; 01.10.2009
comment
Еще одна причина никогда не использовать тип данных char, если только у вас не всегда будет точное количество символов. - person HLGEM; 01.10.2009
comment
@HLGEM - кому нужна была еще одна причина? - person tvanfosson; 02.10.2009
comment
К каким СУБД это относится? Не имеет никакого значения в SQL Server - person Martin Smith; 02.01.2011
comment
Еще один случай, который может помочь понять одно из различий: stackoverflow.com/questions/10715609/ - person user2173353; 01.06.2016

LIKE допускает частичное совпадение/использование подстановочных знаков, а = проверяет наличие точных совпадений.

Например

SELECT * FROM test WHERE field LIKE '%oom';

Возвращает строки, в которых значение поля является одним из следующих:

Zoom, Boom, Loom, Groom
person code_burgar    schedule 01.10.2009
comment
Он не вернет эти строки, если столбец CHAR (5) вместо VARCHAR (5). - person Milan Babuškov; 01.10.2009
comment
@codeburger: у MySQL есть годы, прежде чем он приблизится к стандарту SQL;) - person Milan Babuškov; 02.10.2009
comment
@MilanBabuškov Все еще приятно это говорить, MySQL - бесплатная хорошая СУБД для небольших проектов! - person Kil jeaden; 14.12.2019

В этом случае нет никакой разницы в результатах. Однако для сравнения используется другой метод, и "LIKE" будет намного медленнее.

Ознакомьтесь с примерами LIKE : http://www.techonthenet.com/sql/like.php

В этом случае вы все равно хотите использовать equals.

Обновление. Обратите внимание, что существует принципиальное различие, когда речь идет о столбцах типа CHAR, в которых результаты будут отличаться. Подробнее см. в этом ответе. При использовании VARCHAR (предположительно, норма) вышеперечисленное эквивалентно, и предпочтительным является равенство.

person Erich    schedule 01.10.2009
comment
Потенциально в хранимой процедуре, однако при тестировании в SQL Server с помощью динамического SQL я заметил, что это не оптимизирует это. Я также провел тест на Oracle, и, похоже, он не оптимизирует динамический SQL. - person Erich; 01.10.2009
comment
Я нахожу удивительным, как неправильные ответы часто принимаются на SO. :( - person Milan Babuškov; 01.10.2009
comment
Каким образом вы бы сказали, что мой ответ неверен? В этой ситуации LIKE и '=' имеют одинаковую функциональность. Он действительно имеет в виду '=' и, следовательно, должен. Я также указал на немного документации о том, как следует использовать LIKE... Почти уверен, что ответил на вопрос так же, как и все остальные. - person Erich; 01.10.2009
comment
Смотрите мой ответ ниже и читайте спецификации SQL. Существует важное отличие, если вы используете столбцы CHAR. - person Milan Babuškov; 01.10.2009
comment
Ах, я знал об этой разнице, однако я не сталкивался с этим какое-то время. Я сделал предположение, что он использовал VARCHAR, поскольку я (и моя компания) обычно использую его каждый раз, когда данные не имеют фиксированной длины. - person Erich; 01.10.2009

LIKE позволяет использовать подстановочные знаки, такие как % (здесь любое количество символов) и _ (здесь один символ).

SELECT * FROM users WHERE username LIKE 'joe%'

Выбирает все имена пользователей, начинающиеся с joe.

person T.J. Crowder    schedule 01.10.2009

create table A (id int,name varchar(30))

insert into A values(4,'subhash')

Используйте конечный пробел для поиска в поле имени:

select * from A where name='Subhash '
--Yields 1 row
select * from A where name like 'Subhash '
--Yields 0 row
person subhash    schedule 17.06.2011

LIKE ищет шаблон.

/* Returns all users whose username starts with "d" */
SELECT * FROM users WHERE username LIKE 'd%'

/* Returns all users whose username contains "dav" */
SELECT * FROM users WHERE username LIKE '%dav%'
person Larsenal    schedule 01.10.2009

Это даст вам тот же результат. Однако LIKE допускает подстановочные знаки, например...

SELECT * FROM users WHERE username LIKE 'davy%'

Единственной проблемой синтаксиса были двойные кавычки вместо одинарных.

person Richard    schedule 01.10.2009

LIKE поддерживает подстановочные знаки. Обычно в качестве подстановочного знака используется символ % или _.

Использование оператора LIKE без подстановочных знаков аналогично использованию оператора =.

person auujay    schedule 01.10.2009

Условие LIKE позволяет использовать подстановочные знаки:

SELECT * FROM suppliers
WHERE supplier_name like 'Hew%';

Дополнительные примеры.

и Equals = используется для сопоставления на равенство.

person Daniel May    schedule 01.10.2009

Like — это оператор сопоставления с образцом, а = — оператор точного сопоставления. т. е. где имя типа W% означает начало с W и после этого один или несколько символов и = т.е. где имя ='James' это точное совпадение

person P Sharma    schedule 29.11.2009

Равно '=' просто для равенства. С другой стороны, LIKE поддерживает сопоставление подстановочных знаков SQL.

Таким образом, с помощью LIKE вы можете выполнить name like '%jones', чтобы получить все имена, оканчивающиеся на jones. При использовании LIKE символ процента '%' может быть любым, длина которого равна нулю или больше, а символ подчеркивания '_' представляет собой любой одиночный символ.

person Jeremy Bourque    schedule 01.10.2009

Насколько я знаю, нет никакой разницы, кроме затрат времени на два выбора, которые вы написали. Обычно используется LIKE вместе с %, что означает «любая строка». Я думаю, что есть также символ, который можно использовать с LIKE для «любого символа», не знаю, что это такое, не погуглив.

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

person laura    schedule 01.10.2009

Like заставляет вас работать с операторами подстановочных знаков, вы можете использовать его в своем случае для like 'davyjon%', чтобы получить все результаты, начинающиеся с davyjon, и чтобы получить точное значение, вы можете поместить 'davyjones', и вы также можете использовать = в этом случае

person SQL Like    schedule 29.11.2009