LIKE в SQL

До сих пор мы сталкивались с условими, которые определяют точную строку, например WHERE name='Lois Lane'. Но в SQL можно использовать частичное или шаблонное сопоставление, используя оператор LIKE.

Оператор LIKE обеспечивает соответствие заданному шаблону, позволяя указывать подстановочные знаки для одного или нескольких символов. Для этого можно использовать следующие символы подстановки:

  • Знак процента (%) — соответствует любому количеству символов, даже нулю.
  • Знак подчеркивания (_) —  соответствует ровно одному символом.

Далее представлены примеры, показывающие, как использовать оператор LIKE с подстановочными символами.

Выражение Что означает Возвращаемое значение
WHERE name LIKE 'Da%'
Найти имена, начинающиеся с ‘Da’ David, Davidson
WHERE name LIKE '%th'
Найти имена, заканчивающиеся на ‘th’ Elisabeth, Smith
WHERE name LIKE '%on%'
Найти имена, содержащие ‘on’ Davidson, Toni
WHERE name LIKE 'Sa_'
Найти имена, начинающиеся с ‘Sa’, и еще одним символом после Sam
WHERE name LIKE '_oy'
Найти имена, заканчивающиеся на ‘oy’ и еще одним символом до Joy, Roy
WHERE name LIKE '_an_'
Найти имена, содержащие ‘an’ и начинающиеся и заканчивающиеся одним символом Dana, Hans
WHERE name LIKE '%ar_'
Найти имена, содержащие ‘ar’, начинающиеся с любого количества символов и заканчивающиеся одним символом Richard, Karl
WHERE name LIKE '_ar%'
Найти имена, содержащие ‘ar’, начинающиеся с одного символа и заканчивающиеся любым количеством символов Karl, Mariya

Давайте применим рассмотренное выше на практике, выполнив поиск по некоторым записям.

Рассмотрим таблицу employees в нашей базе данных со следующими записями:

+--------+------------------+------------+--------+---------+
| emp_id | emp_name         | hire_date  | salary | dept_id |
+--------+------------------+------------+--------+---------+
|      1 | Ethan Hunt       | 2001-05-01 |   5000 |       4 |
|      2 | Tony Montana     | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor     | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard     | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank     | 2008-06-24 |   5600 |    NULL |
|      6 | simons bistro    | 2009-04-01 |   6000 |       1 |
+--------+------------------+------------+--------+---------+

Допустим, теперь вам нужно найти всех сотрудников, чье имя начинается на букву S.

SELECT * FROM employees 
WHERE emp_name LIKE 'S%';

Выполнив запрос, вы получите следующий результат:

+--------+------------------+------------+--------+---------+
| emp_id | emp_name         | hire_date  | salary | dept_id |
+--------+------------------+------------+--------+---------+
|      3 | Sarah Connor     | 2005-10-18 |   8000 |       5 |
|      6 | simons bistro    | 2009-04-01 |   6000 |       1 |
+--------+------------------+------------+--------+---------+

В MySQL при сравнении недвоичных строк (CHAR, VARCHAR, TEXT) по умолчанию не учитывается регистр, а вот при сравнении двоичных строк (BINARY, VARBINARY, BLOB) — учитывается.

Это означает, что при выполнении WHERE name LIKE 'S%' вы получите все значения столбцов, которые начинаются с S или s (как вы видите, у нас есть и "Sarah", и "simons"). Однако если вы хотите сделать поиск чувствительным к регистру, используйте оператор BINARY, как показано ниже (приставочная форма WHERE BINARY emp_name ... объявлена устаревшей в MySQL 8.0.27, поэтому ставим BINARY перед сравниваемым значением):

SELECT * FROM employees 
WHERE emp_name LIKE BINARY 'S%';

Эта команда вернет только тех сотрудников, чье имя начинается с заглавной буквы S:

+--------+------------------+------------+--------+---------+
| emp_id | emp_name         | hire_date  | salary | dept_id |
+--------+------------------+------------+--------+---------+
|      3 | Sarah Connor     | 2005-10-18 |   8000 |       5 |
+--------+------------------+------------+--------+---------+

Примечание. Если вы хотите, чтобы столбец всегда обрабатывался с учетом регистра, объявите его с учетом регистра или с двоичным типом данных, чтобы избежать проблем с производительностью.

Примечание. Частичное соответствие полезно, когда вы не знаете точную форму строки, по которой вы ищете. Используйте частичное соответствие для получения нескольких строк, содержащих одинаковые строки в одном из столбцов таблицы.

Проверьте себя
1. Что означает шаблон LIKE 'S%' в WHERE emp_name LIKE 'S%'?
AИмя содержит букву S в любом месте
BИмя состоит ровно из одного символа S
CИмя заканчивается на S
DИмя начинается с S и содержит любое количество символов после
2. Какой шаблон LIKE найдёт имена ровно из трёх символов, начинающиеся с 'Sa'?
ALIKE 'Sa%'
BLIKE '_Sa'
CLIKE '%Sa%'
DLIKE 'Sa_'
3. В MySQL запрос WHERE emp_name LIKE 'S%' вернёт строки 'Sarah Connor' и 'simons bistro'. Почему?
AЭто баг MySQL
BMySQL по умолчанию выполняет поиск без учёта регистра для нечисловых строк
C% в конце шаблона игнорирует регистр первого символа
DS и s — одинаковые символы во всех СУБД
4. Какой запрос найдёт сотрудников с именем, содержащим 'on' в любом месте?
AWHERE emp_name LIKE 'on'
BWHERE emp_name LIKE '%on'
CWHERE emp_name LIKE '%on%'
DWHERE emp_name LIKE 'on%'