データの検索
データベースに保存されているデータは取得したいデータの条件を元に検索して取り出します。前述のように、データの検索には「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順で取得することができます。