3.3.4.7 Mintaillesztés
A MySQL szabványos SQL-mintaillesztést, valamint egy olyan kiterjesztett reguláris kifejezéseken alapuló mintaillesztést biztosít, amelyet a Unix segédprogramok, például a vi, grep és sed használnak.
Az SQL mintaillesztés lehetővé teszi, hogy a _
segítségével bármely egyetlen karakterrel, a %
segítségével pedig tetszőleges számú karakterrel (beleértve a nulla karaktereket is) egyezzen meg. A MySQL-ben az SQL-minták alapértelmezés szerint nem érzékenyek a nagy- és kisbetűkre. Néhány példa itt látható. Ne használjon =
vagy <>
karaktert, amikor SQL-mintákat használ. Használja helyette a LIKE
vagy NOT LIKE
összehasonlító operátorokat.
A b
kezdetű nevek kereséséhez:
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 |+--------+--------+---------+------+------------+------------+
fy
végződésű nevek kereséséhez:
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 |+--------+--------+---------+------+------------+-------+
w
-t tartalmazó nevek kereséséhez:
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 |+----------+-------+---------+------+------------+------------+
Pontosan öt karaktert tartalmazó nevek kereséséhez használja a _
mintakarakter öt példányát:
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 |+-------+--------+---------+------+------------+-------+
A MySQL által biztosított másik típusú mintaillesztés a kiterjesztett reguláris kifejezéseket használja. Az ilyen típusú minták egyezésének vizsgálatakor használja a REGEXP_LIKE()
függvényt (vagy a REGEXP
vagy RLIKE
operátorokat, amelyek a REGEXP_LIKE()
szinonimái).
A következő lista a kiterjesztett reguláris kifejezések néhány jellemzőjét írja le:
-
.
bármely egyetlen karakterrel megegyezik. -
A
karakterosztály bármely, zárójelben lévő karakterre illeszkedik. Például a
megfelel a
a
,b
vagyc
karaktereknek. Karaktertartományok megnevezéséhez használjon kötőjelet. Abármely betűre, míg a
bármely számjegyre illik.
-
*
megfelel az előtte lévő dolog nulla vagy több példányának. Például ax*
ax
karakterek tetszőleges számával, a*
a számjegyek tetszőleges számával, a.*
pedig a bárminek tetszőleges számával egyezik meg. -
A reguláris kifejezés mintaillesztése akkor sikeres, ha a minta a vizsgált értékben bárhol egyezik. (Ez eltér a
LIKE
mintaillesztéstől, amely csak akkor jár sikerrel, ha a minta a teljes értékre illik). -
Egy minta lehorgonyzásához, hogy annak a vizsgált érték elejére vagy végére kell illeszkednie, használjon
^
-t a minta elején vagy$
-t a minta végén.
A kiterjesztett reguláris kifejezések működésének bemutatásához a korábban bemutatott LIKE
lekérdezéseket itt átírjuk a REGEXP_LIKE()
használatára.
A b
kezdetű nevek megtalálásához használja a ^
szót a név elejére:
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 |+--------+--------+---------+------+------------+------------+
Ha a reguláris kifejezések összehasonlítását eset-érzékenységre akarja kényszeríteni, használjon eset-érzékeny összevetést, vagy használja a BINARY
kulcsszót, hogy az egyik karakterláncot bináris karakterlánccá tegye, vagy adja meg a c
egyezésvezérlő karaktert. Ezen lekérdezések mindegyike csak a név elején lévő b
kisbetűs karakterekre illeszkedik: fy-val végződő nevek megtalálásához használja a $
-t a név végére való illesztéshez:
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 |+--------+--------+---------+------+------------+-------+
Ha w
-t tartalmazó neveket szeretne találni, használja ezt a lekérdezést:
Pontosan öt karaktert tartalmazó nevek kereséséhez használja a ^
és $
karaktereket a név elejére és végére, valamint a .
öt példányát a kettő között:
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 |+-------+--------+---------+------+------------+-------+
Az előző lekérdezést a {
(“repeat-n
}n
-times”) operátorral is megírhatja:
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 |+-------+--------+---------+------+------------+-------+
A reguláris kifejezések szintaxisáról bővebben lásd a 12.8.2. szakasz “Reguláris kifejezések” című fejezetét.