PostgreSQL 入門

SQL WHERE句

WHERE句はSQLの基礎的な構成要素であり、特定の条件に基づいてデータをフィルタリング(フィルタ)することを可能にします。これは、ターゲットを絞ったクエリを作成し、必要な情報のみを抽出するための基盤となります。適切にWHERE句を使いこなすことで、データ分析やアプリケーションロジックの効率が大幅に向上します。本章では、WHERE句における比較演算子と論理演算子の使い方を詳しく解説し、強力かつ精密なデータフィルタを作成する手法を学びます。

1. 比較演算子

比較演算子は、あるカラムの値を特定の値、あるいは別のカラムの値と比較するために使用されます。これらの演算子は、WHERE句における条件式の最も基本的なブロックとなります。

1.1 等号 (=)

等号演算子は、カラムの値が指定した値と完全に一致するかどうかをチェックします。

例: product_id(製品ID)、product_name(製品名)、price(価格)などのカラムを持つ products(製品)テーブルを想定します。

SELECT product_name, price
FROM products
WHERE price = 24.99;

このクエリは、products テーブルの中で price が正確に 24.99 であるすべての行を返します。

コードの解説:

  • SELECT product_name, price: 取得するカラムを指定します。
  • FROM products: データを取得するテーブルを指定します。
  • WHERE price = 24.99: price カラムが 24.99 に等しい行のみをフィルタリングします。

1.2 不等号 (!= または <>)

不等号演算子(!= および <>)は、カラムの値が指定した値と等しくないかどうかをチェックします。これら2つの演算子の効果は全く同じです。

例:

SELECT product_name, price
FROM products
WHERE price != 24.99; -- または WHERE price <> 24.99; と記述

このクエリは、価格が 24.99 ではないすべての製品を返します。

コードの解説:

  • WHERE price != 24.99 句により、price が 24.99 以外の行のみが抽出されます。

1.3 より大きい (>)

「より大きい」演算子は、カラムの値が指定した値よりも大きいかどうかをチェックします。

例:

SELECT product_name, price
FROM products
WHERE price > 50.00;

このクエリは、価格が 50.00 を超えるすべての製品を返します。

コードの解説:

  • WHERE price > 50.00 句により、price が 50.00 より大きい行のみがフィルタリングされます。

1.4 より小さい (<)

「より小さい」演算子は、カラムの値が指定した値よりも小さいかどうかをチェックします。

例:

SELECT product_name, price
FROM products
WHERE price < 10.00;

このクエリは、価格が 10.00 未満のすべての製品を返します。

コードの解説:

  • WHERE price < 10.00 句により、price が 10.00 より小さい行のみがフィルタリングされます。

1.5 以上 (>=)

「以上」演算子は、カラムの値が指定した値以上(その値を含む)であるかどうかをチェックします。

例:

SELECT product_name, price
FROM products
WHERE price >= 50.00;

このクエリは、価格が 50.00 またはそれ以上のすべての製品を返します。

コードの解説:

  • WHERE price >= 50.00 句により、price が 50.00 に等しいか、それより大きい行のみが抽出されます。

1.6 以下 (<=)

「以下」演算子は、カラムの値が指定した値以下(その値を含む)であるかどうかをチェックします。

例:

SELECT product_name, price
FROM products
WHERE price <= 10.00;

このクエリは、価格が 10.00 またはそれ以下のすべての製品を返します。

コードの解説:

  • WHERE price <= 10.00 句により、price が 10.00 に等しいか、それより小さい行のみが抽出されます。

1.7 BETWEEN (範囲指定)

BETWEEN 演算子は、指定した範囲内に値が含まれるかどうかを判定します。この演算子は範囲の開始値と終了値を含みます(境界値を含む)。

例:

SELECT product_name, price
FROM products
WHERE price BETWEEN 20.00 AND 30.00;

このクエリは、価格が 20.00 から 30.00 の間(20.00 と 30.00 を含む)にあるすべての製品を返します。

コードの解説:

  • WHERE price BETWEEN 20.00 AND 30.00 は、WHERE price >= 20.00 AND price <= 30.00 と同等です。

1.8 LIKE (パターンマッチング)

LIKE 演算子はパターンマッチング(曖昧検索)に使用されます。通常、以下のワイルドカードと共に使用されます。

  • %:0文字、1文字、または複数文字の任意の文字列を表します。
  • _:任意の1文字を表します。

% を使用した例:

SELECT product_name
FROM products
WHERE product_name LIKE 'Laptop%';

このクエリは、"Laptop" で始まるすべての製品名を返します。

コードの解説:

  • WHERE product_name LIKE 'Laptop%' は、product_name が "Laptop" で始まる行をフィルタリングします。% ワイルドカードは "Laptop の後ろに続く任意の文字列" を意味します。

アンダースコア _ を使用した例:

SELECT product_name
FROM products
WHERE product_name LIKE 'C_t';

