ホーム - データベース - データの検索

データの検索

データベースに保存されているデータは取得したいデータの条件を元に検索して取り出します。前述のように、データの検索には「SELECT文」というクエリーを使用します。ここではSELECT文でデータを検索するための構文をみていきましょう。

SELECT文では必要な項目(カラム)や対象テーブル、抽出条件、並び順などを指定することが出来ます。データ検索のための基本的な構文は下記のようになります。

  SELECT [DISTINCT] <必要項目リスト> FROM <参照テーブル>
    [WHERE <条件>] [ORDER BY <並び順項目リスト>];
				
SELECT文の基本は上記のようにSELECT句・FROM句・WHERE句・ORDER BY句からなります。WHERE句やORDER BY句およびDISTINCTキーワードは省略可能で、必要なければ記述する必要がありません。ここでは前述の売上DBを例に各句について見ていくことにしましょう。

SELECT句

SELECT句では必要な項目のリストを記述します。SELECT文の全ての句で共通のことですが、各項目は「テーブル名.カラム名」(テーブル名とカラム名の間をピリオドで区切る)で指定し、項目の間は,(カンマ)で区切ります。
				
  SELECT 売上伝票明細データ.商品コード, 売上伝票データ.日付
    , 売上明細伝票データ.伝票No, 商品マスタ.商品名
    , 売上伝票明細データ.単価, 売上伝票明細データ.数量
    , 売上伝票明細データ.単価 * 売上伝票明細データ.数量 AS 税別売上額
    , 売上伝票データ.消費税, 売上伝票データ.伝票メモ
				
となります。FROM句で指定されたテーブルの中で固有なカラム名の項目についてはテーブル名の記述を省略できますが、可読性向上のためにテーブル名も記述するようにしましょう。

項目には計算式を記述して取得することも可能です。また、計算式や通常の項目には「AS」キーワードを使ってカラム名の別名(エイリアスといいます)をつけることもできます。全ての項目を表示したい場合は「*(アスタリスク)」を使用します。(SELECT * と記述します。)項目リストの先頭に「DISTINCT」キーワードを付けると全く同じデータを持つレコードは表示しなくなります。必要に応じて付加してください。

FROM句

FROM句ではデータ検索の際に参照するテーブルを記述します。Transact-SQLでは、テーブルのリレーションに対しての記述もFROM句で行うのが通常の記述法になります。テーブルのリレーション記述にはINNER JOINやLEFT JOINを利用します(RIGHT JOINという記述方法もありますが、混ざると分かりにくくなります)。INNER JOIN は下記のように記述します。
  TableA INNER JOIN TableB ON TableA.ColumnX1 = TableB.ColumnX2
				
上記の記述においてTableAとTableBを両テーブルのColumnX1とColumnX2というカラムのデータが同じレコードをリレーションして連結します。ColumnX1とColumnX2のデータが両テーブルともにあるレコードのみが対象になります。TableAのColumnX1にしかないデータを持つレコードやTableBのColumnX2にしかないデータを持つレコードは検索の対象になりません。LEFT JOINは下記のように利用します。
  TableA LEFT JOIN TableB ON TableA.ColumnX1 = TableB.ColumnX2
				
リレーションに関してはINNER JOINと同じですが、LEFT JOINの場合はTableAについては全レコードが検索の対象になります。下記にFROM句の例を示します。
  FROM 売上伝票データ 
    LEFT JOIN 売上伝票明細データ
      ON 売上伝票データ.伝票No = 売上伝票明細データ.伝票No
    LEFT JOIN 商品マスタ
      ON 売上伝票明細データ.商品コード = 商品マスタ.商品コード
 				
上記の場合はLEFT JOINで記述されていますので、売上伝票データの全レコードが検索の対象になります。たとえ対象となる売上伝票に売上伝票明細がないようなデータがあっても売上伝票データのレコードさえあれば検索対象になることを意味しています。これがINNER JOINであれば、売上伝票に売上伝票明細がないデータは自動的に検索の対象外になります。

WHERE句

WHERE句ではデータ検索の条件を記述します。通常は対象のカラムに対して比較演算子(「=」や「>」「<=」など)を使って条件を表したり、カラムごとの条件を論理演算子(ANDやOR)でつなげていくことも出来ます。 例えば、2007年3月2日以降で単価が50円より高い商品の売上データを検索する時は下記になります。
  WHERE 売上伝票データ.日付 >= '2007/03/02' AND 売上伝票明細データ.単価 > 50
				
上記において、シングルクォート「'」でくくられた中身は文字列であることを意味します。(すなわち「2007/03/02」という日付は文字列としてデータベースに保管しているということです。)

また、文字列の検索にはLIKE演算子とワイルドカードを使ってあいまい検索をすることも可能です。SQL Serverでは、複数文字を表すワイルドカードは「%」、一文字を表すワイルドカードは「?」です。売上DBの場合、3月の売上データを検索するのに下記のような記述でもできます。
  WHERE 売上伝票データ.日付 LIKE '????/03/%'
				
DBに格納するデータには、その項目には何の値も入っていませんという「NULL」という値があります。また、よく似た値に空文字「''」という何の文字列も入っていないという意味のデータもありますが、これは「文字列が何も入っていない」という明示的な値なのでNULLではありません。WHERE句では対象の項目がNULLかどうか、またはNULLでないかどうかという検索も出来ます。下記に例を示します。
  *** NULLのデータを検索 ***
  WHERE 売上伝票明細コード.商品コード IS NULL
  
  *** NULLでないデータを検索 ***
  WHERE NOT 売上伝票明細コード.商品コード IS NULL
				

ORDER BY句

ORDER BY句では検索したレコードの並び順をしていします。優先順位の高い項目から順にカンマで区切りながら指定します。対象の項目が昇順なら「ASC」(昇順の場合は明示的な記述は不要です)、降順なら「DESC」を記述して下さい。下記に例を示します。
  ORDER BY売上伝票明細.商品コード, 売上伝票データ.日付 DESC
    , 売上伝票明細データ.伝票No
				

まとめ

以上の説明を踏まえて、売上DBからSELECT文を使ってデータを検索する例を下記に示します。

  SELECT 売上伝票明細データ.商品コード, 売上伝票データ.日付
    , 売上明細伝票データ.伝票No, 商品マスタ.商品名
    , 売上伝票明細データ.単価, 売上伝票明細データ.数量
    , 売上伝票明細データ.単価 * 売上伝票明細データ.数量 AS 税別売上額
    , 売上伝票データ.消費税, 売上伝票データ.伝票メモ
  FROM 売上伝票データ 
    LEFT JOIN 売上伝票明細データ
      ON 売上伝票データ.伝票No = 売上伝票明細データ.伝票No
    LEFT JOIN 商品マスタ
      ON 売上伝票明細データ.商品コード = 商品マスタ.商品コード
  WHERE 売上伝票データ.日付 >= '2007/03/02' AND 売上伝票明細データ.単価 > 50
  ORDER BY売上伝票明細.商品コード, 売上伝票データ.日付 DESC
    , 売上伝票明細データ.伝票No;
				

このSELECT文により、伝票日付が2007年3月2日以降で単価が50円より高い商品の売上データが商品コード順に伝票日付の新しい順の伝票No順で取得することができます。