条件を指定するWHERE句
表から、いつもすべての行を読み出す必要はありません。SELECT文では、必要な列を指定することができますが、データの中から条件に合致するものだけを読み出したいこともあります。これを実現するのが条件を付けた検索です。
条件を付けた検索には、WHERE句を用います。WHERE句を含んだ問合せの書式は次のようになります。
WHERE句は後ろに検索条件を指定します。検索条件には条件を表す式を記述し、その条件に合致した行が問合せの結果として出力されます。式には、=演算子などの比較演算子を使います。
ここでは、次の「商品マスタ」表を使って解説していきます。
表:商品マスタ
商品名 | カテゴリ | 仕入先 | 単価 |
燃えない灯油 | アイデア商品 | 空想科学社 | 1200 |
燃える水 | アイデア商品 | 空想科学社 | 1500 |
穴のあいた財布 | 非実用商品 | 財布堂 | 8000 |
毛のない毛筆 | 非実用商品 | 奇想.inc | 700 |
座る板がない椅子 | 非実用商品 | 奇想.inc | 6000 |
答え付き答案 | 実用商品 | カンニング社 | 9800 |
火星語辞典 | 実用商品 | カンニング社 | 1800 |
まずは、「商品マスタ」表から、カテゴリの値が「実用商品」のデータだけを読み出してみましょう。
SELECT * FROM 商品マスタ WHERE カテゴリ='実用商品';
実行結果
商品名 | カテゴリ | 仕入先 | 単価 |
答え付き答案 | 実用商品 | カンニング社 | 9800 |
火星語辞典 | 実用商品 | カンニング社 | 1800 |
SELECT * FROM 商品マスタ WHERE 単価 > 2000 ;
実行結果
商品名 | カテゴリ | 仕入先 | 単価 |
穴のあいた財布 | 非実用商品 | 財布堂 | 8000 |
座る板がない椅子 | 非実用商品 | 奇想.inc | 6000 |
答え付き答案 | 実用商品 | カンニング社 | 9800 |
複合条件で問合せ
検索に使う条件は、1つだけでなく複数を指定することができます。
複数の条件を指定するときには、考えなくてはならないことがあります。それは、複数の条件の関係が「共に満たす」のか「どちらかの条件を満たす」のかといった点です。要するに複数の条件を指定するときには、指定された条件のすべての条件を満たすのか、どれか1つを満たすのかを指定する必要があります。この指定にはこちらで解説している論理演算子を使います。
まずは、AND演算子で複合条件のお問合せを行った例を見てみましょう。
SELECT * FROM 商品マスタ WHERE カテゴリ='非実用商品' AND 単価 > 1000;
実行結果
商品名 | カテゴリ | 仕入先 | 単価 |
穴のあいた財布 | 非実用商品 | 財布堂 | 8000 |
座る板がない椅子 | 非実用商品 | 奇想.inc | 6000 |
この結果を見てわかるように、AND演算子を使うことで、「カテゴリ」列が「非実用商品」で、「単価」列が「1000以上」の両方の条件に合致するデータが出力されています。
また条件は2つだけでなく、それ以上の条件を設定することも可能でえす。上記のSQL文にさらにもう1つ条件を追加してみましょう。「仕入先」列が「財布堂」であるという条件を追加すると、次のような結果になります。
SELECT * FROM 商品マスタ
WHERE カテゴリ='非実用商品' AND 単価 > 1000 AND 仕入先='財布堂';
実行結果
商品名 | カテゴリ | 仕入先 | 単価 |
穴のあいた財布 | 非実用商品 | 財布堂 | 8000 |
今度は、指定した条件のどれか1つだけでも合致すればよいという指定に使う、OR演算子を使ってみましょう。
SELECT * FROM 商品マスタ
WHERE カテゴリ='非実用商品' OR カテゴリ='アイデア商品';
商品名 | カテゴリ | 仕入先 | 単価 |
燃えない灯油 | アイデア商品 | 空想科学社 | 1200 |
燃える水 | アイデア商品 | 空想科学社 | 1500 |
穴のあいた財布 | 非実用商品 | 財布堂 | 8000 |
毛のない毛筆 | 非実用商品 | 奇想.inc | 700 |
座る板がない椅子 | 非実用商品 | 奇想.inc | 6000 |
このように、どちらかの条件に合致したものはすべて問合せ結果として出力されています。
また、AND演算子とOR演算子の両方を同時に使うこともできます。このときの演算子の優先順位は、論理演算子のこちらで解説しているように、記述順に演算が行われます。記述順を変えずに優先順位を変更したい場合は、優先する条件式を「( )」で囲むようにしてください。