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

レコードの選択と整列
~SELECT命令をしっかり理解する
長谷川裕行
有限会社 手國堂

レコードの抽出(選択)~SELECT命令

とにかく、テーブルからレコードを取り出さなければ話は始まりません。SELECT命令はSQLによるデータベース操作の基本です。


- 基本書式 -

SELECT命令を使った構文の基本的な書式は、以下のようになります。

  SELECT <フィールド名>(, <フィールド名>, <フィールド名> ...)
  FROM <テーブル名>
 (SELECT、FROMなどの予約語やフィールド名の前で改行しても構いません。
  但し、語の途中で改行してはいけません)

FORMは句で、フィールドを選択する対象のテーブルを指定します。FROM句に続く<テーブル名>で示されたテーブルから、<フィールド名>で示すフィールドの値を取り出します。


- フィールド名の列挙 -

フィールド名は「,」で区切って複数指定できます。例えば、以下のようなフィールド構成のテーブル「商品_mr」※1があったとします(表1、画面1)。

  商品ID 品名 販売単価 仕入単価 在庫

このテーブルのすべてのフィールドを取り出すSQL文は、以下のようになります。

  SELECT 商品ID, 品名, 販売単価, 仕入単価, 在庫
  FROM 商品_mr ---- (1)

すべてのフィールドの値を取り出したい場合は、「*」記号を使えます。その場合、フィールドの並び順は、元のテーブルのフィールド構成と同じになります。

  SELECT * FROM 商品_mr ---- (2)

(2)の処理結果は、先の(1)のSQL文の場合と同じになります。ここではSQL Server 2000で管理されているデータベースに対して、クエリアナライザからSQLを発行した結果を掲げておきます。

※1 テーブルには、商品や顧客、社員など基本的な情報を記録する基本表(マスターテーブル)と、それを基に売上や仕入、勤怠状況など日々の業務内容を記録する取引表、さらに最終的な業務内容を定着記録する定着表があります。この記事で用いるサンプルでは、それらテーブルの役割を区別するため、テーブル名の後尾に基本表には「_mr」、定着表には「_fx」という記号を付けています。もちろん便宜的なもので、決まりではありません

表1:商品の基本情報を記録したテーブル「商品_mr」のフィールド構成

キー ID 名前 データ型 サイズ NULL デフォルト
- 商品ID int 4 - (0)
- - 品名 nvarchar 30 -
- - 販売単価 money 8 (0)
- - 仕入単価 money 8 (0)
- - 在庫 int 4 (0)




- フィールドの限定と順序の変更 -

先の例に使ったテーブルから、SELECT命令で「商品ID」「品名」「在庫」のフィールドだけを取り出して表示したい場合、基本的には以下のようなSQL文を記述します。

  SELECT 商品ID, 品名, 在庫 FROM 商品_mr -------- (3)

「,」で区切って複数のフィールド名を列挙した場合、処理結果にはSQLで記述した順にフィールドの値が並べられます。処理内容によっては、フィールドの並び順を変えて表示したい場合もあるでしょう。

例えば、在庫数の少ない(または多い)商品を探したいような場合、商品IDや商品名より先に在庫数を表示した方が分かりやすくなります。そのような場合には、以下のように記述できます。

  SELECT 在庫, 商品ID, 品名 FROM 商品_mr -------- (4)

フィールドの限定(3)と順序の変更(4)、2つの処理結果を比べてみましょう。これも、クエリアナライザでSQLを発行した結果の画面です。





- 無駄なフィールドを指定しない -

すべてのフィールドを元通りの並び順で表示する「*」記号は非常に便利で、いちいちフィールド名を列挙するのが面倒だからと、ついつい“SELECT *”を使ってしまいがちです。

フィールド数の少ないシンプルなテーブルならともかく、フィールド数の多い複雑なテーブルで「*」を使ってしまうと、本来は必要のない(そのときの処理では利用しない)フィールドのデータまですべて読み込んでしまうことになります。

SELECT命令の処理結果は、レコードセットとしてSQLを発行したクライアントに渡されます。不要なフィールドを指定するとサーバーに余計な負荷をかけることになり、さらに無駄なデータがたくさんネットワーク上を流れ、クライアントのメモリなどリソースも消費されます。

特に大規模なデータベースでは、そのときの処理に必要なフィールドだけを明確に指定するよう、心がけましょう。


- フィールドの別名 -

処理によっては、本来のフィールド名を異なる名前に変更したい場合があります。例えば、販売部門のシステムでデータが顧客の目に触れる可能性のある場合、「仕入単価」は見えないようにしておき、「販売単価」を単に「単価」というフィールド名で扱う方がよいはずです。また、アプリケーションで、複数のデータベースに格納されているテーブル同士を連携させる場合、同じ意味を持つフィールドが異なる名前になっていると間違いの元です。

そのようなときには、AS句を使ってフィールド名にエイリアス(別名)を付けます。構文の書式は、以下のようになります。

  SELECT <フィールド名> AS <別名> FROM <テーブル名>

テーブル「商品_mr」から「商品ID→品番」「品名→商品」「販売単価→単価」という形で別名を設定し、この3つのフィールドの値だけを表示させるなら、SQLは以下のようになります。

  SELECT 商品ID AS 品番 ,
        品名 AS 商品 ,
        販売単価 AS 単価
  FROM 商品_mr




トップページ
レコードの抽出(選択)~SELECT命令
基本書式
フィールド名の列挙
フィールドの限定と順序の変更
無駄なフィールドを指定しない
フィールドの別名
レコードの並べ替え(整列)~ORDER BY句
SELECT命令の処理結果とレコードセット
あとがき
Copyright © MESCIUS inc. All rights reserved.