MySQL - 正規表現
こんにちは、データベースの愛好家を目指す皆さん!今日は、MySQLの正規表現の fascinante な世界に飛び込みます。以前にコードを書いたことがないとしても心配しないでください - 基礎から始めて少しずつ進んでいきます。このチュートリアルの終わりまでに、プロのように正規表現を使えるようになるでしょう!
正規表現とは?
MySQLの specificsに飛び込む前に、まず正規表現(regex)とは何かを理解しましょう。文本の山の中から特定のパターンを見つけるのに苦労しているとします。その時、regexが便利です!文字列の中に複雑なパターンを見つけることができる supercharged の検索ツールです。
MySQLの正規表現
MySQLでは、正規表現を扱うために REGEXP
オペレータを使用します。LIKE
オペレータに似ていますが、はるかに強力です。
基本的な構文
以下は基本的な構文です:
SELECT column_name(s)
FROM table_name
WHERE column_name REGEXP 'pattern';
以下にいくつかの例を見てみましょう:
SELECT * FROM employees WHERE last_name REGEXP 'son';
このクエリは、苗字に 'son' を含むすべての従業員を見つけます。例えば、Johnson、Wilson、またはSonnyなどです。
大文字と小文字の区別
デフォルトでは、MySQLの正規表現は大文字と小文字を区別しません。大文字と小文字を区別して一致させたい場合は、BINARY
キーワードを使用します:
SELECT * FROM employees WHERE last_name REGEXP BINARY 'Smith';
これは 'Smith' に一致しますが、'smith' や 'SMITH' には一致しません。
REGEXPで使用されるパターン
では、REGEXPで使用される一般的なパターンを見てみましょう。これらは regexの "secret code" と考えてください - これらを知ると、ほぼ何でも見つけることができます!
^ (キャレット) - 文字列の開始
キャレット記号は、文字列の開始位置でパターンに一致します。
SELECT * FROM products WHERE product_name REGEXP '^Apple';
これは 'Apple' で始まるすべての製品名を見つけます。例えば 'Apple iPhone' や 'Apple MacBook' などです。
$ (ドル記号) - 文字列の終了
ドル記号は、文字列の終了位置でパターンに一致します。
SELECT * FROM products WHERE product_name REGEXP 'Pro$';
これは 'Pro' で終わる製品を見つけます。例えば 'MacBook Pro' や 'iPad Pro' などです。
. (ドット) - 任意の单一文字
ドットは、改行を除く任意の单一文字に一致します。
SELECT * FROM words WHERE word REGEXP 'c.t';
これは 'cat'、'cut'、または 'c@t' などの単語に一致します!
* (アスタリスク) - 前の文字の0回以上の wystąpienia
アスタリスクは、前の文字の0回以上の wystąpieniaに一致します。
SELECT * FROM emails WHERE email REGEXP 'info.*@example.com';
これは '[email protected]'、'[email protected]'、または '[email protected]' などのメールアドレスに一致します。
+ (プラス) - 前の文字の1回以上の wystąpienia
*と似ていますが、少なくとも1回の wystąpieniaが必要です。
SELECT * FROM products WHERE product_name REGEXP 'iPad ?Pro+';
これは 'iPad Pro'、'iPad Pro'、'iPad Pro' などに一致します。
? (クエスチョンマーク) - 前の文字の0回または1回の wystąpienia
クエスチョンマークは、前の文字をオプションにします。
SELECT * FROM words WHERE word REGEXP 'colou?r';
これは 'color' と 'colour' の両方に一致します。
[] (角括弧) - 文字集合
角括弧は、一致するための文字集合を定義します。
SELECT * FROM employees WHERE last_name REGEXP '[AEIOU]';
これは、任意の母音を含む苗字を見つけます。
[^] (否定された文字集合)
角括弧の中にキャレットを追加すると、集合を否定します。
SELECT * FROM products WHERE product_name REGEXP '[^0-9]';
これは、数字を含まない製品名を見つけます。
| (パイプ) - 結合
パイプ記号は、ORオペレータとして動作します。
SELECT * FROM animals WHERE species REGEXP 'cat|dog';
これは、動物テーブル内のすべての猫と犬を見つけます。
正規表現関数とオペレータ
MySQLは、正規表現を扱うためのいくつかの関数とオペレータを提供しています。見てみましょう:
関数/オペレータ | 説明 |
---|---|
REGEXP | 文字列を正規表現に対して一致させます |
REGEXP_LIKE() | 文字列が正規表現パターンに一致する場合1を返し、しない場合0を返します |
REGEXP_INSTR() | 最初の正規表現一致の開始インデックスを返します |
REGEXP_REPLACE() | 正規表現パターンに一致する部分を置き換えます |
REGEXP_SUBSTR() | 正規表現パターンに一致する部分文字列を返します |
いくつかの例を見てみましょう:
REGEXP_LIKE()
SELECT * FROM products WHERE REGEXP_LIKE(product_name, '^iPhone');
これは 'iPhone' で始まるすべての製品を見つけます。
REGEXP_INSTR()
SELECT email, REGEXP_INSTR(email, '@') AS at_position
FROM users;
これは、各メールアドレスの '@'記号の位置を返します。
REGEXP_REPLACE()
SELECT REGEXP_REPLACE('Hello, World!', '[aeiou]', '*') AS vowels_replaced;
これは、すべての母音をアスタリスクに置き換え、'Hll, W*rld!'を返します。
REGEXP_SUBSTR()
SELECT REGEXP_SUBSTR('[email protected]', '[^@]+') AS username;
これは、メールアドレスのユーザー名部分を抽出します。
結論
おめでとうございます!MySQLの正規表現の強力な世界への第一歩を踏み出しました。practice makes perfect を忘れないでください。自分で正規表現パターンを作成し、さまざまな組み合わせで実験してみてください。
あなたがこの旅を続ける中で、regexはデータベースツールキットの中のスイスアーミーナイフのように感じられるでしょう。初めは少し難しいように思えるかもしれませんが、一度慣れると、これ無しではどうにもならないと感じることでしょう!
ハッピーコーディングを、そしてあなたのクエリがいつも望む結果を返すことを祈っています!
Credits: Image by storyset