LIKE、ワイルドカード、エスケープ
パターン照合、パーセント記号とアンダースコアの違い、リテラルのワイルドカード文字のエスケープを学びます。
「LIKE、ワイルドカード、エスケープ」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。
面接で厳しく問われるパターンマッチング
LIKEは簡単に見えますが、面接でよく問われる3つの落とし穴があります。%と_を混同すること、データ中のリテラルのパーセント記号やアンダースコアにはエスケープが必要だと忘れること、そしてデータベースによって異なる大文字と小文字の扱いに気づかないことです。
このレッスンでは、2つのワイルドカード、ESCAPE句、そして面接官が初級者と実際に検索機能をリリースした経験のある人を見分けるために確認する、データベース間のルールを詳しく学びます。
2つのワイルドカード
LIKEには、ワイルドカード文字がちょうど2つあります。
%は0個以上の文字に一致します_はちょうど1個の文字に一致します
したがって、'a%'はaで始まるものすべてに一致し、'a_'はaで始まる2文字の文字列に一致します。これらを混同するのが、LIKEで最も多い間違いです。
SELECT *
FROM customers
WHERE name LIKE 'A%';
-- every name beginning with Aどこにでも置けるパーセント記号
%の位置によって、一致の起点と終点を制御します。
'%son'はsonで終わるものに一致します(Johnson、Mason)'%mary%'はどこかにmaryを含むものに一致します'J%n'はJで始まりnで終わるものに一致します
単独の'%'は、NULLでないすべての行に一致します。NULLは'%'を含め、どのLIKEパターンにも一致しません。
SELECT *
FROM customers
WHERE email LIKE '%@gmail.com';固定長にはアンダースコア
_は任意の1文字に一致するため、固定長コードに便利です。'A__'は、Aで始まるちょうど3文字の文字列に一致し、それより長くも短くもなりません。
面接官は商品コードや国コードを使ってこれを確認します。Aで始まる3文字のコードを求められたときに'A%'と書く候補者は、微妙に間違っています。Aで始まる任意の文字列を返してしまうからです。
SELECT *
FROM products
WHERE sku LIKE 'A__';
-- A followed by exactly two more charactersデータ内に%や_が現れる場合
「50% off」のような、パーセント記号を文字どおり含む値を検索したい場合はどうすればよいでしょうか。LIKE '%50%%'と書くと失敗します。末尾の%がリテラルではなくワイルドカードとして扱われるためです。
特定の1文字をリテラルとして扱うようSQLに伝える必要があります。そのために使うのがESCAPE句です。
ESCAPE句
ESCAPEを使ってエスケープ文字を宣言し、リテラルとして扱いたいワイルドカードの前に置きます。ここでは!がエスケープ文字なので、!%はリテラルのパーセント記号を意味します。
これにより、どこかにリテラルの文字列50%を含む値を検索できます。エスケープ文字は任意なので、検索文字列に含まれないものを選んでください。
SELECT *
FROM promos
WHERE label LIKE '%50!%%' ESCAPE '!';
-- matches a literal '50%' anywhere in labelリテラルのアンダースコアをエスケープする
ユーザー名や識別子にはアンダースコアが含まれることがあり、エスケープしていない_はひそかに任意の1文字に一致します。'a_b'で文字どおり始まるメールアドレスを検索するには、アンダースコアをエスケープする必要があります。
エスケープしないと、'a_b%'は「axb」や「a9b」などにも一致してしまいます。エスケープされていないクエリでも一見もっともらしい行が返るため、このバグは何度も本番環境に入り込んでいます。
SELECT *
FROM users
WHERE handle LIKE 'a!_b%' ESCAPE '!';
-- handle starting with the literal text a_bデータベースによって異なる大文字と小文字の区別
LIKEで大文字と小文字を区別するかどうかは、エンジンと照合順序によって異なります。
- PostgreSQL:
LIKEは大文字と小文字を区別します。区別しない場合はILIKEを使います - MySQL:列の照合順序によって異なり、デフォルトでは区別しないことがよくあります
- SQL Server:照合順序の設定によって異なります
移植性があり、明示的な方法は、両方の側を小文字に変換することです。
SELECT *
FROM customers
WHERE LOWER(name) LIKE 'a%';隠れたパフォーマンスコスト
'%son'のような先頭のワイルドカードは、通常のB-treeインデックスを利用できません。インデックスは接頭辞の順序で並んでいるのに、検索の開始位置を固定していないからです。エンジンはすべての行をスキャンする必要があります。
'son%'(末尾のワイルドカードで、接頭辞が固定されているもの)はインデックスを利用できます。LIKE検索が遅い理由を面接官が好んで尋ねるのは、通常、先頭の%が答えになるからです。
-- index-friendly (anchored prefix):
WHERE name LIKE 'Smi%'
-- forces a scan (leading wildcard):
WHERE name LIKE '%mith'LIKEの先へ
LIKEでは不十分な場合は、理解の深さを示すために代替手段を挙げましょう。
- PostgreSQLで真の正規表現を使うための
SIMILAR TOとPOSIX正規表現(~、~*) - 大量の自由記述テキスト向けの全文検索インデックス
- 先頭ワイルドカード検索を高速化するトライグラムインデックス(pg_trgm)
これらを挙げることで、LIKEはテキスト検索の出発点であって、限界ではないと理解していることを示せます。
ユーザー入力からLIKEパターンを安全に作成する方法
面接官からは、ユーザーが入力した語句をLIKEで検索する際、問題を起こさない方法をよく質問されます。指摘すべきリスクは2つあります。
- インジェクション — 値をパラメータとしてバインドし、未加工の入力をSQL文字列に連結してはいけません。
- エスケープされていないワイルドカード — 入力自体に
%や_が含まれている場合は、文字どおりに一致するようエスケープします。
パラメータをバインドしてから、クエリ内で独自のワイルドカードを追加します。
-- $1 is bound as a parameter; wildcards are added in SQL
SELECT *
FROM products
WHERE name LIKE '%' || replace(replace($1, '_', '\_'), '%', '\%') || '%' ESCAPE '\';クイックチェック
2つのワイルドカードの違いを思い出してください。
まとめ
重要なポイント:
%は0個以上の文字に一致し、_はちょうど1個の文字に一致します- データ内のリテラルの
%や_に一致させるには、ESCAPE文字を宣言し、ワイルドカードの前に置きます - 大文字と小文字の区別はエンジンによって異なります。両側で
LOWER()を使うのが移植性のある修正方法です(PostgresにはILIKEがあります) - 先頭のワイルドカードは全件スキャンを強制します。接頭辞を固定すればインデックスを利用できます
エスケープされていない_は、もっともらしい行を返し続ける、気づきにくいバグです。
よくある質問
「LIKE、ワイルドカード、エスケープ」レッスンは無料ですか?
はい。「LIKE、ワイルドカード、エスケープ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。
「LIKE、ワイルドカード、エスケープ」で何を学びますか?
パターン照合、パーセント記号とアンダースコアの違い、リテラルのワイルドカード文字のエスケープを学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「LIKE、ワイルドカード、エスケープ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- AND/ORの優先順位と括弧の付け方
- BETWEEN、IN、境界値の扱い
- LIKE、ワイルドカード、エスケープ
- 計算値でフィルタリングする