データベース千夜一夜第4回

条件指定によるレコードの絞り込み(1)
~WHERE句と条件式の基本事項
長谷川裕行
有限会社 手國堂

3つ以上の条件式をつなぐ

間に論理演算子を複数挟んで条件式をつないでいけば、3つ以上の条件を一度に指定できます。しかしその場合、式の並べ方によっては意図した結果が反映されないことがあります。


- 3つの条件で抽出する -

例えば「仕入単価が5,000円~10,000円の商品で、在庫数が10以下のもの」を知りたいとします。条件を整理すると、以下のようになります。

  「在庫」フィールドの値が10以下で、
  なおかつ
  「仕入単価」フィールドの値が5000以上
  なおかつ
  「仕入単価」フィールドの値が10000以下

従って、以下のようなSQLとなります(画面11)。

  SELECT * FROM 商品_mr WHERE
   在庫 <=10 AND 仕入単価 >= 5000 AND 仕入単価 <= 10000




- 論理演算子には優先順位がある -

条件式を論理演算子でつないだ場合、基本的に左側に記述された条件から判定されていきます。従って上記の式は、以下の3段階の過程を経てレコードを絞り込んでいることになります。

(1) まず、在庫数が10以下のレコードに絞り込む
(2) その中から、仕入単価が5,000円以上のレコードに絞り込む
(3) さらにその中から、仕入単価が10,000円以上のレコードに絞り込む

この場合はすべての条件をAND演算子でつないでいるため、条件式の順序をどのように入れ替えても、絞り込んだ結果は変わりません。以下の式でも結果は同じです。

  SELECT * FROM 商品_mr WHERE
   仕入単価 >= 5000 AND 仕入単価 <= 10000 AND 在庫 <=10

しかし、OR演算子が入ると条件式の並び順によって結果が変わってきます。論理演算子には優先順位があるためです。論理演算子の優先順位は、以下のようになります。

高 ← → 低
NOT AND OR


- 場合によっては結果が異なる -

例えば「仕入単価が5,000円以下」または「仕入単価が10,000円以上」で、なおかつ「在庫数が50以上」の商品を抽出したいとします。これを文章のとおりそのままSQLにすると、以下のようになります(画面12)。

  SELECT * FROM 商品_mr WHERE
   仕入単価 <= 5000 OR 仕入単価 >= 10000 AND 在庫 >= 50

結果(画面11)を見ると、在庫数が45の「13953:ニワトリ目覚し時計」や28の「36221:お好み焼きセット」なども抽出されています。

先述したように、論理演算子は「NOT→AND→OR」の順に評価されていきます。そのため上のSQL文では、

  先に「仕入単価 >= 10000 AND 在庫 >= 50」が評価され
  続いて「仕入単価 <= 5000 OR……」が評価される

ことになります。つまり上の式は

  仕入単価が10,000以上で在庫数が50以上のレコード
  または
  仕入単価が5,000以下のレコード

を抽出する――と解釈されるのです。


- 優先順位を明示する -

これを最初の意図通りに評価させるには、優先させたい式を( )で囲みます(画面13)。

  SELECT * FROM 商品_mr WHERE
   (仕入単価 <= 5000 OR 仕入単価 >= 10000) AND 在庫 >= 50

これで、最初に意図した

  (
   仕入単価が5000円以下
   または
   仕入単価が10000円以上
  )なおかつ
   在庫数が50以上

という条件が正しく反映されます。

上の式は、以下のようにしても同じ結果となります。

  SELECT * FROM 商品_mr WHERE
   在庫 >= 50 AND (仕入単価 <= 5000 OR 仕入単価 >= 10000)





あとがき

WHERE句に与える条件式の基本事項を紹介しました。単純な条件はすぐに理解できると思いますが、論理演算子を使った複雑な式では、その並べ方に注意が必要です。

今回は主に数値型のフィールドを扱いましたが、文字や文字列型のフィールドを対象とする場合、ワイルドカードを使った曖昧検索など、さらに複雑な条件を与えての抽出ができます。次回は、文字列による条件指定を取り上げます。


Downloadサンプルファイル (LZH形式 1.6 KB)


トップページ
レコードを絞り込む
複数のレコードを抽出する
複雑な条件を指定する
3つ以上の条件式をつなぐ
3つの条件で抽出する
論理演算子には優先順位がある
場合によっては結果が異なる
優先順位を明示する
あとがき
Copyright © MESCIUS inc. All rights reserved.