SQLでLIKEとAND/ORを組み合わせた複数条件検索

はい、承知いたしました。SQLのLIKE句と論理演算子(AND, OR)を組み合わせた複数条件検索について、詳細な説明を含む約5000語の記事を作成します。

以下に記事の内容を直接表示します。


SQLにおける強力な検索テクニック:LIKEとAND/ORを組み合わせた複数条件検索をマスターする

データ検索は、リレーショナルデータベースを扱う上で最も基本的な操作であり、その精度と効率は分析やアプリケーションの品質に直結します。特に、厳密な一致だけでなく、パターンに基づいた柔軟な検索が求められる場面は頻繁に発生します。SQLでは、このパターン検索を可能にするのがLIKE句です。

しかし、実際の業務では、単一の条件だけでなく、複数の条件を組み合わせてデータを絞り込む必要があります。例えば、「特定の商品名パターンに一致し、かつ特定のカテゴリに属する」商品や、「特定のキーワードを含むメールアドレスを持つか、あるいは特定の地域に住んでいる」顧客を検索するなどです。このような複雑な検索要件を満たすためには、LIKE句と論理演算子であるANDおよびORを効果的に組み合わせるテクニックが不可欠となります。

本記事では、SQLのLIKE句、ANDORの基本的な使い方から始まり、これらを組み合わせてより高度で柔軟な複数条件検索を実現する方法について、具体的な例を豊富に交えながら詳細に解説します。約5000語にわたる詳細な解説を通して、SQLの検索能力を最大限に引き出すための知識を習得していただけることを目指します。

はじめに:検索の基本とLIKE、AND/ORの役割

データベースから情報を取り出す際の基本は、SELECT文とWHERE句です。SELECT句で取得したい列を指定し、FROM句で対象となるテーブルを指定し、そしてWHERE句で検索条件を記述します。

sql
SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 検索条件;

このWHERE句に記述する「検索条件」が、データの絞り込み方法を定義する核心部分です。検索条件には、特定の値との等価性(=)、不等価性(!=<>)、大小比較(>, <, >=, <=)、範囲指定(BETWEEN)、リスト内指定(IN)、NULL値の判定(IS NULL, IS NOT NULL)など、さまざまな比較演算子が使用されます。

そして、テキストデータや文字列データに対して、完全に一致するわけではないが、特定のパターンに合致する行を検索したい場合に、強力なツールとなるのがLIKE句です。

また、検索条件が複数存在する場合、それらをどのように組み合わせるかを決定するのが論理演算子ANDORです。

  • AND: 複数の条件がすべて真である場合に、全体の条件が真となります。より厳しい絞り込みを行います。
  • OR: 複数の条件のうち、いずれか一つでも真であれば、全体の条件が真となります。より広い範囲のデータを取得します。

これらの基本的な要素であるLIKEANDORを組み合わせることで、データベースに対する検索の可能性は飛躍的に広がります。

SQL LIKE句の深掘り:パターンマッチングの基礎

LIKE句は、文字列のパターンマッチングに使用されます。LIKE句を使用する際には、特定のワイルドカード文字を用いてパターンを定義します。主要なワイルドカードは以下の二つです。

  1. % (パーセント記号): 0個以上の任意の文字を表します。
    • 例: 'Apple%' は「Apple」で始まる任意の文字列(”Apple”, “Apple Pie”, “Apples” など)にマッチします。
    • 例: '%phone' は「phone」で終わる任意の文字列(”smartphone”, “telephone” など)にマッチします。
    • 例: '%data%' は「data」を含む任意の文字列(”database”, “big data”, “data analysis” など)にマッチします。
    • 例: '%'任意の文字列すべてにマッチします(NULLを除く)。
  2. _ (アンダースコア): ちょうど1個の任意の文字を表します。
    • 例: 'h_t' は「h」で始まり「t」で終わる3文字の文字列(”hot”, “hat”, “hit” など)にマッチします。
    • 例: '_____'ちょうど5文字の任意の文字列にマッチします。

これらのワイルドカードを組み合わせることで、非常に柔軟なパターンを定義できます。

例えば、以下のような架空のProductsテーブルを考えます。

Products Table

