MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Как работи операторът LIKE в MariaDB

В MariaDB, LIKE оператор ви позволява да правите съвпадение на шаблони. Той определя дали конкретен символен низ съответства на определен модел. Връща или 1 (ВЯРНО) или 0 (НЕВЕРНО).

Моделът може да включва обикновени знаци, както и % и _ заместващи знаци.

Тези заместващи знаци са обяснени в следващата таблица.

Заместващ знак Описание
% Съвпада с всеки низ от нула или повече знака. Може да се използва като префикс или суфикс и може да се използва и в средата на низ.
_ Съвпада на всеки единичен знак.

Синтаксис

Синтаксисът е така:

expr LIKE pat [ESCAPE 'escape_char']

Пример

Да предположим, че имаме следната таблица:

SELECT * FROM Pets;

Резултат:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

Ето пример, за да демонстрирате как LIKE оператор работи.

SELECT *
FROM Pets
WHERE PetName LIKE 'F%';

Резултат:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
+-------+-----------+---------+---------+------------+

В този пример използвах LIKE оператор във връзка с % оператор за заместващ знак, за да върне домашни любимци, чието име започва с буквата F .

Чувствителност на регистрите

LIKE изпълнява съвпадения на поднизове, независимо от главните букви, ако съпоставянето за израза и шаблона не е чувствително.

Следователно можем да променим предишния пример, за да използваме малки букви f , и пак получавате същия резултат:

SELECT *
FROM Pets
WHERE PetName LIKE 'f%';

Резултат:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
+-------+-----------+---------+---------+------------+

Въпреки това, ние можем да принудим съвпадение, чувствително към главни букви, като използваме COLLATE клауза с двоично съпоставяне. Като алтернатива можете да използвате CAST() за да го принудите към двоичен низ.

Пример:

SELECT *
FROM Pets
WHERE PetName LIKE 'f%' COLLATE utf8_bin;

Резултат:

Empty set (0.000 sec)

Не се връщат резултати.

Но ако го променим на главни букви F :

SELECT *
FROM Pets
WHERE PetName LIKE 'F%' COLLATE utf8_bin;

Резултат:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
+-------+-----------+---------+---------+------------+

Получаваме три мача, както се очакваше.

Числови аргументи

Числовите аргументи са принудени към двоични низове.

SELECT * 
FROM Pets 
WHERE PetId LIKE 7;

Резултат:

+-------+-----------+---------+---------+------+
| PetId | PetTypeId | OwnerId | PetName | DOB  |
+-------+-----------+---------+---------+------+
|     7 |         3 |       2 | Bark    | NULL |
+-------+-----------+---------+---------+------+

Дати

Ето пример, който съответства на годината от дата:

SELECT * 
FROM Pets 
WHERE DOB LIKE '2020%';

Резултат:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
+-------+-----------+---------+---------+------------+

Можете също да използвате LIKE оператор срещу резултата от функции за дата, като DAYNAME() , MONTHNAME() и др.

SELECT * 
FROM Pets 
WHERE MONTHNAME(DOB) LIKE 'Nov%';

Резултат:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
+-------+-----------+---------+---------+------------+

_ Оператор за заместващи знаци

Долната черта (_ ) операторът за заместващ знак съответства на всеки единичен знак.

Пример:

SELECT *
FROM Pets
WHERE PetName LIKE '_e%';

Резултат:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

В този случай съпоставихме имена на домашни любимци, където вторият знак е e .

Характерът за бягство

Понякога може да се окажете в ситуацията, в която трябва да търсите долна черта или знак за процент. В такива случаи можете да използвате обратна наклонена черта (\ ), за да избягате от тези знаци. Това ще предотврати тяхното интерпретиране като заместващи знаци.

Да предположим, че имаме следната таблица:

SELECT * FROM Owners;

Резултат:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       1 | Homer     | Connery  | (308) 555-0100 | [email protected]  |
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
|       3 | Nancy     | Simpson  | (489) 591-0408 | NULL               |
|       4 | Boris     | Trump    | (349) 611-8908 | NULL               |
|       5 | Woody     | Eastwood | (308) 555-0112 | [email protected]  |
|       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
+---------+-----------+----------+----------------+--------------------+

Забележете, че собственик 2 (Барт) има имейл адрес, който съдържа долна черта.

Ето пример за това какво се случва, когато не избягване на долна черта:

SELECT * FROM Owners
WHERE Email LIKE 'b_%';

Резултат:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
|       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
+---------+-----------+----------+----------------+--------------------+

В този случай тя съвпада с два реда. В този случай нямаше значение какъв е вторият знак – отговаряше на който и да е характер. Фактът, че първият ред съдържа долна черта за втория знак, е просто съвпадение. Щеше да съвпадне дори и да беше нещо друго.

Но какво, ако искаме да съпоставим само тези имейл адреси, които имат действително долно черта като втори знак?

Тук идва символът за бягство.

SELECT * FROM Owners
WHERE Email LIKE 'b\_%';

Резултат:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
+---------+-----------+----------+----------------+--------------------+

Сега получаваме само един ред – редът, който съдържа долната черта като втори знак.

Промяна на изходния символ

Възможно е да промените escape символа. Можете да направите това с ESCAPE аргумент.

Пример:

SELECT * FROM Owners
WHERE Email LIKE 'b*_%' ESCAPE '*';

Резултат:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
+---------+-----------+----------+----------------+--------------------+

В този случай аз присвоих звездичката (* ) като escape-символ.

Това може да бъде особено удобно, когато трябва да използвате обратната наклонена черта за други цели, като например кодиране на специални символи. В такива случаи може да се наложи да „избягате двойно“ от тези знаци, което може да стане объркващо. Следователно промяната на escape-символа може да помогне в такива ситуации.

NULL стойности

Процентът (% ) заместващият знак съответства на всичко – почти. Едно нещо, което не съвпада, е NULL .

SELECT * FROM Owners
WHERE Email LIKE '%';

Резултат:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       1 | Homer     | Connery  | (308) 555-0100 | [email protected]  |
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
|       5 | Woody     | Eastwood | (308) 555-0112 | [email protected]  |
|       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
+---------+-----------+----------+----------------+--------------------+

В нашата таблица има два реда с NULL в Email колона, но те не се връщат тук.

Ефективност

Заявки, които съдържат LIKE операторът може да работи много по-бавно от другите заявки и вероятно трябва да избягвате използването на LIKE оператор, освен ако наистина не се нуждаете от него. Използване на % операторът като префикс може да бъде особено бавен.

Това не означава, че изобщо не трябва да го използвате. LIKE операторът е неразделна част от SQL и ще срещнете много сценарии, при които той ще бъде единствената опция (или поне най-добрата опция).

NOT LIKE Оператор

Можете също да използвате NOT LIKE за да проверите дали низ не съвпада с модел.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разширено отказване с помощта на кукички за пост/предварителен скрипт

  2. ClusterControl - Разширено управление на архивиране - mariabackup част I

  3. Изпълняване на заявки за анализ на големи данни с помощта на SQL и Presto

  4. Как работи MONTH() в MariaDB

  5. Как работи HOUR() в MariaDB