はい、承知いたしました。SQLのLIKE
句と論理演算子(AND
, OR
)を組み合わせた複数条件検索について、詳細な説明を含む約5000語の記事を作成します。
以下に記事の内容を直接表示します。
SQLにおける強力な検索テクニック:LIKEとAND/ORを組み合わせた複数条件検索をマスターする
データ検索は、リレーショナルデータベースを扱う上で最も基本的な操作であり、その精度と効率は分析やアプリケーションの品質に直結します。特に、厳密な一致だけでなく、パターンに基づいた柔軟な検索が求められる場面は頻繁に発生します。SQLでは、このパターン検索を可能にするのがLIKE
句です。
しかし、実際の業務では、単一の条件だけでなく、複数の条件を組み合わせてデータを絞り込む必要があります。例えば、「特定の商品名パターンに一致し、かつ特定のカテゴリに属する」商品や、「特定のキーワードを含むメールアドレスを持つか、あるいは特定の地域に住んでいる」顧客を検索するなどです。このような複雑な検索要件を満たすためには、LIKE
句と論理演算子であるAND
およびOR
を効果的に組み合わせるテクニックが不可欠となります。
本記事では、SQLのLIKE
句、AND
、OR
の基本的な使い方から始まり、これらを組み合わせてより高度で柔軟な複数条件検索を実現する方法について、具体的な例を豊富に交えながら詳細に解説します。約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
句です。
また、検索条件が複数存在する場合、それらをどのように組み合わせるかを決定するのが論理演算子AND
とOR
です。
AND
: 複数の条件がすべて真である場合に、全体の条件が真となります。より厳しい絞り込みを行います。OR
: 複数の条件のうち、いずれか一つでも真であれば、全体の条件が真となります。より広い範囲のデータを取得します。
これらの基本的な要素であるLIKE
、AND
、OR
を組み合わせることで、データベースに対する検索の可能性は飛躍的に広がります。
SQL LIKE句の深掘り:パターンマッチングの基礎
LIKE
句は、文字列のパターンマッチングに使用されます。LIKE
句を使用する際には、特定のワイルドカード文字を用いてパターンを定義します。主要なワイルドカードは以下の二つです。
%
(パーセント記号): 0個以上の任意の文字を表します。- 例:
'Apple%'
は「Apple」で始まる任意の文字列(”Apple”, “Apple Pie”, “Apples” など)にマッチします。 - 例:
'%phone'
は「phone」で終わる任意の文字列(”smartphone”, “telephone” など)にマッチします。 - 例:
'%data%'
は「data」を含む任意の文字列(”database”, “big data”, “data analysis” など)にマッチします。 - 例:
'%'
は任意の文字列すべてにマッチします(NULLを除く)。
- 例:
_
(アンダースコア): ちょうど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論理演算子の復習:複数条件の結合
AND
とOR
は、複数の条件式を組み合わせて一つの大きな条件式を作成するために使用されます。
条件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
で組み合わせることで、「特定の複数のパターンにすべて合致する」データを検索することができます。これは、検索対象の文字列が複数の異なる性質やキーワードを持っている場合などに有効です。
組み合わせ方にはいくつかのパターンがあります。
-
異なる列に対する複数の
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
で結合することで、複数の属性に基づいたパターン検索が実現できます。 -
同じ列に対する複数の
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’ も検索したい場合)。 -
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 matchPrice < 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 beenPrice > 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 toPrice > 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
で組み合わせることで、「指定された複数のパターンのいずれかに合致する」データを検索することができます。これは、検索対象が複数の異なるキーワードやパターンである場合に非常に有効です。
組み合わせ方にもいくつかのパターンがあります。
-
異なる列に対する複数の
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 この組み合わせは、複数の検索キーに対して「いずれかにヒットすればよい」という要件でデータを収集する際によく使われます。
-
同じ列に対する複数の
LIKE
条件をOR
で結合
これはOR
とLIKE
を組み合わせる中で最も一般的で強力なパターンの一つです。一つの列に対して、複数の異なるキーワードやフレーズのいずれかを含む行を検索したい場合に利用されます。例えば、「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
を連ねるのが一般的な方法です。 -
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の組み合わせ:複雑な検索ロジックの構築
これまでに見てきたLIKE
とAND
/OR
の基本的な組み合わせをさらに発展させ、これら三つの要素を同時に使用することで、より複雑で洗練された検索ロジックを構築できます。この際に重要となるのが、論理演算子の評価順序です。
SQLでは、基本的にAND
はOR
よりも先に評価されます。これは、算数における乗算が加算より先に評価されるのと似ています。しかし、このデフォルトの評価順序は、括弧 ()
を使用することで変更できます。括弧内の条件は、括弧の外の条件よりも先に評価されます。
複雑な条件を記述する際は、意図しない評価順序による誤りを防ぎ、またクエリの可読性を向上させるためにも、積極的に括弧を使用することを強く推奨します。
複雑な組み合わせの例をいくつか見てみましょう。
例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 |
この例では、括弧によって OR
が AND
よりも先に評価されています。もし括弧がなかったらどうなるでしょうか?
sql
SELECT ProductID, ProductName, Category
FROM Products
WHERE ProductName LIKE '%Pro%' OR ProductName LIKE '%Deluxe%'
AND Category = 'Electronics'; -- 括弧なし
評価順序 (括弧なしの場合):
1. AND
が OR
より先に評価されます。まず 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 LIKE
もAND
/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 LIKE
もAND
/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 LIKE
とAND
/OR
を組み合わせることで、「〜であり、かつ〜ではない」や「〜であるか、あるいは〜ではない」といった複雑な条件による絞り込みが可能になります。
実践的な考慮事項とベストプラクティス
LIKE
とAND
/OR
を組み合わせた検索は非常に強力ですが、いくつかの実践的な考慮事項とベストプラクティスがあります。
-
パフォーマンスへの影響:
LIKE
句は、特にワイルドカード(%
や_
)がパターンの先頭に置かれている場合(例:WHERE column LIKE '%pattern'
やWHERE column LIKE '_pattern'
)、通常、その列に作成されたインデックスを効率的に利用できません。これは、データベースが文字列の先頭から順に比較していくことが難しいためです。結果として、テーブル全体をスキャン(フルスキャン)する必要が生じ、大規模なテーブルではパフォーマンスが著しく低下する可能性があります。- ワイルドカードがパターンの末尾にのみ置かれている場合(例:
WHERE column LIKE 'pattern%'
) は、インデックスを比較的効率的に利用できる場合があります(特にB-treeインデックスの場合)。 - 多数の
OR
条件をLIKE
で結合する場合も、データベースが各条件を個別に評価する必要があるため、パフォーマンスに影響を与える可能性があります。 - 対策:
- 可能な限り、ワイルドカードが先頭に来るパターンは避ける、あるいは必要な範囲に限定する。
- 検索要件を再検討し、よりインデックスフレンドリーな方法(例: 全文検索機能の利用、検索用の中間テーブル作成など)がないか検討する。
- パフォーマンスが critical な場合は、特定のデータベースシステムが提供する全文検索インデックス(Full-Text Index)などの機能を検討する。これはテキストデータの高速なパターンマッチングに特化しています。
- 複雑な
WHERE
句を持つクエリの実行計画を確認し、パフォーマンスボトルネックとなっている箇所を特定する。 - データ量が多い場合は、検索範囲を絞る(例: 日付範囲指定など)他の条件と
AND
で組み合わせることで、LIKE
が適用される行数を減らす。
-
ケースセンシティブ(大文字・小文字の区別):
LIKE
句が大文字・小文字を区別するかどうかは、使用しているデータベースシステムの種類、バージョン、およびテーブル/列の照合順序(Collation)設定によって異なります。- 多くのデータベースシステムのデフォルト設定では、
LIKE
はケースインセンシティブ(大文字・小文字を区別しない)ですが、特定の照合順序が適用されている場合はケースセンシティブになることもあります。 - 対策:
- 検索を常にケースインセンシティブにしたい場合は、検索対象の列と検索パターンを共に大文字または小文字に変換してから比較する方法が確実です。例えば、
WHERE LOWER(column) LIKE LOWER('%pattern%')
やWHERE UPPER(column) LIKE UPPER('%PATTERN%')
のようにします。ただし、この方法は関数の呼び出しが入るため、インデックスが利用できなくなる可能性が高く、パフォーマンスに影響を与える可能性があります。 - 特定のデータベースシステムでは、ケースインセンシティブな照合順序を列やデータベース全体に設定することで、
LIKE
が自動的にケースインセンシティブになるように構成できます。
- 検索を常にケースインセンシティブにしたい場合は、検索対象の列と検索パターンを共に大文字または小文字に変換してから比較する方法が確実です。例えば、
-
可読性の向上:
LIKE
、AND
、OR
、そして複数の括弧が複雑に組み合わさると、クエリは非常に読みにくくなります。- 対策:
- 前述のように、意図しない評価順序を防ぐだけでなく、可読性のためにも積極的に括弧を使用しましょう。
- インデントや改行を使って、条件式を見やすく整形しましょう。
- 複雑なクエリにはコメントを付けて、そのロジックを説明しましょう。
- あまりにも複雑になる場合は、クエリをより単純な複数のステップに分割できないか検討したり、ビュー(View)を利用して中間結果を作成したりすることも有効です。
-
ワイルドカード文字自体の検索:
- パターンとして
%
や_
という文字そのものを検索したい場合は、エスケープ文字を使用する必要があります。標準SQLではESCAPE
キーワードを使ってエスケープ文字を指定します。 - 例:
WHERE column LIKE '%50\_%' ESCAPE '\'
は、「50_」という文字列を含むデータを検索します。ここでは\
をエスケープ文字として指定し、その直後の_
がワイルドカードではなく文字として扱われるようにしています。 - 使用するエスケープ文字は任意に設定できます。
- パターンとして
まとめ
SQLのLIKE
句は、文字列データのパターンマッチングを可能にする強力な機能です。そして、論理演算子であるAND
とOR
を組み合わせることで、このパターン検索をさらに柔軟で複雑な条件に拡張することができます。
LIKE
とAND
の組み合わせは、複数の異なるパターンにすべて合致する行を検索する際に使用します(例: 「名前がAで始まり、かつ住所に東京を含む」)。LIKE
とOR
の組み合わせは、複数のパターンのいずれかに合致する行を検索する際に使用します(例: 「名前がAで始まるか、あるいは名前がBで始まる」)。LIKE
、AND
、OR
を組み合わせる際には、演算子の評価順序を理解し、意図したロジックを正確に表現するために括弧()
を適切に使用することが非常に重要です。NOT LIKE
を使用することで、指定したパターンに一致しない行を検索できます。これもAND
/OR
と組み合わせて複雑な除外条件を設定できます。
これらの組み合わせを習得することで、テキストデータに対する検索能力は格段に向上します。しかし、その強力さゆえに、特にパフォーマンス(LIKE
句とインデックス)やケースセンシティブな振る舞いについては注意が必要です。クエリを作成する際には、これらの実践的な考慮事項も念頭に置き、効率的かつ正確な検索を実現してください。
データベースに対する検索は、データ分析、レポート作成、アプリケーション開発など、あらゆる場面で中心的な役割を果たします。本記事で解説したLIKE
とAND
/OR
の組み合わせテクニックは、より高度なデータ操作への第一歩となるでしょう。ぜひ実際に手を動かし、様々な検索条件を試しながら理解を深めていってください。