ProductID ProductName Category Description Price Stock
101 Laptop Pro 15 Electronics High-performance notebook 1500.00 25
102 Office Chair Deluxe Furniture Ergonomic design 350.00 50
103 Smartphone X Electronics Latest model with great camera 800.00 15
104 Desk Lamp LED Furniture Energy-saving lamp 50.00 100
105 Tablet Lite Electronics Lightweight and portable 300.00 30
106 Mechanical Keyboard Electronics Durable keys for typing 120.00 40
107 Dining Table 4-seater Furniture Solid wood construction 600.00 10
108 Wireless Mouse Electronics Compact and responsive 25.00 75
109 Storage Box Large Home Goods Multi-purpose storage 30.00 200
110 Apple Juice 1L Food 100% pure apple juice 3.50 150

LIKE句を使った基本的な検索例を見てみましょう。

例1: ProductNameが’L’で始まる商品を検索

sql
SELECT ProductID, ProductName
FROM Products
WHERE ProductName LIKE 'L%';

結果:

ProductID ProductName
101 Laptop Pro 15
104 Desk Lamp LED

例2: ProductNameに’phone’を含む商品を検索

sql
SELECT ProductID, ProductName
FROM Products
WHERE ProductName LIKE '%phone%';

結果:

ProductID ProductName
103 Smartphone X

例3: Descriptionが’design’で終わる商品を検索

sql
SELECT ProductID, ProductName, Description
FROM Products
WHERE Description LIKE '%design';

結果:

ProductID ProductName Description
102 Office Chair Deluxe Ergonomic design

例4: ProductNameが3文字で「a」を真ん中に含む商品を検索(例: ‘cat’, ‘bat’のようなパターン)
このデータセットには該当がありませんが、概念として。

sql
SELECT ProductID, ProductName
FROM Products
WHERE ProductName LIKE '_a_';

もし ‘Cat’ や ‘Bat’ という商品名があればヒットします。この例ではデータがないため結果は空となります。

このように、LIKE句は単独でも非常に強力な文字列検索機能を提供します。しかし、実際の検索要件はこれだけにとどまりません。

AND/OR論理演算子の復習:複数条件の結合

ANDORは、複数の条件式を組み合わせて一つの大きな条件式を作成するために使用されます。

  • 条件A AND 条件B: 条件Aと条件Bの両方が真の場合に真。
  • 条件A OR 条件B: 条件Aまたは条件Bのいずれか、あるいは両方が真の場合に真。

例として、先ほどのProductsテーブルを使って、LIKEを使わない基本的なAND/ORの例を見てみましょう。

例5: Categoryが’Electronics’であり、かつPriceが500より大きい商品を検索

sql
SELECT ProductID, ProductName, Category, Price
FROM Products
WHERE Category = 'Electronics' AND Price > 500.00;

結果:

ProductID ProductName Category Price
101 Laptop Pro 15 Electronics 1500.00
103 Smartphone X Electronics 800.00

このクエリは、Category = 'Electronics'という条件とPrice > 500.00という条件の両方を満たす行を抽出します。

例6: Categoryが’Furniture’であるか、あるいはStockが20以下である商品を検索

sql
SELECT ProductID, ProductName, Category, Stock
FROM Products
WHERE Category = 'Furniture' OR Stock <= 20;

結果:

ProductID ProductName Category Stock
102 Office Chair Deluxe Furniture 50
104 Desk Lamp LED Furniture 100
107 Dining Table 4-seater Furniture 10
103 Smartphone X Electronics 15
107 Dining Table 4-seater Furniture 10
109 Storage Box Large Home Goods 200
ProductID ProductName Category Stock
:——– :——————– :———- :—-
102 Office Chair Deluxe Furniture 50
104 Desk Lamp LED Furniture 100
107 Dining Table 4-seater Furniture 10
103 Smartphone X Electronics 15

Corrected Result:

ProductID ProductName Category Stock
102 Office Chair Deluxe Furniture 50
104 Desk Lamp LED Furniture 100
107 Dining Table 4-seater Furniture 10
103 Smartphone X Electronics 15

このクエリは、Category = 'Furniture'である行、またはStock <= 20である行、あるいはその両方を満たす行を抽出します。

LIKEとANDの組み合わせ:複数のパターンを満たす検索

LIKE句をANDで組み合わせることで、「特定の複数のパターンにすべて合致する」データを検索することができます。これは、検索対象の文字列が複数の異なる性質やキーワードを持っている場合などに有効です。

