sql >> Databáze >  >> RDS >> MariaDB

Jak funguje operátor LIKE v MariaDB

V MariaDB, LIKE operátor umožňuje provádět porovnávání vzorů. Určuje, zda určitý řetězec znaků odpovídá zadanému vzoru. Vrací buď 1 (TRUE) nebo 0 (NEPRAVDIVÉ).

Vzor může obsahovat běžné znaky a také % a _ zástupné znaky.

Tyto zástupné znaky jsou vysvětleny v následující tabulce.

Zástupný znak Popis
% Odpovídá libovolnému řetězci nula nebo více znaků. Může být použit buď jako předpona, nebo jako přípona, a také může být použit uprostřed řetězce.
_ Odpovídá libovolnému jednotlivému znaku.

Syntaxe

Syntaxe vypadá takto:

expr LIKE pat [ESCAPE 'escape_char']

Příklad

Předpokládejme, že máme následující tabulku:

SELECT * FROM Pets;

Výsledek:

+-------+-----------+---------+---------+------------+
| 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       |
+-------+-----------+---------+---------+------------+

Zde je příklad, který ukazuje, jak LIKE operátor pracuje.

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

Výsledek:

+-------+-----------+---------+---------+------------+
| 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 |
+-------+-----------+---------+---------+------------+

V tomto příkladu jsem použil LIKE operátor ve spojení s % zástupný operátor pro návrat domácích mazlíčků, jejichž jméno začíná písmenem F .

Rozlišovat malá a velká písmena

LIKE provádí shody podřetězců bez rozlišení malých a velkých písmen, pokud řazení výrazu a vzoru nerozlišuje malá a velká písmena.

Proto můžeme změnit předchozí příklad tak, aby používal malé f a stále získáte stejný výsledek:

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

Výsledek:

+-------+-----------+---------+---------+------------+
| 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 |
+-------+-----------+---------+---------+------------+

Můžeme však vynutit shodu rozlišující malá a velká písmena pomocí COLLATE klauzule s binárním řazením. Případně můžete použít CAST() vynutit jej na binární řetězec.

Příklad:

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

Výsledek:

Empty set (0.000 sec)

Nejsou vráceny žádné výsledky.

Ale když to změníme na velké F :

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

Výsledek:

+-------+-----------+---------+---------+------------+
| 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 |
+-------+-----------+---------+---------+------------+

Máme tři zápasy, jak se očekávalo.

Číselné argumenty

Číselné argumenty jsou vynuceny na binární řetězce.

SELECT * 
FROM Pets 
WHERE PetId LIKE 7;

Výsledek:

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

Data

Zde je příklad, který odpovídá roku od data:

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

Výsledek:

+-------+-----------+---------+---------+------------+
| 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 |
+-------+-----------+---------+---------+------------+

Můžete také použít LIKE operátor proti výsledku funkcí data, jako je DAYNAME() , MONTHNAME() , atd.

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

Výsledek:

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

_ Operátor zástupných znaků

Podtržítko (_ ) zástupný operátor odpovídá libovolnému jednotlivému znaku.

Příklad:

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

Výsledek:

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

V tomto případě jsme porovnali jména zvířat, kde druhý znak je e .

Únikový znak

Někdy se můžete dostat do situace, kdy potřebujete hledat podtržítko nebo znak procenta. V takových případech můžete použít zpětné lomítko (\ ), abyste těmto znakům unikli. To zabrání tomu, aby byly interpretovány jako zástupné znaky.

Předpokládejme, že máme následující tabulku:

SELECT * FROM Owners;

Výsledek:

+---------+-----------+----------+----------------+--------------------+
| 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]   |
+---------+-----------+----------+----------------+--------------------+

Všimněte si, že vlastník 2 (Bart) má e-mailovou adresu, která obsahuje podtržítko.

Zde je příklad toho, co se stane, když neděláme uniknout podtržítku:

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

Výsledek:

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

V tomto případě to odpovídalo dvěma řadám. V tomto případě nezáleželo na tom, jaký byl druhý znak – odpovídala jakémukoli charakter. To, že první řádek obsahuje podtržítko u druhého znaku, je jen náhoda. Odpovídalo by to, i kdyby to bylo něco jiného.

Ale co kdybychom chtěli porovnat pouze ty e-mailové adresy, které mají skutečný podtržítko jako druhý znak?

Zde přichází na řadu úniková postava.

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

Výsledek:

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

Nyní získáme pouze jeden řádek – řádek, který obsahuje podtržítko jako druhý znak.

Změna únikového znaku

Je možné změnit únikový znak. Můžete to udělat pomocí ESCAPE argument.

Příklad:

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

Výsledek:

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

V tomto případě jsem přiřadil hvězdičku (* ) jako znak escape.

To se může hodit zejména tehdy, když potřebujete použít zpětné lomítko pro jiné účely, jako je kódování speciálních znaků. V takových případech se může stát, že budete muset těmto postavám „dvojitě uniknout“, což by mohlo být matoucí. Změna únikového znaku proto může v takových situacích pomoci.

Hodnoty NULL

Procento (% ) zástupný znak odpovídá čemukoli – téměř. Jedna věc, která se neshoduje, je NULL .

SELECT * FROM Owners
WHERE Email LIKE '%';

Výsledek:

+---------+-----------+----------+----------------+--------------------+
| 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]   |
+---------+-----------+----------+----------------+--------------------+

V naší tabulce jsou dva řádky s NULL v Email sloupec, ale ty zde nejsou vráceny.

Výkon

Dotazy, které obsahují LIKE operátor může běžet mnohem pomaleji než jiné dotazy a pravděpodobně byste se měli vyhnout použití LIKE operátora, pokud jej opravdu nepotřebujete. Pomocí % operátor jako prefix může být obzvláště pomalý.

To neznamená, že byste to neměli používat vůbec. LIKE operátor je nedílnou součástí SQL a setkáte se s mnoha scénáři, kdy to bude jediná možnost (nebo alespoň ta nejlepší).

Položka NOT LIKE Operátor

Můžete také použít NOT LIKE otestovat, zda řetězec nedělá odpovídat vzoru.


  1. Jak provést SQL dotaz bez zobrazení výsledků

  2. Zkoumání různých způsobů šifrování dat MariaDB

  3. Vyberte databázi MySQL v systému Linux pomocí příkazového řádku

  4. Jak zjistit, která verze Postgres je spuštěna