MySQL ermöglicht einen Mustervergleich sowohl nach SQL-Standard als auch basierend auf erweiterten regulären Ausdrücken, wie man es von Unix-Hilfsprogrammen wie vi, grep und sed her kennt.
Beim SQL-Mustervergleich können Sie
‘_
’ für eine Übereinstimmung
mit einzelnen Zeichen sowie ‘%
’
für eine Übereinstimmung mit einer beliebigen Anzahl von
Zeichen (einschließlich 0 Zeichen) verwenden. In MySQL wird
bei SQL-Mustern standardmäßig keine Unterscheidung der
Groß-/Kleinschreibung vorgenommen. Einige Beispiele sind hier
aufgeführt. Achten Sie darauf, in Verbindung mit SQL-Mustern
nicht =
oder <>
zu
verwenden, sondern die Vergleichsoperatoren
LIKE
bzw. NOT LIKE
.
Namen, die mit ‘b
’ beginnen,
finden Sie so:
mysql> SELECT * FROM haustier WHERE name LIKE 'b%';
+--------+----------+---------+------------+------------+------------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+--------+----------+---------+------------+------------+------------+
| Buffy | Harold | Hund | w | 1989-05-13 | NULL |
| Bowser | Diane | Hund | m | 1989-08-31 | 1995-07-29 |
+--------+----------+---------+------------+------------+------------+
Namen, die auf ‘fy
’ enden,
finden Sie so:
mysql> SELECT * FROM haustier WHERE name LIKE '%fy';
+--------+----------+---------+------------+------------+----------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+--------+----------+---------+------------+------------+----------+
| Fluffy | Harold | Katze | w | 1993-02-04 | NULL |
| Buffy | Harold | Hund | w | 1989-05-13 | NULL |
+--------+----------+---------+------------+------------+----------+
Und Namen, die ‘w
’ enthalten,
finden Sie so:
mysql> SELECT * FROM haustier WHERE name LIKE '%w%';
+----------+----------+---------+------------+------------+------------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+----------+----------+---------+------------+------------+------------+
| Claws | Gwen | Katze | m | 1994-03-17 | NULL |
| Bowser | Diane | Hund | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | Vogel | NULL | 1997-12-09 | NULL |
+----------+----------+---------+------------+------------+------------+
Um Namen zu ermitteln, die aus genau fünf Zeichen bestehen,
verwenden Sie fünf Instanzen des Musterzeichens
‘_
’:
mysql> SELECT * FROM haustier WHERE name LIKE '_____';
+-------+----------+---------+------------+------------+----------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+-------+----------+---------+------------+------------+----------+
| Claws | Gwen | Katze | m | 1994-03-17 | NULL |
| Buffy | Harold | Hund | w | 1989-05-13 | NULL |
+-------+----------+---------+------------+------------+----------+
Der andere von MySQL unterstützte Mustervergleichstyp nutzt
erweiterte reguläre Ausdrücke. Wenn Sie bei diesem Mustertyp
auf Übereinstimmung testen, verwenden Sie die Operatoren
REGEXP
und NOT REGEXP
(bzw. deren Synonyme RLIKE
und NOT
RLIKE
).
Erweiterte reguläre Ausdrücke weisen u. a. die folgenden Merkmale auf:
‘.
’ stimmt mit genau einem
beliebigen Zeichen überein.
Eine Zeichenklasse ‘[...]
’
führt zur Übereinstimmung bei jedem Zeichen in den
Klammern. Beispielsweise liegt bei
‘[abc]
’ eine
Übereinstimmung mit ‘a
’,
‘b
’ oder
‘c
’ vor. Um einen
Zeichenbereich anzugeben, verwenden Sie einen Bindestrich.
‘[a-z]
’ führt zur
Übereinstimmung mit einem beliebigen Buchstaben,
wohingegen ‘[0-9]
’ einer
Übereinstimmung mit jeder Ziffer entspricht.
‘*
’ stimmt mit null oder
mehr Instanzen des Elements überein, das ihm vorangeht.
Beispielsweise liegt bei
‘x*
’ eine Übereinstimmung
mit einer beliebigen Anzahl von
‘x
’-Zeichen vor. Gleiches
gilt bei ‘[0-9]*
’ für eine
beliebige Anzahl von Ziffern und bei
‘.*
’ für eine beliebige
Anzahl eines beliebigen Elements.
Ein REGEXP
-Mustervergleich ist
erfolgreich, wenn eine Übereinstimmung des Musters an
beliebiger Stelle im getesteten Wert vorliegt. (Hier liegt
ein Unterschied zum
LIKE
-Mustervergleich, der nur
erfolgreich ist, wenn das Muster mit dem gesamten Wert
übereinstimmt.)
Um einen Anker im Muster zu setzen, sodass es mit dem
Anfang oder Ende des getesteten Wertes übereinstimmen
muss, verwenden Sie ‘^
’ am
Anfang bzw. ‘$
’ am Ende des
Musters.
Um zu demonstrieren, wie erweiterte reguläre Ausdrücke
funktionieren, haben wir die oben gezeigten
LIKE
-Abfragen so umgeschrieben, dass sie
REGEXP
verwenden.
Um Namen zu finden, die mit ‘b
’
beginnen, verwenden Sie ‘^
’
für eine Übereinstimmung mit dem Namensanfang:
mysql> SELECT * FROM haustier WHERE name REGEXP '^b';
+--------+----------+---------+------------+------------+------------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+--------+----------+---------+------------+------------+------------+
| Buffy | Harold | Hund | w | 1989-05-13 | NULL |
| Bowser | Diane | Hund | m | 1989-08-31 | 1995-07-29 |
+--------+----------+---------+------------+------------+------------+
Wenn Sie einen REGEXP
-Vergleich mit
Unterscheidung der Groß-/Kleinschreibung wirklich erzwingen
wollen, verwenden Sie das Schlüsselwort
BINARY
, um aus einem der Strings einen
Binär-String zu machen. Bei folgender Abfrage liegt eine
Übereinstimmung nur bei einem kleinen
‘b
’ am Anfang des Namens vor:
mysql> SELECT * FROM haustier WHERE name REGEXP BINARY '^b';
Um Namen zu finden, die auf
‘fy
’ enden, verwenden Sie
‘$
’ für eine Übereinstimmung
mit dem Namensende:
mysql> SELECT * FROM haustier WHERE name REGEXP 'fy$';
+--------+----------+---------+------------+------------+----------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+--------+----------+---------+------------+------------+----------+
| Fluffy | Harold | Katze | w | 1993-02-04 | NULL |
| Buffy | Harold | Hund | w | 1989-05-13 | NULL |
+--------+----------+---------+------------+------------+----------+
Namen schließlich, die ‘w
’
enthalten, finden Sie mit folgender Abfrage:
mysql> SELECT * FROM haustier WHERE name REGEXP 'w';
+----------+----------+---------+------------+------------+------------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+----------+----------+---------+------------+------------+------------+
| Claws | Gwen | Katze | m | 1994-03-17 | NULL |
| Bowser | Diane | Hund | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | Vogel | NULL | 1997-12-09 | NULL |
+----------+----------+---------+------------+------------+------------+
Da ein auf einem regulären Ausdruck basierendes Muster eine Übereinstimmung liefert, wenn es an beliebiger Stelle im Wert auftaucht, ist es in dieser Abfrage nicht notwendig, ein Jokerzeichen an den beiden Seiten des Musters zu setzen (bei einem SQL-Muster wäre dies hingegen erforderlich, um eine Übereinstimmung zu erzielen).
Um Namen zu ermitteln, die aus genau fünf Zeichen bestehen,
verwenden Sie ‘^
’ und
‘$
’ für Übereinstimmungen
für Anfang und Ende des Namens und fünf Instanzen von
‘.
’ dazwischen:
mysql> SELECT * FROM haustier WHERE name REGEXP '^.....$';
+-------+----------+---------+------------+------------+----------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+-------+----------+---------+------------+------------+----------+
| Claws | Gwen | Katze | m | 1994-03-17 | NULL |
| Buffy | Harold | Hund | w | 1989-05-13 | NULL |
+-------+----------+---------+------------+------------+----------+
Sie könnten diese Abfrage auch mithilfe des Operators
{
(„n
}n
-mal wiederholen“)
schreiben:
mysql> SELECT * FROM haustier WHERE name REGEXP '^.{5}$';
+-------+----------+---------+------------+------------+----------+
| name | besitzer | gattung | geschlecht | geburtstag | todestag |
+-------+----------+---------+------------+------------+----------+
| Claws | Gwen | Katze | m | 1994-03-17 | NULL |
| Buffy | Harold | Hund | w | 1989-05-13 | NULL |
+-------+----------+---------+------------+------------+----------+
In Anhang G, Beschreibung der MySQL-Syntax für reguläre Ausdrücke, finden Sie weitere Informationen zur Syntax regulärer Ausdrücke.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.