組み合わせ方にはいくつかのパターンがあります。

  1. 異なる列に対する複数のLIKE条件をANDで結合
    これは最も一般的な組み合わせ方の一つです。例えば、「商品名が’L’で始まり、かつ説明に’notebook’を含む」商品を検索したい場合などです。

    例7: ProductNameが’L’で始まり、かつDescriptionに’notebook’を含む商品を検索

    sql
    SELECT ProductID, ProductName, Description
    FROM Products
    WHERE ProductName LIKE 'L%' AND Description LIKE '%notebook%';

    このクエリは、ProductName LIKE 'L%'(ProductNameが’L’で始まる)という条件と、Description LIKE '%notebook%'(Descriptionに’notebook’を含む)という条件の両方を満たす行を検索します。

    データセットを見ると、
    * ProductName ‘L%’ にマッチするのは ID 101 (‘Laptop Pro 15’) と 104 (‘Desk Lamp LED’)。
    * Description ‘%notebook%’ にマッチするのは ID 101 (‘High-performance notebook’)。
    * 両方の条件を満たすのは ID 101 のみです。

    結果:

    ProductID ProductName Description
    101 Laptop Pro 15 High-performance notebook

    このように、異なる列に対してLIKE条件を指定し、それらをANDで結合することで、複数の属性に基づいたパターン検索が実現できます。

  2. 同じ列に対する複数のLIKE条件をANDで結合
    これはあまり一般的ではありませんが、「特定のパターンを含み、かつ別のパターンも含む」といった複雑なパターン検索に利用できます。ただし、通常このような要件は一つのLIKEパターンや正規表現で表現できることが多いです。しかし、例として考えてみましょう。

    例えば、「ProductNameに’Pro’と’15’の両方を含む」商品を検索したい場合です。

    例8: ProductNameに’Pro’を含み、かつProductNameに’15’を含む商品を検索

    sql
    SELECT ProductID, ProductName
    FROM Products
    WHERE ProductName LIKE '%Pro%' AND ProductName LIKE '%15%';

    データセットを見ると、
    * ProductName ‘%Pro%’ にマッチするのは ID 101 (‘Laptop Pro 15’)。
    * ProductName ‘%15%’ にマッチするのは ID 101 (‘Laptop Pro 15’)。
    * 両方の条件を満たすのは ID 101 のみです。

    結果:

    ProductID ProductName
    101 Laptop Pro 15

    この場合、ProductName LIKE '%Pro%15%' のように一つのLIKEパターンで表現することも可能ですが、複数のキーワードが順不同で現れる可能性がある場合は、ANDで複数LIKEを結合する方が直感的かもしれません(例: ’15-inch Pro Laptop’ も検索したい場合)。

  3. LIKE条件と他の比較条件をANDで結合
    これは、パターン検索と厳密な値の条件を組み合わせる非常に一般的なパターンです。例えば、「ProductNameが’S’で始まり、かつPriceが500より小さい」商品を検索したい場合です。

    例9: ProductNameが’S’で始まり、かつPriceが500.00より小さい商品を検索

    sql
    SELECT ProductID, ProductName, Price
    FROM Products
    WHERE ProductName LIKE 'S%' AND Price < 500.00;

    データセットを見ると、
    * ProductName ‘S%’ にマッチするのは ID 103 (‘Smartphone X’)。
    * Price < 500.00 にマッチするのは ID 102 (350.00), 104 (50.00), 105 (300.00), 106 (120.00), 108 (25.00), 109 (30.00), 110 (3.50)。
    * 両方の条件を満たすのは ID 103 のみです(Smartphone X, Price 800.00 -> Wait, 800 is not less than 500. Let’s re-check the data and expected result. My data shows Smartphone X price is 800.00. It should NOT match Price < 500.00. Let’s look at the Products list again. ID 103 Smartphone X 800.00. ID 105 Tablet Lite 300.00. ID 109 Storage Box Large 30.00. ID 110 Apple Juice 1L 3.50. None of these start with ‘S’ AND have price < 500.00. There might be a confusion in my example or data. Let’s assume a product like ‘Soap Bar’ with price 2.00 exists, it would match. Or perhaps the example should have been Price > 500. Let’s correct the example query and description to match a plausible result or make it clear the current data yields no result. Let’s change the example to Price > 500.

    例9 (修正): ProductNameが’L’で始まり、かつPriceが500.00より大きい商品を検索

    sql
    SELECT ProductID, ProductName, Price
    FROM Products
    WHERE ProductName LIKE 'L%' AND Price > 500.00;

    データセットを見ると、
    * ProductName ‘L%’ にマッチするのは ID 101 (‘Laptop Pro 15’), 104 (‘Desk Lamp LED’).
    * Price > 500.00 にマッチするのは ID 101 (1500.00), 107 (600.00).
    * 両方の条件を満たすのは ID 101 のみです。

    結果:

    ProductID ProductName Price
    101 Laptop Pro 15 1500.00

    この組み合わせは、テキストパターンと数値、日付、あるいは他の厳密な条件を組み合わせてデータを絞り込む際に非常に役立ちます。

LIKEとORの組み合わせ:いずれかのパターンを満たす検索

LIKE句をORで組み合わせることで、「指定された複数のパターンのいずれかに合致する」データを検索することができます。これは、検索対象が複数の異なるキーワードやパターンである場合に非常に有効です。

組み合わせ方にもいくつかのパターンがあります。

  1. 異なる列に対する複数のLIKE条件をORで結合
    例えば、「ProductNameに’Laptop’を含むか、あるいはCategoryが’Furniture’である」商品を検索したい場合です。

    例10: ProductNameに’Laptop’を含むか、あるいはCategoryが’Furniture’である商品を検索

    sql
    SELECT ProductID, ProductName, Category
    FROM Products
    WHERE ProductName LIKE '%Laptop%' OR Category = 'Furniture';

    データセットを見ると、
    * ProductName ‘%Laptop%’ にマッチするのは ID 101 (‘Laptop Pro 15’).
    * Category = ‘Furniture’ にマッチするのは ID 102, 104, 107.
    * いずれかの条件を満たすのは ID 101, 102, 104, 107 です。

    結果:

    ProductID ProductName Category
    101 Laptop Pro 15 Electronics
    102 Office Chair Deluxe Furniture
    104 Desk Lamp LED Furniture
    107 Dining Table 4-seater Furniture

    この組み合わせは、複数の検索キーに対して「いずれかにヒットすればよい」という要件でデータを収集する際によく使われます。

  2. 同じ列に対する複数のLIKE条件をORで結合
    これはORLIKEを組み合わせる中で最も一般的で強力なパターンの一つです。一つの列に対して、複数の異なるキーワードやフレーズのいずれかを含む行を検索したい場合に利用されます。例えば、「ProductNameに’Pro’か、あるいは’Deluxe’か、あるいは’X’を含む」商品を検索したい場合です。

    例11: ProductNameに’Pro’か、あるいは’Deluxe’か、あるいは’X’を含む商品を検索

    sql
    SELECT ProductID, ProductName
    FROM Products
    WHERE ProductName LIKE '%Pro%' OR ProductName LIKE '%Deluxe%' OR ProductName LIKE '%X%';

    データセットを見ると、
    * ProductName ‘%Pro%’ にマッチするのは ID 101 (‘Laptop Pro 15’).
    * ProductName ‘%Deluxe%’ にマッチするのは ID 102 (‘Office Chair Deluxe’).
    * ProductName ‘%X%’ にマッチするのは ID 103 (‘Smartphone X’).
    * いずれかの条件を満たすのは ID 101, 102, 103 です。

    結果:

    ProductID ProductName
    101 Laptop Pro 15
    102 Office Chair Deluxe
    103 Smartphone X

    このパターンは、ユーザーが入力した複数の検索語句のいずれかがテキスト列に含まれる行を検索するようなアプリケーションで頻繁に使用されます。IN句が特定の値のリストに対して機能するのに対し、この方法は特定のパターンのリストに対して機能すると考えることができます。

    もし検索したいパターンが多くある場合、ORを多数繋げるのは可読性が低下します。一部のデータベースシステム(PostgreSQLなど)では、正規表現マッチング演算子(~)や、配列に対する操作など、より簡潔な代替手段が提供されている場合もありますが、標準SQLの範囲ではORを連ねるのが一般的な方法です。

  3. LIKE条件と他の比較条件をORで結合
    これも可能な組み合わせです。例えば、「ProductNameに’Tablet’を含むか、あるいはPriceが100より小さい」商品を検索したい場合です。

    例12: ProductNameに’Tablet’を含むか、あるいはPriceが100.00より小さい商品を検索

    sql
    SELECT ProductID, ProductName, Price
    FROM Products
    WHERE ProductName LIKE '%Tablet%' OR Price < 100.00;

    データセットを見ると、
    * ProductName ‘%Tablet%’ にマッチするのは ID 105 (‘Tablet Lite’).
    * Price < 100.00 にマッチするのは ID 104 (50.00), 106 (120.00), 108 (25.00), 109 (30.00), 110 (3.50) — Wait, 106 price is 120, not less than 100. Let’s correct. Price < 100.00: ID 104 (50.00), 108 (25.00), 109 (30.00), 110 (3.50).
    * いずれかの条件を満たすのは ID 105 (Tablet Lite) と、Price < 100.00 の商品群 (104, 108, 109, 110) です。

    Corrected Result:

    ProductID ProductName Price
    105 Tablet Lite 300.00
    104 Desk Lamp LED 50.00
    108 Wireless Mouse 25.00
    109 Storage Box Large 30.00
    110 Apple Juice 1L 3.50

    このクエリは、テキストパターンまたは数値条件のいずれかを満たす行を抽出します。

LIKE、AND、ORの組み合わせ:複雑な検索ロジックの構築

これまでに見てきたLIKEAND/ORの基本的な組み合わせをさらに発展させ、これら三つの要素を同時に使用することで、より複雑で洗練された検索ロジックを構築できます。この際に重要となるのが、論理演算子の評価順序です。

SQLでは、基本的にANDORよりも先に評価されます。これは、算数における乗算が加算より先に評価されるのと似ています。しかし、このデフォルトの評価順序は、括弧 () を使用することで変更できます。括弧内の条件は、括弧の外の条件よりも先に評価されます。

複雑な条件を記述する際は、意図しない評価順序による誤りを防ぎ、またクエリの可読性を向上させるためにも、積極的に括弧を使用することを強く推奨します。

複雑な組み合わせの例をいくつか見てみましょう。

例13: (ProductNameに’Pro’を含むか、あるいは’Deluxe’を含む) かつ Categoryが’Electronics’である商品を検索

このクエリは、ProductNameが特定のパターンのいずれかにマッチし、かつ特定のカテゴリに属する商品を検索します。

sql
SELECT ProductID, ProductName, Category
FROM Products
WHERE (ProductName LIKE '%Pro%' OR ProductName LIKE '%Deluxe%')
AND Category = 'Electronics';

評価順序:
1. まず括弧内の (ProductName LIKE '%Pro%' OR ProductName LIKE '%Deluxe%') が評価されます。これは ProductName が ‘Pro’ を含むか、または ‘Deluxe’ を含む場合に真となります。
* ID 101 (‘Laptop Pro 15’) は ‘%Pro%’ にマッチするので真。
* ID 102 (‘Office Chair Deluxe’) は ‘%Deluxe%’ にマッチするので真。
* ID 103 (‘Smartphone X’) はどちらにもマッチしないので偽。
* 他の行も偽。
したがって、括弧内の条件が真となるのは ID 101 と 102 です。
2. 次に、括弧内の結果(真/偽)と Category = 'Electronics' という条件が AND で結合されて評価されます。
* ID 101: (真) AND (Category ‘Electronics’ -> 真) = 真
* ID 102: (真) AND (Category ‘Furniture’ -> 偽) = 偽
* ID 103: (偽) AND (Category ‘Electronics’ -> 真) = 偽
* 他の行: (偽) AND (…) = 偽
したがって、最終的な条件が真となるのは ID 101 のみです。

結果:

ProductID ProductName Category
101 Laptop Pro 15 Electronics

この例では、括弧によって ORAND よりも先に評価されています。もし括弧がなかったらどうなるでしょうか?

sql
SELECT ProductID, ProductName, Category
FROM Products
WHERE ProductName LIKE '%Pro%' OR ProductName LIKE '%Deluxe%'
AND Category = 'Electronics'; -- 括弧なし

評価順序 (括弧なしの場合):
1. ANDOR より先に評価されます。まず ProductName LIKE '%Deluxe%' AND Category = 'Electronics' が評価されます。
* ProductName LIKE '%Deluxe%' は ID 102 で真。
* Category = 'Electronics' は ID 101, 103, 105, 106, 108 で真。
* この AND 条件が真となるのは、ProductName が ‘Deluxe’ を含み、かつ Category が ‘Electronics’ である場合です。データには該当する行がありません(ID 102 は Category が ‘Furniture’)。したがって、この AND の結果は常に偽です。
2. 次に、ProductName LIKE '%Pro%' という条件と、前のステップで計算された ProductName LIKE '%Deluxe%' AND Category = 'Electronics' の結果(偽)が OR で結合されて評価されます。
* ProductName LIKE '%Pro%' は ID 101 で真。
* 全体の条件: (ID 101 に対して 真 OR 偽) = 真
* 全体の条件: (ID 102 に対して 偽 OR 偽) = 偽
* 全体の条件: (他の行に対して 偽 OR 偽) = 偽
したがって、最終的な条件が真となるのは ID 101 のみです。

結果:

ProductID ProductName Category
101 Laptop Pro 15 Electronics

この特定の例では、たまたま括弧の有無で最終結果が同じになりましたが、これはデータによるものです。多くの場合は結果が変わる、あるいは意図した検索にならない可能性が非常に高いです。

例14: ProductNameに’Laptop’を含むか、あるいは (Categoryが’Furniture’であり かつ Priceが400より大きい) 商品を検索

このクエリは、ProductNameが特定のパターンにマッチするか、あるいは特定のカテゴリに属しかつ価格も特定の条件を満たす商品を検索します。

sql
SELECT ProductID, ProductName, Category, Price
FROM Products
WHERE ProductName LIKE '%Laptop%'
OR (Category = 'Furniture' AND Price > 400.00);

評価順序:
1. まず括弧内の (Category = 'Furniture' AND Price > 400.00) が評価されます。
* Category = ‘Furniture’ は ID 102, 104, 107 で真。
* Price > 400.00 は ID 101, 103, 107 で真。
* 両方が真となるのは ID 107 (‘Dining Table 4-seater’, Category ‘Furniture’, Price 600.00) のみです。
したがって、括弧内の条件が真となるのは ID 107 です。
2. 次に、ProductName LIKE '%Laptop%' という条件と、前のステップで計算された括弧内の結果(真/偽)が OR で結合されて評価されます。
* ProductName LIKE '%Laptop%' は ID 101 で真。
* ID 101: (真) OR (括弧内 偽) = 真
* ID 107: (偽) OR (括弧内 真) = 真
* 他の行: (偽) OR (括弧内 偽) = 偽
したがって、最終的な条件が真となるのは ID 101 と 107 です。

結果:

ProductID ProductName Category Price
101 Laptop Pro 15 Electronics 1500.00
107 Dining Table 4-seater Furniture 600.00

このように、括弧を適切に使用することで、複雑な条件グループを意図した通りに結合し、正確な検索ロジックを表現することができます。

NOT LIKEの使用:パターンに一致しない検索

LIKEの否定形として、NOT LIKEを使用することができます。これは「指定したパターンに合致しない」データを検索したい場合に役立ちます。NOT LIKEAND/ORと組み合わせて使用できます。

例15: ProductNameに’Pro’を含まない商品を検索

sql
SELECT ProductID, ProductName
FROM Products
WHERE ProductName NOT LIKE '%Pro%';

結果:

ProductID ProductName
102 Office Chair Deluxe
103 Smartphone X
104 Desk Lamp LED
105 Tablet Lite
106 Mechanical Keyboard
107 Dining Table 4-seater
108 Wireless Mouse
109 Storage Box Large
110 Apple Juice 1L

LIKEと同様に、NOT LIKEAND/ORや他の条件と組み合わせることで、さらに複雑な除外条件を設定できます。

例16: Categoryが’Electronics’であり、かつProductNameに’Pro’も’X’も含まない商品を検索

sql
SELECT ProductID, ProductName, Category
FROM Products
WHERE Category = 'Electronics'
AND ProductName NOT LIKE '%Pro%'
AND ProductName NOT LIKE '%X%';

評価:
* Category = 'Electronics' にマッチするのは ID 101, 103, 105, 106, 108。
* ProductName NOT LIKE '%Pro%' にマッチするのは ID 102, 103, 104, 105, 106, 107, 108, 109, 110。
* ProductName NOT LIKE '%X%' にマッチするのは ID 101, 102, 104, 105, 106, 107, 108, 109, 110。
* これら3つの条件すべてにマッチする行をANDで結合して探します。
* ID 101: (真) AND (偽) AND (真) = 偽
* ID 103: (真) AND (真) AND (偽) = 偽
* ID 105: (真) AND (真) AND (真) = 真
* ID 106: (真) AND (真) AND (真) = 真
* ID 108: (真) AND (真) AND (真) = 真
* 他の行は最初の条件で偽となるため、全体の条件も偽。
したがって、結果は ID 105, 106, 108 です。

結果:

ProductID ProductName Category
105 Tablet Lite Electronics
106 Mechanical Keyboard Electronics
108 Wireless Mouse Electronics

例17: ProductNameに’Laptop’も’Tablet’も含まない商品を検索

sql
SELECT ProductID, ProductName
FROM Products
WHERE ProductName NOT LIKE '%Laptop%' AND ProductName NOT LIKE '%Tablet%';

このクエリは、ProductNameが「Laptop」を含まず、かつ「Tablet」も含まない商品を検索します。これは、NOT (ProductName LIKE '%Laptop%' OR ProductName LIKE '%Tablet%') と論理的に等価です(ド・モルガンの法則)。

結果は、ProductNameに’Laptop’(ID 101)または’Tablet’(ID 105)を含む商品を除いたすべての商品となります。

ProductID ProductName
102 Office Chair Deluxe
103 Smartphone X
104 Desk Lamp LED
106 Mechanical Keyboard
107 Dining Table 4-seater
108 Wireless Mouse
109 Storage Box Large
110 Apple Juice 1L

例18: ProductNameが’A’で始まるか、あるいはDescriptionに’design’を含まない商品を検索

sql
SELECT ProductID, ProductName, Description
FROM Products
WHERE ProductName LIKE 'A%' OR Description NOT LIKE '%design%';

評価:
* ProductName LIKE 'A%' にマッチするのは ID 110 (‘Apple Juice 1L’)。
* Description NOT LIKE '%design%' にマッチするのは、Descriptionが’design’を含まない行です。ID 102 (‘Office Chair Deluxe’)のDescription (‘Ergonomic design’) 以外のすべての行がこれにマッチします。つまり、ID 101, 103, 104, 105, 106, 107, 108, 109, 110 です。
* これらの条件をORで結合します。
* ID 110: (真) OR (真) = 真
* ID 102: (偽) OR (偽) = 偽
* ID 101, 103, 104, 105, 106, 107, 108, 109: (偽) OR (真) = 真
したがって、ID 102 以外のすべての行が結果となります。

結果:

ProductID ProductName Description
101 Laptop Pro 15 High-performance notebook
103 Smartphone X Latest model with great camera
104 Desk Lamp LED Energy-saving lamp
105 Tablet Lite Lightweight and portable
106 Mechanical Keyboard Durable keys for typing
107 Dining Table 4-seater Solid wood construction
108 Wireless Mouse Compact and responsive
109 Storage Box Large Multi-purpose storage
110 Apple Juice 1L 100% pure apple juice

このように、NOT LIKEAND/ORを組み合わせることで、「〜であり、かつ〜ではない」や「〜であるか、あるいは〜ではない」といった複雑な条件による絞り込みが可能になります。

実践的な考慮事項とベストプラクティス

LIKEAND/ORを組み合わせた検索は非常に強力ですが、いくつかの実践的な考慮事項とベストプラクティスがあります。

  1. パフォーマンスへの影響:

    • LIKE句は、特にワイルドカード(%_)がパターンの先頭に置かれている場合(例: WHERE column LIKE '%pattern'WHERE column LIKE '_pattern')、通常、その列に作成されたインデックスを効率的に利用できません。これは、データベースが文字列の先頭から順に比較していくことが難しいためです。結果として、テーブル全体をスキャン(フルスキャン)する必要が生じ、大規模なテーブルではパフォーマンスが著しく低下する可能性があります。
    • ワイルドカードがパターンの末尾にのみ置かれている場合(例: WHERE column LIKE 'pattern%') は、インデックスを比較的効率的に利用できる場合があります(特にB-treeインデックスの場合)。
    • 多数のOR条件をLIKEで結合する場合も、データベースが各条件を個別に評価する必要があるため、パフォーマンスに影響を与える可能性があります。
    • 対策:
      • 可能な限り、ワイルドカードが先頭に来るパターンは避ける、あるいは必要な範囲に限定する。
      • 検索要件を再検討し、よりインデックスフレンドリーな方法(例: 全文検索機能の利用、検索用の中間テーブル作成など)がないか検討する。
      • パフォーマンスが critical な場合は、特定のデータベースシステムが提供する全文検索インデックス(Full-Text Index)などの機能を検討する。これはテキストデータの高速なパターンマッチングに特化しています。
      • 複雑なWHERE句を持つクエリの実行計画を確認し、パフォーマンスボトルネックとなっている箇所を特定する。
      • データ量が多い場合は、検索範囲を絞る(例: 日付範囲指定など)他の条件とANDで組み合わせることで、LIKEが適用される行数を減らす。
  2. ケースセンシティブ(大文字・小文字の区別):

    • LIKE句が大文字・小文字を区別するかどうかは、使用しているデータベースシステムの種類、バージョン、およびテーブル/列の照合順序(Collation)設定によって異なります。
    • 多くのデータベースシステムのデフォルト設定では、LIKEはケースインセンシティブ(大文字・小文字を区別しない)ですが、特定の照合順序が適用されている場合はケースセンシティブになることもあります。
    • 対策:
      • 検索を常にケースインセンシティブにしたい場合は、検索対象の列と検索パターンを共に大文字または小文字に変換してから比較する方法が確実です。例えば、WHERE LOWER(column) LIKE LOWER('%pattern%')WHERE UPPER(column) LIKE UPPER('%PATTERN%') のようにします。ただし、この方法は関数の呼び出しが入るため、インデックスが利用できなくなる可能性が高く、パフォーマンスに影響を与える可能性があります。
      • 特定のデータベースシステムでは、ケースインセンシティブな照合順序を列やデータベース全体に設定することで、LIKEが自動的にケースインセンシティブになるように構成できます。
  3. 可読性の向上:

    • LIKEANDOR、そして複数の括弧が複雑に組み合わさると、クエリは非常に読みにくくなります。
    • 対策:
      • 前述のように、意図しない評価順序を防ぐだけでなく、可読性のためにも積極的に括弧を使用しましょう。
      • インデントや改行を使って、条件式を見やすく整形しましょう。
      • 複雑なクエリにはコメントを付けて、そのロジックを説明しましょう。
      • あまりにも複雑になる場合は、クエリをより単純な複数のステップに分割できないか検討したり、ビュー(View)を利用して中間結果を作成したりすることも有効です。
  4. ワイルドカード文字自体の検索:

    • パターンとして %_ という文字そのものを検索したい場合は、エスケープ文字を使用する必要があります。標準SQLでは ESCAPE キーワードを使ってエスケープ文字を指定します。
    • 例: WHERE column LIKE '%50\_%' ESCAPE '\' は、「50_」という文字列を含むデータを検索します。ここでは \ をエスケープ文字として指定し、その直後の _ がワイルドカードではなく文字として扱われるようにしています。
    • 使用するエスケープ文字は任意に設定できます。

まとめ

SQLのLIKE句は、文字列データのパターンマッチングを可能にする強力な機能です。そして、論理演算子であるANDORを組み合わせることで、このパターン検索をさらに柔軟で複雑な条件に拡張することができます。

  • LIKEANDの組み合わせは、複数の異なるパターンにすべて合致する行を検索する際に使用します(例: 「名前がAで始まり、かつ住所に東京を含む」)。
  • LIKEORの組み合わせは、複数のパターンのいずれかに合致する行を検索する際に使用します(例: 「名前がAで始まるか、あるいは名前がBで始まる」)。
  • LIKEANDORを組み合わせる際には、演算子の評価順序を理解し、意図したロジックを正確に表現するために括弧 () を適切に使用することが非常に重要です。
  • NOT LIKEを使用することで、指定したパターンに一致しない行を検索できます。これもAND/ORと組み合わせて複雑な除外条件を設定できます。

これらの組み合わせを習得することで、テキストデータに対する検索能力は格段に向上します。しかし、その強力さゆえに、特にパフォーマンス(LIKE句とインデックス)やケースセンシティブな振る舞いについては注意が必要です。クエリを作成する際には、これらの実践的な考慮事項も念頭に置き、効率的かつ正確な検索を実現してください。

データベースに対する検索は、データ分析、レポート作成、アプリケーション開発など、あらゆる場面で中心的な役割を果たします。本記事で解説したLIKEAND/ORの組み合わせテクニックは、より高度なデータ操作への第一歩となるでしょう。ぜひ実際に手を動かし、様々な検索条件を試しながら理解を深めていってください。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール