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

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

複数のレコードを抽出する

ここまでは、「商品ID = 550501」のように「あるフィールドの値が指定した値と等しい」という形の条件式を使いました。次に、ある値より大きい/小さいなどの条件を指定して、複数のレコードを抽出する方法を紹介します。


- 比較演算子で関係を調べる -

フィールドの値をある値と比較する条件式の基本書式は、以下のようになります。

  WHERE <フィールド名> <比較演算子> <値>

比較演算子は、レコードに対して<フィールド名>で指定したフィールドの値が<値>で指定した値とどのような関係であるかを調べます。

そしてWHERE句は、比較した結果が「真」なら条件が成立したと見なして該当レコードを抽出対象とし、結果が「偽」の場合はそのレコードを抽出対象にしません。

比較演算子には、表1のような種類があります。演算子を用いた式ではその左側を「左辺」、右側を「右辺」と呼びます。WHERE句に与える条件式の場合は、<フィールド名>が左辺、<値>が右辺です。

表1:WHERE句の条件式で用いる比較演算子
演算子 機能
= 左辺と右辺の値が等しいとき「真」
< 左辺が右辺より小さい(未満)とき「真」
<= 左辺は右辺と同じまたは小さい(以下)とき「真」
=> 左辺は右辺と同じまたは大きい(以上)とき「真」
> 左辺が右辺より大きいとき「真」
<> 左辺と右辺が等しくない(≠)とき「真」
!= 左辺と右辺が等しくない(≠)とき「真」(<>と同じ)
!< 左辺が右辺より小さくない(以上)とき「真」(=>と同じ)
!> 左辺が右辺より大きくない(以下)とき「真」(=<と同じ)

Oracleでは「等しくない」を表すとき「^=」という演算子も使えます


- 複数のレコードを抽出する -

いくつか例を挙げておきましょう。
在庫数が5個以下の商品を調べたいなら、以下のようなSQL文を記述します(画面4)。

  SELECT * FROM 商品_mr WHERE 在庫 <= 5

左辺に在庫数を記録するフィールド「在庫」、右辺に「5」を置き、両者を比較演算子「<=」で結びます。

在庫数が「10未満」のレコードを抽出するなら

  SELECT * FROM 商品_mr WHERE 在庫 < 10

となります。条件式に用いる比較演算子の違いに注意してください。

   5以下:在庫 <= 5
  10未満:在庫 < 10

このように、比較演算子を用いた条件式では、通常、条件を満たす複数のレコードが抽出対象となります。

ここまでの例で分かるように、WHERE句によって絞り込むレコードは結果的に1件でも複数件あっても構いません。テーブル内の全レコードの中から、条件式で指定した条件を満たすレコードがすべて抽出されます。




- 文字列を比較する -

一般的なプログラミング言語のようにデータ型を強く意識する必要がないことも、SQLの特徴です。SQLは文字列であり、コンパイルして機械語に翻訳されるソースコードではありません。そのため条件式に与える右辺の値はフィールドの型(データ型)に関係なく文字列として扱われます。

先の例では、「商品ID」も「在庫」もint(整数)型でしたが、varchar型の「商品ID」やmoney(通貨)型の「販売単価」「仕入単価」フィールドに対しても、同じ要領で条件を記述できます。

商品名「焼肉プレート小」のレコードを抽出するなら、条件は「品名」フィールドの値が“焼き肉プレート小”である――となるので、SQLは以下のようになります(画面5)。

  SELECT * FROM 商品_mr WHERE 品名 = '焼肉プレート小'

文字列は' 'で囲んで指定します。

販売単価が10,000円以上のレコードを抽出するなら、以下のようになります(画面6)。

  SELECT * FROM 商品_mr WHERE 販売単価 >= 10000

varchar型フィールドの値は、左辺に文字列を指定して「=」演算子で「文字列が同じかどうか」を調べることができます※2。money型フィールドの値も数値なので、左辺に数値を記述するだけです。

※2 文字列の扱いに関しては、ワイルドカードを使って一部が合致しているかどうかを調べるLIKE演算子などがあります。これについては次回紹介します




文字列の連結でSQLを生成する

プログラムのソースコード内では、SQL文は文字列として扱います。varchar型フィールドの値を文字列定数や文字列型変数(に代入されている文字列)と比較する場合、文字列の連結処理によってSQL文を生成し、それを文字列型の変数に代入することになります。

Visual Basicの場合を例に説明しましょう。文字列型(String型)変数strItemNameに商品名を示す文字列が保持されており、それを本文で説明したように「品名」フィールドの値と比較するという条件のSQL文を、同じくString型の変数strSqlに代入するとしたら、以下のようなソースコードになります。

  Dim strItemName As String
  Dim strSql As String
       :
  strSql = "SELECT * FROM 商品_mr WHERE 品名 = '"
                   (a)
        & strItemName
             (b)
        & "'"
          (c)

SQL文の前半部分(a)にString型変数strItemNameの値(b)を&演算子で連結し、さらにSQL文内で文字列を示すための終端記号「’」をVisual Basicで文字列定数を表す" "記号で囲み、同様に&演算子で連結します。

処理の中で、変数strItemNameに"スプーン・フォークセットB"という文字列が代入されていれば、SQL文を保持する変数strSqlは以下のようになっています。

  "SELECT * FROM 商品_mr WHERE 品名 = 'スプーン・フォークセットB'


トップページ
レコードを絞り込む
複数のレコードを抽出する
比較演算子で関係を調べる
複数のレコードを抽出する
文字列を比較する
複雑な条件を指定する
3つ以上の条件式をつなぐ
あとがき
Copyright © MESCIUS inc. All rights reserved.