SQL LIKEで複数条件を指定する方法【OR/AND徹底解説】
はじめに
データベースに蓄えられた膨大な情報の中から、特定の条件に合致する文字列データを見つけ出すことは、SQLを使ったデータ操作において非常に頻繁に行われるタスクです。特に、完全に一致するデータではなく、「〜を含む」「〜で始まる」「〜で終わる」といったあいまいな検索やパターンマッチングを行いたい場合に活躍するのが、SQLの強力な演算子であるLIKEです。
しかし、実際のビジネスシナリオやデータ分析では、単一の条件だけでなく、「このパターンか、あるいは別のこのパターンに一致するデータ」「このパターンに一致し、かつ別のこのパターンにも一致するデータ」のように、複数のLIKE条件を組み合わせて検索したい場面が多く発生します。
例えば、
- 製品名に「Apple」または「Samsung」のいずれかを含む商品を検索したい。
- 商品の説明文に「防水」かつ「軽量」の両方の単語を含む商品を検索したい。
- 顧客の氏名が「山田」で始まるまたは「田中」で始まる顧客をリストアップしたい。
このような要求に応えるためには、LIKE演算子と論理演算子であるORやANDを組み合わせる必要があります。
この記事では、SQLにおけるLIKE演算子の基本的な使い方から始め、複数のLIKE条件をORおよびANDで結合する方法、それぞれの具体的な使用例、さらにはORとANDを組み合わせた複雑な条件の記述方法、そしてパフォーマンスに関する考慮事項まで、幅広くかつ詳細に解説します。
この記事を読むことで、あなたは以下のことを習得できます。
- SQL
LIKE演算子とワイルドカード(%,_)の基本的な使い方 - 複数の
LIKE条件をORで結合し、「いずれかのパターンに一致する」データを検索する方法 - 複数の
LIKE条件をANDで結合し、「すべてのパターンに一致する」データを検索する方法 ORとANDを組み合わせて、より複雑な文字列検索条件を記述する方法NOT LIKEを使った条件の否定- 複数
LIKE条件検索におけるパフォーマンスの考慮点
それでは、まずはSQLのLIKE演算子の基本から見ていきましょう。
SQLにおけるLIKE演算子の基本
SQLのLIKE演算子は、文字列が特定のパターンに一致するかどうかを判定するために使用されます。これは、完全一致(=演算子)では対応できない、あいまいな検索や部分一致検索を実現するためのものです。
LIKE演算子は、主に以下の二つのワイルドカード文字と組み合わせて使用します。
-
%(パーセント)- 0文字以上の任意の文字列を表します。
- 例:
'A%'は「A」で始まる任意の文字列 ('A','Apple','Anker',''は含まないことが多い ※DBによる)` を表します。 - 例:
'%ple'は「ple」で終わる任意の文字列 ('Apple','Sample') を表します。 - 例:
'%app%'は「app」を含む任意の文字列 ('Apple','application') を表します。 - 例:
'%'は任意の文字列(空文字列含む)を表します。
-
_(アンダースコア)- 正確に1文字の任意の文字を表します。
- 例:
'A_C'は「A」で始まり、「C」で終わる3文字の文字列 ('ABC','AAC') を表します。 - 例:
'____'は正確に4文字の文字列を表します。
LIKEの基本的な構文
LIKE演算子の基本的な構文は以下のようになります。
sql
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
column_name は検索対象の列名、table_name はテーブル名、pattern は検索したい文字列パターンをワイルドカードを使って記述したものです。
基本的な使用例(単一条件)
簡単な例を見てみましょう。以下のproductsテーブルを想定します。
| product_id | product_name | description | category | price |
|---|---|---|---|---|
| 1 | Apple iPhone 13 | Latest model with A15 chip | Electronics | 999 |
| 2 | Samsung Galaxy S22 | Flagship Android phone | Electronics | 899 |
| 3 | Google Pixel 6 | Great camera phone | Electronics | 599 |
| 4 | Apple Watch Series 7 | Smartwatch for iPhone users | Accessories | 399 |
| 5 | MacBook Pro M1 | Powerful laptop for professionals | Computers | 1299 |
| 6 | Dell XPS 15 | High-performance Windows laptop | Computers | 1199 |
| 7 | Sony WH-1000XM5 | Noise cancelling headphones | Accessories | 349 |
| 8 | Bose QuietComfort 45 | Premium headphones | Accessories | 329 |
| 9 | Logitech MX Master 3 | Ergonomic mouse | Accessories | 99 |
| 10 | Anker Power Bank | Portable charger | Accessories | 49 |
| 11 | Apple TV 4K | Streaming box for TV | Electronics | 199 |
このテーブルを使って、単一のLIKE条件での検索を行います。
例1: 特定の文字で始まるデータを検索 ('pattern%')
製品名が「Apple」で始まる商品を検索します。
sql
SELECT product_id, product_name
FROM products
WHERE product_name LIKE 'Apple%';
結果:
| product_id | product_name |
|---|---|
| 1 | Apple iPhone 13 |
| 4 | Apple Watch Series 7 |
| 11 | Apple TV 4K |
例2: 特定の文字で終わるデータを検索 ('%pattern')
製品名が「4K」で終わる商品を検索します。
sql
SELECT product_id, product_name
FROM products
WHERE product_name LIKE '%4K';
結果:
| product_id | product_name |
|---|---|
| 11 | Apple TV 4K |
例3: 特定の文字を含むデータを検索 ('%pattern%')
製品の説明文に「phone」を含む商品を検索します。
sql
SELECT product_id, product_name, description
FROM products
WHERE description LIKE '%phone%';
結果:
| product_id | product_name | description |
|---|---|---|
| 2 | Samsung Galaxy S22 | Flagship Android phone |
| 3 | Google Pixel 6 | Great camera phone |
| 4 | Apple Watch Series 7 | Smartwatch for iPhone users |
例4: 特定のパターンに一致するデータを検索 ('_')
製品名が正確に4文字の文字列である商品を検索します。
sql
SELECT product_id, product_name
FROM products
WHERE product_name LIKE '____';
このサンプルデータには4文字の製品名はありませんが、もし「iPad」のような製品があればこれが該当します。例えば、製品名が「Sony X」のような形式(SonyとXの間に任意の1文字)を探す場合は'Sony _'と指定します。
このように、LIKEとワイルドカードを組み合わせることで、柔軟な文字列検索が可能になります。しかし、実際の応用では、これらの基本的な条件だけでは不十分なケースがほとんどです。次に、複数条件が必要になる場面と、それをどのように実現するかを見ていきましょう。
LIKE演算子と複数条件指定の必要性
単一のLIKE条件は便利ですが、多くの実際の検索ニーズはより複雑です。例えば、以下のようなケースを考えてみましょう。
- 顧客リストから、「佐藤」または「鈴木」という姓を持つ人を探したい。
- 製品カタログから、製品名に「Pro」または「Plus」という単語を含む製品を検索したい。
- 記事データベースから、タイトルに「SQL」という単語を含み、かつ「入門」という単語も含む記事を検索したい。
- 在庫リストから、説明文に「防水」という単語を含み、かつ「セール」という単語を含まない商品を検索したい。
これらのケースでは、単一のLIKE条件だけでは目的のデータを正確に絞り込むことはできません。複数のパターンに対して検索を実行し、それらの結果を論理的に結合する必要があるのです。
ここで登場するのが、SQLの論理演算子であるORとANDです。
OR演算子: 複数の条件のうち、いずれか一つでも真であれば全体が真となります。AND演算子: 複数の条件のうち、すべてが真である場合にのみ全体が真となります。
これらの論理演算子をLIKE演算子と組み合わせることで、前述のような複雑な検索条件を実現することができます。
次章からは、ORとANDをそれぞれLIKEと組み合わせて使用する方法を、具体的な例とともに詳しく見ていきます。
OR演算子を使った複数LIKE条件の結合
OR演算子を使うと、複数のLIKE条件のうち、少なくとも一つに一致する行を検索することができます。これは、「パターンAまたはパターンBまたはパターンC…」といった形で条件を指定したい場合に非常に有用です。
OR演算子の役割
OR演算子は、複数の真偽値を評価し、そのうち一つでもTRUEであれば結果をTRUEとします。SQLのWHERE句でORを使う場合、ORで区切られた複数の条件式のいずれかがTRUEとなる行が結果セットに含まれます。
LIKE条件をORで結合する構文
複数のLIKE条件をORで結合する基本的な構文は以下のようになります。
sql
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern1 OR column_name LIKE pattern2 OR column_name LIKE pattern3 ...;
検索対象の列が同じであれば、上記のように列名を繰り返してLIKE条件を並べ、ORで結合します。
具体的な使用例(複数パターンに一致する行を検索)
先ほどのproductsテーブルを使って、ORを使った複数LIKE条件の例を見てみましょう。
例1: 特定の複数の単語を含む行
製品名に「Apple」または「Samsung」のいずれかを含む商品を検索します。
sql
SELECT product_id, product_name
FROM products
WHERE product_name LIKE '%Apple%' OR product_name LIKE '%Samsung%';
解説:
product_name LIKE '%Apple%': 製品名に「Apple」という文字列が含まれる行を検索します。product_name LIKE '%Samsung%': 製品名に「Samsung」という文字列が含まれる行を検索します。OR: 上記のどちらかの条件が真である行(つまり、製品名に「Apple」を含むか、「Samsung」を含むか、またはその両方を含む行)を選択します。
結果:
| product_id | product_name |
|---|---|
| 1 | Apple iPhone 13 |
| 2 | Samsung Galaxy S22 |
| 4 | Apple Watch Series 7 |
| 11 | Apple TV 4K |
例2: 複数の接頭辞のいずれかに一致する行
製品名が「Apple」で始まるか、「Google」で始まるか、「Sony」で始まる商品を検索します。
sql
SELECT product_id, product_name
FROM products
WHERE product_name LIKE 'Apple%' OR product_name LIKE 'Google%' OR product_name LIKE 'Sony%';
解説:
product_name LIKE 'Apple%': 製品名が「Apple」で始まる行。product_name LIKE 'Google%': 製品名が「Google」で始まる行。product_name LIKE 'Sony%': 製品名が「Sony」で始まる行。OR: これらの条件のいずれかが真である行を選択します。
結果:
| product_id | product_name |
|---|---|
| 1 | Apple iPhone 13 |
| 3 | Google Pixel 6 |
| 4 | Apple Watch Series 7 |
| 7 | Sony WH-1000XM5 |
| 11 | Apple TV 4K |
例3: 複数の特定の文字を含む行(少し複雑なパターン)
製品の説明文に「phone」または「headphones」という単語を含む商品を検索します。
sql
SELECT product_id, product_name, description
FROM products
WHERE description LIKE '%phone%' OR description LIKE '%headphones%';
解説:
description LIKE '%phone%': 説明文に「phone」が含まれる行。description LIKE '%headphones%': 説明文に「headphones」が含まれる行。OR: どちらかの条件が真である行を選択します。
結果:
| product_id | product_name | description |
|---|---|---|
| 2 | Samsung Galaxy S22 | Flagship Android phone |
| 3 | Google Pixel 6 | Great camera phone |
| 4 | Apple Watch Series 7 | Smartwatch for iPhone users |
| 7 | Sony WH-1000XM5 | Noise cancelling headphones |
| 8 | Bose QuietComfort 45 | Premium headphones |
ORを使った複数LIKE条件のパフォーマンスに関する注意点
OR演算子で複数のLIKE条件を結合する場合、パフォーマンスに影響を与える可能性があります。特に、ワイルドカード(%)がパターンの先頭にくる場合(例: '%pattern')、データベースは列の先頭からではなく、文字列全体をスキャンしてパターンに一致するかどうかを確認する必要があるため、インデックスが効果的に利用されにくいことがあります。
pattern%の場合: 列にインデックスが張られている場合、データベースはインデックスを利用して効率的に検索できることが多いです(B-treeインデックスなどが利用可能)。%patternや%pattern%の場合: 通常のB-treeインデックスは文字列の先頭からの比較に最適化されているため、これらのパターンではインデックスがあまり効果を発揮しません。テーブル全体のフルスキャンが発生しやすくなります。OR結合:ORで結合された条件のいずれかがインデックスを利用できないパターンである場合、クエリ全体のパフォーマンスが低下する可能性があります。特に多くのOR条件を使う場合、データベースは各条件を個別に評価し、結果を結合するため、コストが高くなる傾向があります。
大規模なテーブルに対して頻繁に複雑なOR LIKE検索を実行する必要がある場合は、以下の点を検討すると良いでしょう。
- 全文検索機能の利用: 多くのデータベースシステム(PostgreSQL, MySQL, SQL Serverなど)は、より高度でパフォーマンスの高い全文検索機能を提供しています。これは、大量のテキストデータ内の単語やフレーズを検索することに特化しており、
LIKEよりもはるかに高速な検索が可能です。 - インデックス戦略の見直し: データベースによっては、NGRAMインデックスや全文検索インデックスなど、
%patternや%pattern%のような検索パターンに特化したインデックスタイプが利用できる場合があります。 - データの正規化または加工: 検索頻度の高いキーワードを別の列に抽出したり、タグ付けしたりすることで、
LIKEを使わずに=やINなどの高速な検索が可能になる場合があります。
単純なケースや小規模なデータであればOR LIKEで十分ですが、パフォーマンスが問題となる場合はこれらの代替手段を検討することが重要です。
AND演算子を使った複数LIKE条件の結合
AND演算子を使うと、複数のLIKE条件のすべてに一致する行を検索することができます。これは、「パターンAに一致し、かつパターンBにも一致し、かつパターンC…」といった形で条件を指定したい場合に非常に有用です。
AND演算子の役割
AND演算子は、複数の真偽値を評価し、すべてがTRUEである場合にのみ結果をTRUEとします。SQLのWHERE句でANDを使う場合、ANDで区切られたすべての条件式がTRUEとなる行のみが結果セットに含まれます。
LIKE条件をANDで結合する構文
複数のLIKE条件をANDで結合する基本的な構文は以下のようになります。
sql
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern1 AND column_name LIKE pattern2 AND column_name LIKE pattern3 ...;
検索対象の列が同じであれば、上記のように列名を繰り返してLIKE条件を並べ、ANDで結合します。
具体的な使用例(すべての条件を満たす行を検索)
再びproductsテーブルを使って、ANDを使った複数LIKE条件の例を見てみましょう。
例1: 特定の単語を複数含む行
製品の説明文に「phone」と「camera」の両方の単語を含む商品を検索します。
sql
SELECT product_id, product_name, description
FROM products
WHERE description LIKE '%phone%' AND description LIKE '%camera%';
解説:
description LIKE '%phone%': 説明文に「phone」が含まれる行。description LIKE '%camera%': 説明文に「camera」が含まれる行。AND: 上記の両方の条件が真である行(つまり、説明文に「phone」と「camera」の両方を含む行)を選択します。
結果:
| product_id | product_name | description |
|---|---|---|
| 3 | Google Pixel 6 | Great camera phone |
例2: 特定の接頭辞で始まり、かつ特定の単語を含む行
製品名が「Apple」で始まり、かつ「Watch」という単語を含む商品を検索します。
sql
SELECT product_id, product_name
FROM products
WHERE product_name LIKE 'Apple%' AND product_name LIKE '%Watch%';
解説:
product_name LIKE 'Apple%': 製品名が「Apple」で始まる行。product_name LIKE '%Watch%': 製品名に「Watch」が含まれる行。AND: 両方の条件が真である行を選択します。
結果:
| product_id | product_name |
|---|---|
| 4 | Apple Watch Series 7 |
例3: 特定の文字を含み、かつ別の特定の文字を含まない行 (AND NOT LIKE)
NOT LIKE演算子を使うと、特定のパターンに一致しない行を検索できます。これをANDと組み合わせることで、「パターンAを含み、かつパターンBを含まない」という条件を指定できます。
製品の説明文に「phone」を含み、かつ「Android」を含まない商品を検索します。
sql
SELECT product_id, product_name, description
FROM products
WHERE description LIKE '%phone%' AND description NOT LIKE '%Android%';
解説:
description LIKE '%phone%': 説明文に「phone」が含まれる行。description NOT LIKE '%Android%': 説明文に「Android」が含まれない行。AND: 上記の両方の条件が真である行(つまり、説明文に「phone」を含み、かつ「Android」を含まない行)を選択します。
結果:
| product_id | product_name | description |
|---|---|---|
| 3 | Google Pixel 6 | Great camera phone |
| 4 | Apple Watch Series 7 | Smartwatch for iPhone users |
(※ Samsung Galaxy S22は「Android phone」なので、NOT LIKE '%Android%'の条件で除外されます。)
例4: 複数の異なる列に対するLIKE条件
製品名に「Apple」を含み、かつ説明文に「professional」を含む商品を検索します。この場合、ANDは異なる列に対するLIKE条件を結合します。
sql
SELECT product_id, product_name, description
FROM products
WHERE product_name LIKE '%Apple%' AND description LIKE '%professional%';
解説:
product_name LIKE '%Apple%':product_name列に「Apple」が含まれる行。description LIKE '%professional%':description列に「professional」が含まれる行。AND: 両方の条件が真である行を選択します。
結果:
(※ サンプルデータには該当する行がありません。MacBook Proは製品名に「Apple」を含んでいません。もしMacBook Airもあれば、その説明文に”professional”がなければこれも除外されます。)
もしMacBook Proの製品名が「Apple MacBook Pro M1」であれば、以下の結果になります。
| product_id | product_name | description |
|---|---|---|
| 5 | Apple MacBook Pro M1 | Powerful laptop for professional |
ANDを使った複数LIKE条件のパフォーマンスに関する注意点
AND演算子で複数のLIKE条件を結合する場合も、パフォーマンスに考慮が必要です。
- インデックスの利用:
AND条件の場合、データベースは各条件を評価し、その共通部分を結果とします。もしANDで結合された条件の中に、インデックスが効果的に利用できるものがあれば(例:column LIKE 'pattern%')、データベースはその条件を先に評価して行を絞り込み、その後の条件評価の対象を減らすことでパフォーマンスを向上させる可能性があります。しかし、すべての条件が%patternや%pattern%のようにインデックスが効きにくいパターンである場合は、やはりフルスキャンが発生しやすくなります。 - 条件の順序: 一部のデータベースシステムでは、
WHERE句内のAND条件の評価順序がパフォーマンスに影響を与えることがあります。通常、データベースオプティマイザが最適な順序を判断しますが、より絞り込み効果の高い条件(特にインデックスが使える条件)を先に記述することで、意図を明確にしたり、オプティマイザの判断を助けたりすることができる場合があります(ただし、これはデータベースの実装に依存します)。 - 代替手段:
ORの場合と同様に、大規模なデータに対して複雑なAND LIKE検索を頻繁に行う場合は、全文検索機能の利用やインデックス戦略の見直しを検討すべきです。
AND LIKEは、複数の特定の文字列やパターンがすべて含まれている行を正確に検索したい場合に非常に強力です。
ORとANDの組み合わせ
実際の検索条件は、ORだけ、あるいはANDだけでは表現できない、より複雑なものになることがよくあります。例えば、「製品名に『Apple』または『Samsung』を含み、かつ価格が500ドル以上の商品」のような条件です。
このような場合、ORとANDを組み合わせて使用します。このとき、括弧 () を使って条件をグループ化することが非常に重要です。括弧は、論理演算子の評価順序を明確にし、意図した通りの検索結果を得るために不可欠です。
括弧 () を使った条件のグループ化の重要性
論理演算子には評価の優先順位があります。SQLでは通常、ANDはORよりも優先して評価されます。つまり、括弧がない場合、ANDで結合された条件が先に評価され、その結果がORの片方のオペランドとして扱われます。
例:ConditionA OR ConditionB AND ConditionC
これは、ConditionA OR (ConditionB AND ConditionC) と評価されます。
もし意図が (ConditionA OR ConditionB) AND ConditionC であった場合、括弧を使わないと誤った結果が得られます。
使用例: (パターンA OR パターンB) AND パターンC
「製品名に「Apple」または「Samsung」を含み、かつ説明文に「phone」を含む商品」を検索してみましょう。
この条件は、以下の2つの部分に分けられます。
- 製品名が「Apple」を含む または 製品名が「Samsung」を含む。
- 説明文が「phone」を含む。
これらの関係は「(条件1) かつ (条件2)」です。条件1はさらに「A または B」という構造になっています。したがって、条件1全体を括弧で囲む必要があります。
sql
SELECT product_id, product_name, description
FROM products
WHERE (product_name LIKE '%Apple%' OR product_name LIKE '%Samsung%')
AND description LIKE '%phone%';
解説:
(product_name LIKE '%Apple%' OR product_name LIKE '%Samsung%'): この括弧内の条件が先に評価されます。製品名が「Apple」または「Samsung」のいずれかを含む行が選択されます。description LIKE '%phone%': 説明文に「phone」が含まれる行を検索します。AND: 括弧内の条件が真であった行のうち、かつ説明文に「phone」が含まれる行を最終的な結果とします。
結果:
| product_id | product_name | description |
|---|---|---|
| 1 | Apple iPhone 13 | Latest model with A15 chip |
| 2 | Samsung Galaxy S22 | Flagship Android phone |
この結果は、製品名に「Apple」または「Samsung」が含まれる商品のうち、説明文に「phone」という単語が含まれているものだけを抽出しています。Apple Watch Series 7やApple TV 4Kは製品名にAppleを含みますが、説明文にphoneを含まないため除外されます。
使用例: PatternA AND (PatternB OR PatternC)
「製品名に「Apple」を含み、かつ説明文に「phone」または「watch」のいずれかを含む商品」を検索してみましょう。
この条件は、以下の2つの部分に分けられます。
- 製品名が「Apple」を含む。
- 説明文が「phone」を含む または 説明文が「watch」を含む。
これらの関係は「(条件1) かつ (条件2)」です。条件2は「B または C」という構造になっているため、条件2全体を括弧で囲みます。
sql
SELECT product_id, product_name, description
FROM products
WHERE product_name LIKE '%Apple%'
AND (description LIKE '%phone%' OR description LIKE '%watch%');
解説:
product_name LIKE '%Apple%': 製品名に「Apple」が含まれる行を検索します。(description LIKE '%phone%' OR description LIKE '%watch%'): この括弧内の条件が評価されます。説明文に「phone」または「watch」のいずれかが含まれる行が選択されます。AND: 製品名に「Apple」が含まれる行のうち、かつ説明文に「phone」または「watch」のいずれかが含まれる行を最終的な結果とします。
結果:
| product_id | product_name | description |
|---|---|---|
| 1 | Apple iPhone 13 | Latest model with A15 chip |
| 4 | Apple Watch Series 7 | Smartwatch for iPhone users |
この結果は、製品名に「Apple」が含まれる商品のうち、説明文に「phone」または「watch」が含まれているものだけを抽出しています。Apple TV 4Kは製品名にAppleを含みますが、説明文にphoneもwatchも含まないため除外されます。
このように、ORとANDを組み合わせることで、非常に柔軟で具体的な検索条件を構築することができます。括弧を適切に使用することが、複雑な条件式を正しく記述するための鍵となります。迷った場合は、まず小さい条件をORやANDで結合し、それをさらに別の条件とANDやORで結合するというように、段階的に考えていくと良いでしょう。
より高度なテクニックと考慮事項
ここまで、LIKE演算子とワイルドカード、そしてOR/ANDによる複数条件の結合について解説しました。ここでは、さらに踏み込んだテクニックや、実務で考慮すべき点について触れていきます。
NOT LIKEを使った条件の否定
すでに少し触れましたが、NOT LIKEは特定のパターンに一致しない行を検索したい場合に非常に便利です。ANDやORと組み合わせて、より複雑な除外条件を指定できます。
例: 製品名に「Apple」は含むが、「Watch」は含まない商品を検索する。
sql
SELECT product_id, product_name
FROM products
WHERE product_name LIKE '%Apple%' AND product_name NOT LIKE '%Watch%';
結果:
| product_id | product_name |
|---|---|
| 1 | Apple iPhone 13 |
| 11 | Apple TV 4K |
この例は、「パターンAに一致し、かつパターンBに一致しない」というよくある検索パターンです。
CASE式とLIKEの組み合わせ
CASE式は、条件に基づいて異なる値を返すために使用されます。これをLIKEと組み合わせることで、検索結果の表示形式を制御したり、条件付き集計を行ったりすることができます。
例: 製品名に「Apple」が含まれるかどうかを判定する列を追加して表示する。
sql
SELECT
product_id,
product_name,
CASE
WHEN product_name LIKE '%Apple%' THEN 'Contains Apple'
ELSE 'Does not contain Apple'
END AS apple_status
FROM products;
結果 (一部):
| product_id | product_name | apple_status |
|---|---|---|
| 1 | Apple iPhone 13 | Contains Apple |
| 2 | Samsung Galaxy S22 | Does not contain Apple |
| 3 | Google Pixel 6 | Does not contain Apple |
| 4 | Apple Watch Series 7 | Contains Apple |
| … | … | … |
| 11 | Apple TV 4K | Contains Apple |
複数のLIKE条件をCASE式内でORやANDを使って組み合わせることも可能です。
例: 製品名に「Phone」または「Watch」が含まれるかどうかを判定する。
sql
SELECT
product_id,
product_name,
CASE
WHEN product_name LIKE '%Phone%' OR product_name LIKE '%Watch%' THEN 'Mobile/Wearable'
ELSE 'Other'
END AS category_group
FROM products;
このように、CASEとLIKEを組み合わせることで、よりリッチなレポートやデータ分析に役立てることができます。
データベースシステムごとのワイルドカードの違い
ほとんどの主要なデータベースシステム(MySQL, PostgreSQL, SQL Server, Oracleなど)では、%と_が標準のワイルドカードとしてサポートされています。しかし、細かい挙動やエスケープ文字の指定方法などが異なる場合があります。
-
エスケープ文字: 検索したい文字列自体に
%や_が含まれている場合、これらの文字をワイルドカードとしてではなく、リテラル文字として扱いたいことがあります。その際には、エスケープ文字を使用します。標準SQLではESCAPE句を使ってエスケープ文字を指定します。sql
-- 例えば、パターン '50%' を検索したい場合
SELECT ... FROM table WHERE column LIKE '50\%' ESCAPE '\';
この例では、\をエスケープ文字として指定し、その直後の%をリテラルとして扱っています。エスケープ文字として何を使うかは任意に指定できます。 -
その他のワイルドカード: 一部のデータベースシステム(特にSQL Serverなど)では、
LIKE以外に正規表現を使ったパターンマッチング機能を提供していることがあります。正規表現はLIKEよりもはるかに強力で柔軟なパターン指定が可能ですが、構文が複雑になります。
この記事で解説している%と_を使ったLIKE、およびOR/ANDによる結合は、ほぼすべてのRDBMSで共通して利用できる標準的な手法です。
パフォーマンスチューニング(再強調)
複数LIKE条件、特に先頭にワイルドカードが付くパターン(%patternや%pattern%)を多用する検索は、大規模なテーブルではパフォーマンスボトルネックとなりやすいことを繰り返し強調します。
- データ量の確認: 対象となるテーブルのサイズ(行数)を確認します。数十万、数百万、あるいはそれ以上の行がある場合、フルスキャンは避けるべきです。
- 実行計画の確認: データベースがどのようにクエリを実行しているかを確認するために、
EXPLAIN(MySQL, PostgreSQLなど)やEXECUTION PLAN(SQL Server, Oracleなど)といったコマンドを使って実行計画を確認します。これにより、インデックスが使われているか、フルスキャンが発生しているかなどを把握できます。 - 全文検索エンジンの検討: ElasticsearchやApache Solrのような専用の全文検索エンジン、またはデータベースシステムが提供する全文検索機能(PostgreSQLの
tsvector/tsquery、MySQLのFULLTEXTインデックス、SQL ServerのFull-Text Searchなど)は、テキストデータに対する高速なキーワード検索やあいまい検索に特化しています。テキストデータ検索がアプリケーションの主要な機能である場合、これらの導入を検討する価値は非常に高いです。 - インデックスの活用:
LIKE 'pattern%'のような先頭一致の検索が主であれば、検索対象列に通常のB-treeインデックスを作成することで大幅にパフォーマンスが向上します。 - データ設計の見直し: 検索条件としてよく使われるキーワードを、別途タグテーブルやキーワード列として正規化・格納することで、
LIKEを使わずにシンプルな=やIN句での検索が可能になります。
シンプルで読みやすいLIKEを使ったクエリは、開発の初期段階や小規模なデータでは非常に有効ですが、データ量の増加に伴ってパフォーマンス問題が発生しやすい特性があることを理解しておくことが重要です。
大規模データにおけるLIKEの使用について
大規模データセットに対するLIKE検索、特に%patternや%pattern%のような後方一致・部分一致検索は、前述のようにインデックスが効きにくいため、全件スキャンとなりパフォーマンスが悪化する傾向があります。
業務要件として、テキストカラムに対する柔軟な検索が不可欠であり、かつデータ量が膨大である場合は、以下の代替案を真剣に検討する必要があります。
- 全文検索機能の導入: これが最も一般的で効果的な解決策です。データベース組み込みの機能を使うか、外部の全文検索エンジンと連携します。
- データベースのスケールアップ/アウト: ハードウェアリソースを増強したり、データベースクラスタを構築したりすることで、スキャンにかかる時間を短縮できる場合がありますが、コストが高く、根本的な解決にならないこともあります。
- データウェアハウス/BIツールの活用: 集計や分析を目的とした検索であれば、事前に集計済みのデータを利用したり、データウェアハウス専用の高速な検索エンジンを活用したりすることができます。
- アプリケーションレベルでの工夫: 検索対象となる可能性のあるデータを事前に絞り込んでおく(例: 最近1年間のデータのみを対象とする)などのアプリケーションロジックで対応することも有効です。
繰り返しになりますが、文字列検索のパフォーマンスはデータベースの種類、データの特性、インデックス戦略によって大きく異なります。実際のシステム開発・運用においては、テスト環境で実際のデータに近いボリュームと種類のデータを用意し、クエリのパフォーマンスを計測・評価することが不可欠です。
まとめと今後の学習
この記事では、SQLのLIKE演算子を使って複数の条件を指定する方法について、ORおよびAND論理演算子を中心に詳しく解説しました。
LIKE演算子は、%(0文字以上の任意文字列)と_(1文字の任意文字)というワイルドカードを使って、あいまいな文字列パターン検索を行います。- 複数のパターンにいずれか一つでも一致するデータを検索するには、
OR演算子で複数のLIKE条件を結合します。
sql
WHERE column LIKE pattern1 OR column LIKE pattern2 OR ... - 複数のパターンにすべて一致するデータを検索するには、
AND演算子で複数のLIKE条件を結合します。
sql
WHERE column LIKE patternA AND column LIKE patternB AND ... - より複雑な条件(例:
(パターンA OR パターンB) AND パターンC)を指定する場合は、括弧()を使って条件のグループ化と評価順序を明確にする必要があります。 - 特定のパターンに一致しない行を検索するには、
NOT LIKE演算子を使用します。これもANDやORと組み合わせて使えます。 LIKE検索、特に先頭にワイルドカードが付くパターン(%patternや%pattern%)は、大規模なデータではパフォーマンスが低下しやすい傾向があります。パフォーマンスが問題となる場合は、インデックス戦略の見直しや、全文検索機能などの代替手段の検討が重要です。
練習問題と次のステップ
学んだ内容を定着させるために、以下の練習に挑戦してみてください。
- あなたが扱える実際のデータベースや、サンプルデータを使って、この記事で紹介した様々な
OR LIKE,AND LIKE,NOT LIKE, 括弧を使った組み合わせのクエリを実行してみましょう。 - 自分で架空のデータセットを作成し、「この条件を満たすデータを検索するSQL文を書いてみよう」という課題をいくつか設定して、実際に記述してみましょう。
- あなたのデータベースシステムが提供する全文検索機能について調べてみましょう。どのようにインデックスを作成し、どのようにクエリを実行するのかを学習し、
LIKEを使った検索と比較してみましょう。 - SQLの他の文字列関数(
SUBSTRING,LENGTH,REPLACEなど)についても学習し、LIKEと組み合わせてさらに高度な文字列処理や検索を行う方法を探求しましょう。
SQL学習のリソース紹介
SQLの学習は、実際に手を動かすことが最も効果的です。以下のリソースも参考にしながら、さらに学習を進めてみてください。
- 公式ドキュメント: あなたが使用している特定のデータベースシステム(PostgreSQL, MySQL, SQL Server, Oracleなど)の公式ドキュメントは、最も正確で詳細な情報源です。特に、
LIKE演算子、ワイルドカード、エスケープ文字、インデックス、全文検索に関するセクションを確認してみましょう。 - オンライン学習プラットフォーム: Khan Academy, Codecademy, Udemy, Courseraなどには、SQLの基礎から応用までを学べるコースが多数あります。
- SQL実行環境: DB Fiddle (
db-fiddle.com) のようなオンラインのSQL実行環境や、Dockerを使ってローカル環境にデータベースを簡単に構築し、自由にSQLを実行できる環境を用意すると便利です。
SQLの文字列検索は、データを扱う上で非常に基礎的かつ重要なスキルです。LIKE演算子とワイルドカード、そしてOR/ANDを使った複数条件の指定方法をマスターすることで、より柔軟かつ強力なデータ抽出が可能になります。この記事が、あなたのSQLスキル向上の一助となれば幸いです。
これで、約5000語の詳細な解説記事となりました。SQLのLIKE演算子を使った複数条件指定について、ORとANDを中心に網羅的に解説し、具体例、注意点、発展的な内容も含めて記述しました。