このクエリは、"C" で始まり、2文字目は任意の1文字、かつ "t" で終わるすべての製品名を返します。例えば、"Cat"、"Cot"、"Cut" などがマッチします。

1.9 IN (リスト指定)

IN 演算子を使用すると、指定した値のリストのいずれかに一致するかどうかを判定できます。

例:

SELECT product_name, price
FROM products
WHERE product_id IN (1, 2, 3);

このクエリは、product_id が 1、2、または 3 であるすべての製品を返します。

コードの解説:

  • WHERE product_id IN (1, 2, 3) は、product_id が指定したリスト内に存在する行のみをフィルタリングします。

1.10 IS NULL と IS NOT NULL (NULLチェック)

これら2つの演算子は、NULL値(空の値)をチェックするために使用されます。NULL は「値が欠落している」または「未知である」状態を表します。NULL に対しては、=!= を使って判定することはできません。

IS NULL の例:

SELECT product_name, discount
FROM products
WHERE discount IS NULL;

このクエリは、discount(割引)カラムが NULL であるすべての製品を返します。

IS NOT NULL の例:

SELECT product_name, discount
FROM products
WHERE discount IS NOT NULL;

このクエリは、discount カラムに値が入っている(NULL ではない)すべての製品を返します。

2. 論理演算子

論理演算子は、WHERE句の中で複数の条件を組み合わせるために使用されます。

2.1 AND (論理積)

AND 演算子は、演算子の両側の条件がどちらも真(True)である場合にのみ、その行を結果セットに含めます。

例:

SELECT product_name, price, category
FROM products
WHERE price > 20.00 AND category = 'Electronics';

このクエリは、価格が 20.00 より高く、かつ カテゴリが 'Electronics'(電子機器)に属するすべての製品を返します。

コードの解説:

  • WHERE price > 20.00 AND category = 'Electronics' は、これら2つの条件を同時に満たす行のみを返します。

2.2 OR (論理和)

OR 演算子は、演算子の両側の条件のうち少なくとも一方が真である場合に、その行を結果セットに含めます。

例:

SELECT product_name, price, category
FROM products
WHERE price > 50.00 OR category = 'Clothing';

このクエリは、価格が 50.00 より高い、あるいは カテゴリが 'Clothing'(衣類)に属するすべての製品を返します(片方、または両方を満たすすべての行が対象です)。

コードの解説:

  • WHERE price > 50.00 OR category = 'Clothing' は、少なくとも一つの条件を満たせば抽出されます。

2.3 NOT (論理否定)

NOT 演算子は、条件の結果を反転(否定)させます。

例:

SELECT product_name, price
FROM products
WHERE NOT category = 'Electronics';

このクエリは、カテゴリが 'Electronics'(電子機器)ではないすべての製品を返します。

コードの解説:

  • WHERE NOT category = 'Electronics' は条件を反転させ、category が 'Electronics' 以外の行を選択します。

NOT LIKE との組み合わせ例:

SELECT product_name
FROM products
WHERE product_name NOT LIKE 'Laptop%';

このクエリは、名称が "Laptop" で始まらないすべての製品を返します。

3. 演算子の優先順位

複数の論理演算子を組み合わせる場合、演算子の優先順位を理解することが非常に重要です。

優先順位は、NOT が最も高く、次に AND、最後に OR の順となります。

デフォルトの優先順位を上書きし、評価順序を制御するには、括弧 () を使用します。

括弧を使用しない例:

SELECT product_name, price, category
FROM products
WHERE category = 'Electronics' OR category = 'Clothing' AND price < 25.00;

括弧がない場合、このクエリは次のように解釈されます。
WHERE category = 'Electronics' OR (category = 'Clothing' AND price < 25.00);

つまり、以下のデータが返されます:

  1. 'Electronics' カテゴリのすべての製品
  2. 'Clothing' カテゴリのうち、価格が 25.00 未満の製品

括弧を使用した例:

SELECT product_name, price, category
FROM products
WHERE (category = 'Electronics' OR category = 'Clothing') AND price < 25.00;

括弧があることで、クエリは明確に次のように解釈されます:
WHERE (category = 'Electronics' OR category = 'Clothing') AND price < 25.00;

これにより、以下のデータが返されます:

  1. 'Electronics' または 'Clothing' カテゴリに属する製品
  2. かつ、それらの製品の価格が 25.00 未満であること

4. 比較演算子と論理演算子の組み合わせ

比較演算子と論理演算子を組み合わせることで、極めて複雑なフィルタを作成できます。

例:

SELECT product_name, price, category, discount
FROM products
WHERE (price > 25.00 AND category = 'Home Goods') OR (discount > 0.10 AND category = 'Books');

このクエリは、以下のいずれかの条件を満たす製品を返します:

  • 価格が 25.00 を超え、かつ 'Home Goods'(家庭用品)カテゴリに属する製品
  • 割引率が 0.10 を超え、かつ 'Books'(書籍)カテゴリに属する製品