MySQL ワイルドカード: Like、NOT Like、Escape、( % )、( _ )
⚡ スマートサマリー
MySQL ワイルドカードは、LIKE演算子とNOT LIKE演算子に特殊文字を組み合わせることで、パターンベースの検索を可能にします。この記事では、パーセンテージとアンダースコアのワイルドカード、ESCAPEキーワード、myflixdbデータベースに対する実用的なクエリ、およびパフォーマンスに関する考慮事項について説明します。

何ですか MySQL ワイルドカード?
MySQL ワイルドカード ワイルドカードは、正確な値ではなく複雑なパターンに一致するデータを検索する際に役立つ特殊文字です。ワイルドカードは常に、LIKE比較演算子またはNOT LIKE比較演算子と組み合わせて使用されます。
MySQL 2つのワイルドカード文字をサポートしており、それぞれがデータに関する異なる質問に答えます。
| ワイルドカード | 意味 | 例となるパターン | マッチ |
|---|---|---|---|
| % | 0文字以上 | '%コード%' | Code 名前 ブラック、ダヴィンチ Code |
| _ | ちょうど1文字 | '200_' | 2005、2008 |
さて、この2つの文字が定義されたので、次のセクションでは、なぜそれらを学ぶ価値があるのかを説明します。
ワイルドカードを使用する理由 MySQL?
SQLに精通している方なら、SELECT文とWHERE句を使えば複雑なデータでも検索できるとお考えかもしれません。では、なぜワイルドカードを使う必要があるのでしょうか?
その質問に答える前に、例を見てみましょう。Myflixビデオライブラリのマーケティング部門がテキサス市でプロモーションを実施し、テキサスから登録した会員数に関するフィードバックを得たいとします。必要な情報を取得するには、次のSELECT文とWHERE句を使用できます。
SELECT * FROM members WHERE postal_address = 'Austin, TX' OR postal_address = 'Dallas, TX' OR postal_address = 'Iola, TX' OR postal_address = 'Houston, TX';
上記のクエリからわかるように、「WHERE句」は長くて扱いにくいものになります。新しい都市を追加するたびに手動で追加する必要があり、スペルミスのある住所が1つでもあれば、黙って除外されてしまいます。ワイルドカードを使用すると、単一のパターンで州内のすべての都市をカバーできるため、クエリが簡素化されます。
SELECT * FROM members WHERE postal_address LIKE '%TX';
つまり、ワイルドカードを使うことで、SQLの記述量を大幅に減らしながら、データ駆動型アプリケーションに強力な検索機能を組み込むことができます。次のセクションでは、各ワイルドカード文字について順に解説します。
の種類 MySQL ワイルドカード
% – パーセンテージのワイルドカード
パーセント記号(%)は、 0 個以上の文字基本的な構文は次のとおりです。
SELECT * FROM table_name WHERE fieldname LIKE 'xxx%';
ここ:
- SELECTステートメント」は標準的なSQL SELECTコマンドです。
- 「WHERE」は、フィルターを適用するために使用されるキーワードです。
- 「LIKE」は、ワイルドカードと組み合わせて使用される比較演算子です。
- 「xxx」は、1文字またはそれ以上の任意の指定パターンを表し、「%」は0から始まる任意の数の文字に一致します。
上記の説明を十分に理解するために、具体的な例を見てみましょう。タイトルに「code」という単語が含まれる映画をすべて取得したいとします。「code」という単語の両側にパーセンテージのワイルドカードを使用することで、タイトル内の任意の場所でパターンマッチングを実行できます。
SELECT * FROM movies WHERE title LIKE '%code%';
上記のスクリプトを実行すると、 MySQL ワークベンチ myflixdbデータベースに対して行った結果は以下のとおりです。
| 映画ID | タイトル | ディレクター | リリース年 | カテゴリ ID |
|---|---|---|---|---|
| 4 | Code 名前はブラック | エドガー・ジムズ | 2010 | NULL |
| 7 | ダ・ヴィンチ Code | NULL | NULL | 6 |
検索キーワード「code」がタイトルの先頭にあっても末尾にあっても、結果が返されることに注意してください。これは、パターンが「code」の前後に任意の数の文字を許容しているためです。
それでは、検索条件の先頭にのみパーセンテージのワイルドカードが表示されるようにスクリプトを修正しましょう。
SELECT * FROM movies WHERE title LIKE '%code';
上記のスクリプトを実行すると、 MySQL myflixdbデータベースに対してWorkbenchを実行すると、以下の結果が得られます。
| 映画ID | タイトル | ディレクター | リリース年 | カテゴリ ID |
|---|---|---|---|---|
| 7 | ダ・ヴィンチ Code | NULL | NULL | 6 |
レコードが 1 つしか返されていないことに注意してください。パターンはタイトルの先頭の任意の数の文字に一致しますが、タイトルには end 「コード」付き。
それでは、パーセンテージのワイルドカードをパターンの末尾に移動させてみましょう。変更後のスクリプトは以下のとおりです。
SELECT * FROM movies WHERE title LIKE 'code%';
上記のスクリプトを実行すると、 MySQL myflixdbデータベースに対してWorkbenchを実行すると、以下の結果が得られます。
| 映画ID | タイトル | ディレクター | リリース年 | カテゴリ ID |
|---|---|---|---|---|
| 4 | Code 名前はブラック | エドガー・ジムズ | 2010 | NULL |
このパターンはすべてのタイトルに一致するため、レコードは 1 つだけ返されます。 開始 「code」の後に任意の数の文字が続きます。したがって、%記号の位置によって検索の意味が決まります。
💡ヒント: 'code%' のようなパターンはタイトル列のインデックスを使用できますが、'%code%' は使用できません。先頭のパーセンテージワイルドカードは強制的に MySQL すべての行をスキャンするため、検索が許す限り、ワイルドカードを右側に配置してください。
_ – アンダースコアのワイルドカード
アンダースコアワイルドカードは次の目的で使用されます。 XNUMX つの文字に正確に一致する200x 年(x は任意の値を取り得る 1 文字)に公開されたすべての映画を検索したいとします。以下のスクリプトは、200x 年(200x 年)に公開されたすべての映画を選択します。
SELECT * FROM movies WHERE year_released LIKE '200_';
上記のスクリプトを実行すると、 MySQL myflixdbデータベースに対してWorkbenchを実行すると、以下の結果が得られます。
| 映画ID | タイトル | ディレクター | リリース年 | カテゴリ ID |
|---|---|---|---|---|
| 2 | サラ・マーシャルを忘れる | ニコラス・ストーラー | 2008 | 2 |
| 9 | Honey moonERS | ジョン・シュルツ | 2005 | 8 |
公開年が「200」で、その後に任意の文字が1つ続く映画のみが返されることに注意してください。パーセンテージのワイルドカードとは異なり、アンダースコアは1文字分のスペースしか確保しません。
ワイルドカードとは異なり
NOT論理演算子はワイルドカードと組み合わせて使用することで、条件を満たす行を返すことができます。 指定されたパターンに一致する。
200x年に公開されなかった映画を探したいとします。その場合は、以下に示すように、NOT論理演算子とアンダースコアのワイルドカードを組み合わせます。
SELECT * FROM movies WHERE year_released NOT LIKE '200_';
| 映画ID | タイトル | ディレクター | リリース年 | カテゴリ ID |
|---|---|---|---|---|
| 1 | パイレーツ・オブ・カリビアン 4 | ロブ·マーシャル | 2011 | 1 |
| 4 | Code 名前はブラック | エドガー・ジムズ | 2010 | NULL |
| 8 | アンダーワールド-Awakenイン | マイケル・イール | 2012 | 6 |
NOT はワイルドカード比較の結果を反転させるため、200x パターンに従わない映画のみが返されます。 NULL NULLは不等ではなく不明であるため、LIKEまたはNOT LIKEによって値が返されることはありません。
ESCAPEキーワード
ESCAPE キーワードは次の目的で使用されます。 エスケープパターンマッチング文字 例えば、パーセンテージ(%)やアンダースコア(_)がデータ自体の一部を構成する場合など。
例えば、文字列「67%」を検索したいとします。エスケープ文字を宣言し、データとして読み込む文字の直前に配置します。
LIKE '67#%%' ESCAPE '#';
映画「67% Guilty」を探したい場合は、以下のスクリプトを使用できます。
SELECT * FROM movies WHERE title LIKE '67#%%' ESCAPE '#';
LIKE句にある二重の「%%」に注目してください。最初の「%%」はエスケープ文字(#)が前に付いているため、検索対象文字列の一部として扱われます。2番目の「%%」はワイルドカードとしての意味を保持し、後に続く任意の数の文字に一致します。
エスケープ文字には任意の文字を使用できるため、同じクエリは等号でも機能します。
SELECT * FROM movies WHERE title LIKE '67=%%' ESCAPE '=';
ワイルドカードは単純なパターンには非常に有効ですが、検索によってはより表現力豊かなルールが必要になる場合があります。以下の比較は、その限界を示しています。
MySQL ワイルドカードと正規表現:どちらを使うべきか?
MySQL ワイルドカード文字は 2 つしかサポートされていません。他のデータベース エンジンが LIKE 内で受け入れる [ac] などの文字リストはサポートされていません。検索で文字範囲、交替、またはアンカーが必要な場合は、 正規表現演算子 は正しい選択です。
| 基準 | ワイルドカード付きのLIKE | REGEXP |
|---|---|---|
| パターンパワー | 使用できる記号は % と _ の 2 種類のみです。 | キャラクタークラス、範囲、交替、繰り返し |
| 典型的な使用 | 接頭辞、接尾辞、または「含む」検索 | 検証、複雑なマッチング、複数の選択肢 |
| インデックスの使用状況 | パターンが%で始まらない場合に可能 | インデックスを一切使用しない |
| 読みやすさ | 初心者向けの簡単な | 急峻な学習曲線 |
原則として、まずは LIKE を使用してください。読みやすく、インデックスの恩恵を受けられるのは LIKE だけです。単一のパターンで複数の選択肢を表現する必要がある場合(たとえば、数字で始まるすべてのタイトルに一致させる場合)は、REGEXP を使用してください。どちらの演算子も読み取り専用の比較なので、返される行は変更されません。 INSERT or UPDATE これらはステートメントであり、WHERE句が選択するものだけをフィルタリングします。
