MySQL ワイルドカード: Like、NOT Like、Escape、( % )、( _ )

⚡ スマートサマリー

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

  • 🔍 コア定義: ワイルドカードは、LIKEとNOT LIKEが正確な値ではなくテキストパターンに一致させるために使用するプレースホルダー文字です。
  • 📊 パーセンテージワイルドカード: % 記号は 0 文字以上の文字に一致するため、「%code%」は「code」という単語を含むすべての映画タイトルを返します。
  • 🔡 アンダースコアワイルドカード: アンダースコア(_)は正確に1文字に一致するため、「200_」は2000年から2009年の間にリリースされたタイトルを返します。
  • 🚫 否定ルール: NOT LIKEは比較を反転させ、指定されたパターンに一致しないすべての行を返します。
  • 🛡️ 脱出処理: ESCAPEキーワードは、検索文字列内のリテラルな%または_をデータとして扱うようにマークします。
  • パフォーマンスの洞察: 先頭の「%」はインデックスの使用をブロックし、テーブル全体のスキャンを強制するため、アンカーパターンは可能な限り左側に配置してください。
  • 🧩 方法の選択: LIKEは単純な接頭辞と接尾辞のマッチングを扱い、REGEXPは文字クラスと選択範囲を扱います。

何ですか 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句が選択するものだけをフィルタリングします。

よくあるご質問

いいえ、デフォルトではそうではありません。LIKE は列の照合順序に従い、標準に準拠します。 MySQL 照合順序は大文字小文字を区別しないため、「code%」も「Code大文字と小文字を区別して一致させる必要がある場合は、列の前に BINARY キーワードを追加してください。

Yes. MySQL 比較する前に値を文字列に変換するため、`year_released LIKE '200_'` が機能します。この変換により、その列でのインデックスの使用が制限されるため、大規模なテーブルでは `BETWEEN 2000 AND 2009` のような範囲でフィルタリングしてください。

いいえ。他のエンジンで受け入れられる括弧で囲まれた文字リストは、 MySQL パターンと同様。 正規表現演算子 代わりに、たとえばタイトル REGEXP '^[ac]' を使用して、開始文字の範囲に一致させます。

はい。AIアシスタントは、平易な言語のリクエストを、クライアントで実行できるLIKEパターンに変換します。 MySQL ワークベンチ生成されたパターンは必ず確認してください。なぜなら、1つの%記号を移動するだけでも、返される行が変わるからです。

AIクエリ アドバイザーはEXPLAIN出力を読み取り、インデックスをスキップする先頭のワイルドカード パターンをフラグ付けします。次に、全文検索、プレフィックス パターン、または REGEXPただし、これはご自身のデータ量に対して検証する必要があります。