sql >> Database >  >> RDS >> MariaDB

Hoe de LIKE-operator werkt in MariaDB

In MariaDB, de LIKE operator stelt u in staat om patroonafstemming uit te voeren. Het bepaalt of een specifieke tekenreeks overeenkomt met een bepaald patroon. Het retourneert ofwel 1 (TRUE) of 0 (VALS).

Een patroon kan gewone tekens bevatten, evenals de % en _ jokertekens.

Die jokertekens worden uitgelegd in de volgende tabel.

Wildcard-teken Beschrijving
% Komt overeen met elke tekenreeks van nul of meer tekens. Het kan worden gebruikt als voorvoegsel of achtervoegsel, en het kan ook in het midden van een tekenreeks worden gebruikt.
_ Komt overeen met elk afzonderlijk teken.

Syntaxis

De syntaxis gaat als volgt:

expr LIKE pat [ESCAPE 'escape_char']

Voorbeeld

Stel dat we de volgende tabel hebben:

SELECT * FROM Pets;

Resultaat:

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

Hier is een voorbeeld om te demonstreren hoe de LIKE exploitant werkt.

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

Resultaat:

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

In dit voorbeeld heb ik de LIKE . gebruikt operator in combinatie met de % wildcard-operator om huisdieren te retourneren waarvan de naam begint met de letter F .

Hoofdlettergevoeligheid

LIKE voert hoofdletterongevoelige subtekenreeksovereenkomsten uit als de sortering voor de uitdrukking en het patroon hoofdletterongevoelig is.

Daarom kunnen we het vorige voorbeeld wijzigen om een ​​kleine letter f . te gebruiken , en krijg nog steeds hetzelfde resultaat:

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

Resultaat:

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

We kunnen echter een hoofdlettergevoelige overeenkomst forceren met behulp van de COLLATE clausule met een binaire sortering. Als alternatief kunt u CAST() . gebruiken om het te dwingen tot een binaire string.

Voorbeeld:

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

Resultaat:

Empty set (0.000 sec)

Er worden geen resultaten geretourneerd.

Maar als we het veranderen in een hoofdletter F :

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

Resultaat:

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

We krijgen drie wedstrijden, zoals verwacht.

Numerieke argumenten

Numerieke argumenten worden gedwongen tot binaire strings.

SELECT * 
FROM Pets 
WHERE PetId LIKE 7;

Resultaat:

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

Datums

Hier is een voorbeeld dat overeenkomt met het jaar vanaf een datum:

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

Resultaat:

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

Je kunt ook de LIKE . gebruiken operator tegen het resultaat van datumfuncties, zoals DAYNAME() , MONTHNAME() , enz.

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

Resultaat:

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

De _ Wildcard-operator

Het onderstrepingsteken (_ ) jokertekenoperator komt overeen met elk afzonderlijk teken.

Voorbeeld:

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

Resultaat:

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

In dit geval hebben we namen van huisdieren gevonden waarbij het tweede teken een e . is .

Het ontsnappingspersonage

Soms bevindt u zich in de situatie waarin u moet zoeken naar een onderstrepingsteken of een percentageteken. In dergelijke gevallen kunt u een backslash gebruiken (\ ) om aan deze tekens te ontsnappen. Dit voorkomt dat ze worden geïnterpreteerd als jokertekens.

Stel dat we de volgende tabel hebben:

SELECT * FROM Owners;

Resultaat:

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

Merk op dat Eigenaar 2 (Bart) een e-mailadres heeft dat een onderstrepingsteken bevat.

Hier is een voorbeeld van wat er gebeurt als we niet ontsnappen aan een onderstrepingsteken:

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

Resultaat:

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

In dit geval kwam het overeen met twee rijen. In dit geval maakte het niet uit wat het tweede teken was - het kwam overeen met elke karakter. Het feit dat de eerste rij een onderstrepingsteken voor het tweede teken bevat, is puur toeval. Zelfs als het iets anders was, zou het overeen komen.

Maar wat als we alleen die e-mailadressen wilden matchen die een echt onderstrepingsteken als tweede teken hebben?

Dat is waar het ontsnappingskarakter om de hoek komt kijken.

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

Resultaat:

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

Nu krijgen we maar één rij – de rij met het onderstrepingsteken als tweede teken.

Het Escape-teken wijzigen

Het is mogelijk om het escape-teken te wijzigen. U kunt dit doen met de ESCAPE argument.

Voorbeeld:

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

Resultaat:

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

In dit geval heb ik de asterisk (* ) als het escape-teken.

Dit kan vooral handig zijn wanneer u de backslash voor andere doeleinden moet gebruiken, zoals het coderen van speciale tekens. In dergelijke gevallen kan het zijn dat u deze tekens moet 'dubbel-ontsnappen', wat verwarrend kan worden. Het veranderen van het escape-teken kan daarom helpen in dergelijke situaties.

NULL-waarden

Het percentage (% ) wildcard komt overeen met alles - bijna. Een ding dat niet overeenkomt is NULL .

SELECT * FROM Owners
WHERE Email LIKE '%';

Resultaat:

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

In onze tabel zijn er twee rijen met NULL in de Email kolom, maar die worden hier niet geretourneerd.

Prestaties

Zoekopdrachten die de LIKE . bevatten operator kan veel langzamer lopen dan andere zoekopdrachten, en u moet waarschijnlijk het gebruik van de LIKE . vermijden operator, tenzij u het echt nodig hebt. De % . gebruiken operator als voorvoegsel kan bijzonder traag zijn.

Dat wil niet zeggen dat je het helemaal niet moet gebruiken. De LIKE operator is een integraal onderdeel van SQL en u zult veel scenario's tegenkomen waarin dit de enige optie is (of op zijn minst de beste optie).

De NOT LIKE Operator

Je kunt ook NOT LIKE . gebruiken om te testen of een string al dan niet niet overeenkomen met een patroon.


  1. Hoe Access 2019 ScreenTips te gebruiken

  2. Hoe Microsoft SQL op Linux te installeren

  3. Beheer Connection Pooling in multi-tenant web-app met Spring, Hibernate en C3P0

  4. MySQL in de cloud - Online migratie van Amazon RDS naar uw eigen server:deel2