3.3.4.7 Potrivire de tipare
MySQL oferă potrivire de tipare SQL standard, precum și o formă de potrivire de tipare bazată pe expresii regulate extinse, similare cu cele utilizate de utilitarele Unix, cum ar fi vi, grep și sed.
Potrivirea tiparelor SQL vă permite să utilizați _
pentru a potrivi orice caracter unic și %
pentru a potrivi un număr arbitrar de caractere (inclusiv caractere zero). În MySQL, în mod implicit, tiparele SQL nu țin cont de majuscule și minuscule. Câteva exemple sunt prezentate aici. Nu folosiți =
sau <>
atunci când utilizați modele SQL. Utilizați în schimb operatorii de comparație LIKE
sau NOT LIKE
.
Pentru a găsi nume care încep cu b
:
mysql> SELECT * FROM pet WHERE name LIKE 'b%';+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+
Pentru a găsi nume care se termină cu fy
:
mysql> SELECT * FROM pet WHERE name LIKE '%fy';+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
Pentru a găsi nume care conțin un w
:
mysql> SELECT * FROM pet WHERE name LIKE '%w%';+----------+-------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+-------+---------+------+------------+------------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+----------+-------+---------+------+------------+------------+
Pentru a găsi nume care conțin exact cinci caractere, utilizați cinci exemple ale caracterului model _
:
mysql> SELECT * FROM pet WHERE name LIKE '_____';+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
Celălalt tip de potrivire a tiparelor oferit de MySQL utilizează expresii regulate extinse. Atunci când testați o potrivire pentru acest tip de model, utilizați funcția REGEXP_LIKE()
(sau operatorii REGEXP
sau RLIKE
, care sunt sinonime pentru REGEXP_LIKE()
).
Lista următoare descrie unele caracteristici ale expresiilor regulate extinse:
-
.
se potrivește cu orice caracter unic. -
O clasă de caractere
se potrivește cu orice caracter din interiorul parantezelor. De exemplu,
se potrivește cu
a
,b
sauc
. Pentru a denumi un interval de caractere, utilizați o liniuță.se potrivește cu orice literă, în timp ce
se potrivește cu orice cifră.
-
*
se potrivește cu zero sau mai multe cazuri ale lucrului care îl precede. De exemplu,x*
se potrivește cu orice număr de caracterex
,*
se potrivește cu orice număr de cifre, iar.*
se potrivește cu orice număr de orice. -
O potrivire a unui model de expresie regulată reușește dacă modelul se potrivește oriunde în valoarea testată. (Acest lucru diferă de o potrivire de tip
LIKE
, care reușește numai dacă modelul se potrivește cu întreaga valoare). -
Pentru a ancora un model astfel încât să se potrivească la începutul sau la sfârșitul valorii testate, utilizați
^
la începutul sau$
la sfârșitul modelului.
Pentru a demonstra modul în care funcționează expresiile regulate extinse, interogările LIKE
prezentate anterior sunt rescrise aici pentru a utiliza REGEXP_LIKE()
.
Pentru a găsi nume care încep cu b
, utilizați ^
pentru a potrivi începutul numelui:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+
Pentru a forța o comparație a unei expresii regulate să facă distincție între majuscule și minuscule, utilizați o colaționare care să facă distincție între majuscule și minuscule, sau utilizați cuvântul cheie BINARY
pentru a face din unul dintre șiruri un șir binar, sau specificați caracterul de control al potrivirii c
. Fiecare dintre aceste interogări se potrivește numai cu b
minusculă la începutul unui nume:
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');
Pentru a găsi nume care se termină cu fy
, utilizați $
pentru a se potrivi cu sfârșitul numelui:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+
Pentru a găsi nume care conțin un w
, utilizați această interogare:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');+----------+-------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+-------+---------+------+------------+------------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |+----------+-------+---------+------+------------+------------+
Deoarece un model de expresie regulată se potrivește dacă apare oriunde în valoare, nu este necesar ca în interogarea anterioară să se pună un joker de o parte și de alta a modelului pentru ca acesta să se potrivească cu întreaga valoare, așa cum ar fi cazul cu un model SQL.
Pentru a găsi nume care conțin exact cinci caractere, utilizați ^
și $
pentru a se potrivi cu începutul și sfârșitul numelui și cu cinci cazuri de .
între ele:
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
Ați putea, de asemenea, să scrieți interogarea anterioară folosind operatorul {
(„repeat-n
}n
-times”):
mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');+-------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+-------+--------+---------+------+------------+-------+| Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+-------+--------+---------+------+------------+-------+
Pentru mai multe informații despre sintaxa expresiilor regulate, consultați Secțiunea 12.8.2, „Expresii regulate”.