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

Jak NOT LIKE funguje v MariaDB

V MariaDB, NOT LIKE Operátor se používá k testování, zda řetězec nedělá odpovídat vzoru. Vrací inverzní hodnotu k LIKE operátor. Je to stejné jako použití NOT operátor proti celému LIKE výraz.

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 NOT 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 použití NOT LIKE proti této tabulce:

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

Výsledek:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

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

Toto je opačný soubor výsledků, jaký bychom dostali, kdybychom použili pouze LIKE . V takovém případě bychom získali pouze výsledky, kde jméno zvířete začíná písmenem F .

Rozlišovat malá a velká písmena

NOT 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 NOT LIKE 'f%';

Výsledek:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

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

Tentokrát byl vrácen celý stůl. Je to proto, že nic neodpovídalo malým písmenům f .

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

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

Výsledek:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
|     7 |         3 |       2 | Bark    | NULL       |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

Máme za sebou pět zápasů, jak se očekávalo. Řádky, kde jméno mazlíčka začíná F jsou vyloučeny.

Číselné argumenty

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

SELECT * 
FROM Pets 
WHERE PetId NOT LIKE 1;

Výsledek:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     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       |
+-------+-----------+---------+---------+------------+

Data

Zde je příklad data:

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

Výsledek:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
+-------+-----------+---------+---------+------------+

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

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

Výsledek:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     3 |         2 |       2 | Scratch | 2018-10-01 |
|     4 |         3 |       3 | Wag     | 2020-03-15 |
|     6 |         3 |       4 | Fluffy  | 2020-09-17 |
+-------+-----------+---------+---------+------------+

_ 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 NOT LIKE '_e%';

Výsledek:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     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       |
+-------+-----------+---------+---------+------------+

V tomto případě jsme vrátili jména zvířat, kde druhý znak není 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 NOT LIKE 'b_%';

Výsledek:

+---------+-----------+----------+----------------+-------------------+
| OwnerId | FirstName | LastName | Phone          | Email             |
+---------+-----------+----------+----------------+-------------------+
|       1 | Homer     | Connery  | (308) 555-0100 | [email protected] |
|       5 | Woody     | Eastwood | (308) 555-0112 | [email protected] |
+---------+-----------+----------+----------------+-------------------+

V tomto případě to vrátilo jen dva řádky. Vyloučil dva řádky, kde e-mailová adresa začíná b , a za ním následuje jeden další znak a poté libovolný počet znaků. Vyloučil také řádky s null e-mailovou adresu.

Protože jsme však neunikli podtržítku, nezáleželo na tom, jaký byl druhý znak – odpovídalo 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 NOT LIKE 'b\_%';

Výsledek:

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

Vidíme, že Burt byl přidán do výsledků.

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 NOT LIKE 'b*_%' ESCAPE '*';

Výsledek:

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

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

To může být užitečné, 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.


  1. získání ID více řádků vložených do psycopg2

  2. mysqli::query():Nelze načíst mysqli

  3. Jak mohu připojit více tabulek SQL pomocí ID?

  4. Oracle odstranění řádků z více tabulek