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
, как показано ниже:
SELECT * FROM employees
WHERE BINARY emp_name LIKE 'S%';
Эта команда вернет только тех сотрудников, чье имя начинается с заглавной буквы S:
+--------+------------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+------------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | +--------+------------------+------------+--------+---------+
Примечание. Если вы хотите, чтобы столбец всегда обрабатывался с учетом регистра, объявите его с учетом регистра или с двоичной системой счисления, чтобы избежать проблем с производительностью.
Примечание. Частичное соответствие полезно, когда вы не знаете точную форму строки, по которой вы ищете. Используйте частичное соответствие для получения нескольких строк, содержащих одинаковые строки в одном из столбцов таблицы.