• 検索結果がありません。

高度な SELECT ステートメント

ドキュメント内 dbMAGIC Ver8.2 SQLガイド (ページ 50-61)

これまで、基本的なSELECTステート メントを説明しましたが 、SELECTステート メントではさらに複雑な クエリも可能です。

7.1

SELECTステート メントの選択リストでは、式を使うこともできます。この式を使用して、表示するカラム

を操作できます。たとえば 、複数のカラムの値を結合して結果に表示することもできますし 、複数のカラム の値を比較して結果を出力することもできます。場合によっては、式に関数を定義することもできます。こ の方法は、標準の構文ではありませんが 、相応の結果を出すこともできます。式に指定できる関数は、デー タベースシステムによって異なりますが 、関数の使い方はほぼ同じです。

以下、よく使われる式と関数について説明します。ここで説明する主な内容は、次の通りです。

■ 算術式 … この種の式では、数学的な計算を行うことができます。

■NULL操作関数 … この種の関数では、NULL値を操作して結果を出力することができます。

■ 結合関数 … 複数のカラムを結合して結果テーブルに表示できます。

なお、使用できる関数はデータベースによって異なります。このため、使用前にあらかじめ関数や使い方を 見ておくことが必要です。

算術式

SELECTステート メントでは算術式を指定できます。算術式を使うことで、複数のカラムの値を計算し 、そ

の結果を出力することができます。

例:

テーブル「社員マスタ」のレコード のうち、職種が営業で、かつ、成果給が基本給の50%を超える社員のレ コード を取り出し 、その社員の名前、基本給、成果給、給与合計( 基本給+成果給)を表示したい場合、次 のようになります。

SELECT 名前, 基本給, 成果給, 基本給 + 成果給 FROM 社員マスタ

WHERE 職種 = ’営業’

AND 成果給 >.50*基本給

結果:( 算術式がデータベースでサポートされていなければなりません。)

名前 基本給 成果給 基本給+成果給 ジョージ 4400 3000 7400

ターンブル 4050 5050 9100

式または関数で参照されるカラムにNULL値が入っていた場合、結果にはNULL値が返ります。

7 例:

テーブル「社員マスタ」のレコード のうち、部門番号40の部門に属する社員のレコード を取り出し 、その 社員の名前、基本給、成果給、給与合計( 基本給+成果給)を表示したい場合、次のようになります。

SELECT 名前, 基本給, 成果給, 基本給 + 成果給 FROM 社員マスタ

WHERE 部門番号 = 40 結果:

名前 基本給 成果給 基本給+成果給 アレン 4300 2000 6300

ジョージ 4400 3000 7400 ターンブル 4050 5050 9100 オニール 4850

NULL 関数

カラムの値としてNULLが許可されており、また、実際にカラムにNULL値が入っている場合、そのNULL 値を別の値に置き換えて計算を行ったり、レポートを出力したいこともあります。たとえば 、統計計算で NULL値の代わりに「0」や「1」を使いたいこともあります。また、レポートでは、NULL値があった場合、

通常は空白が表示されますが 、この空白をアスタリスクにしたり「該当なし 」といった文字を表示したいこ ともあります。こういったときには、ISNULL(Oracle 6ではNVL)関数を使います。この関数では、カラ ムに値が入っていたときにはその値を、値が入っていなかった(NULLだった )場合、式を使用して値を出 力できます。

NULLIF関数

NULLIF (式1, 式2)

NULLIF関数では、式1と式2が評価され 、その結果が等しかったときには、NULLが返ります。等しくない 場合、式1が使われます。NULLIF関数については、詳しくは、RDBMSのマニュアルを参照してください。

ISNULL関数

ISNULL (式, 値)

カラムの値がNULLだった場合、「値」に指定した値が使われます。

たとえば 、次の場合、

ISNULL (国, ’なし’)

カラム「国」に値が入っていたときには国の名前が 、値がNULLだったときには’なし’という文字列が返 ります。

SQLガ イド 7.1式 7–3

例:

テーブル「社員マスタ」のレコード のうち、部門番号40の部門に属する社員のレコード を取り出し 、その 社員の名前、基本給、成果給、給与合計( 基本給+成果給)を表示したい場合、次のようになります。この ステート メントでは、カラム「成果給」の値がNULLだったときには、値として「0」が使われます。

SELECT 名前, 基本給, 成果給, 基本給 + ISNULL(成果給,0) FROM 社員マスタ

WHERE 部門番号 = 40 結果:

名前 基本給 成果給 基本給+ ISNULL(成果給,0)

アレン 4300 2000 6300 ジョージ 4400 3000 7400 ターンブル 4050 5050 9100 オニール 4850 4850

結合関数

ベーステーブルの項目のうち、複数の項目を結合して結果を表示したいこともあります。こういったときに は、結合関数を使います。結合関数では、データ型が文字の項目と文字定数の結合が可能です。

例:

テーブル「部門情報」 の項目のうち、「部門名」と「場所( 所在地)」の2項目の値を結合して出力したい場 合、次のようにします。

SELECT 部門名 jj ’ - jj ’ 場所 FROM 部門情報

結果:

部門名jj’ - ’jj場所 経理-ロサンジェルス

マーケティング-サンフランシスコ 総務-ノーフォーク

営業-ニューヨーク リサーチ-バークレー

7.2 複数のテーブルに対するクエリ

一度に複数のテーブルに対してクエリを実行し 、その結果を取り出したいことも少なくありません。とくに、

リレーショナルデータベースの場合、物理的に別のテーブルであっても、論理的にデータを接続して取り出 せるため、この機能は便利です。たとえば 、受注データは 、通常、ヘッダテーブルと受注テーブルに置かれ ているため、複数のテーブルに対するクエリが必要になることも普通です。

例:

製品の一覧のテーブル(「製品」)と、製品別の在庫データが格納されているテーブル(「在庫」)があったと します。SQLでは、こういったとき、「製品」と「在庫」の2つのテーブルに対してクエリを実行し 、結果 を取り出すことができます。結果は、2つのテーブルのデータが結合されて出力されます。

7 複数のテーブルに対してクエリを実行する場合、各テーブルのカラムを指定しなければなりません。以下、

例を使用して説明しますが 、ここでは、カラム「製品名」に製品の名称が格納されているものとします。

SELECT 製品名, 数量

また、クエリの実行先のテーブルは、「製品」と「在庫」ですので、テーブルの指定部は下のようになります。

FROM 製品, 在庫

続いて、2つのテーブルを結合します。ここでは、「製品ID」というカラムを使用して結合します。

WHERE 製品.製品ID = 在庫.製品ID

上記のように、テーブルは、通常、「テーブル名.カラム名」という形式で結合できますが 、データベースに よっては多少異なることもあります。

注意:

WHERE句を使わなかったときには、テーブル「製品」の行がそれぞれ 、テーブル「在庫」のすべての

行に対して結合されるという関係になります。

処理-クエリの実行後、まず、下のように「製品名」と「数量」の2つのカラムが結合されます。

製品ID 製品ID SID 製品名 数量

1 1 10 ボルト 10

2 2 10 ナット 20

2 2 20 ナット 16

3 3 30 ネジ 20

*このデータは結果には出力されません。

SELECTステート メントでは、必要なだけカラムを指定できます。また、カラムの順番も必要に応じて変更

できます。以下は、SELECTステート メント全体です。

SELECT 製品名, 数量 FROM 製品, 在庫

WHERE 製品.製品ID = 在庫.製品ID

上記のSELECTステート メントでは、「製品名」、「数量」の順で結果が表示されます。

結果:

製品名 数量 ボルト 10 ナット 20 ナット 16 ネジ 20

7.3 グループ関数

SQLステート メントによるクエリでは、通常、行ごとに結果が返りますが 、グループ関数を使うことで、複 数の行をグループ化し 、そのグループに対して処理を行い、その結果を取り出すことができます。グループ 関数は、統計関数と呼ばれることもあります。

グループ 関数としては、AVG、COUNT、MAX、MIN、SUMがあります。

SQLガ イド 7.3グループ 関数 7–5

構文:

SELECT カラム名,

関数 (カラム [, カラム]) FROM テーブル名

GROUP BY カラム名

例:

テーブル「社員マスタ」について、職種が営業である社員の給料の平均額、最高額、さらに、全員の給料の 合計を取り出したい場合、ステート メントは次のように記述します。

SELECT 平均給料, 最高給料, 給料合計 FROM 社員マスタ

WHERE 職種 = ’営業’

結果:

平均給料 最高給料 給料合計 4250 4400 12750

COUNT(*) この関数を使用して、行の数を取り出すことができます。

COUNT(カラム名) 同じく行数のカウントが可能ですが 、この関数では、「カラム名」にカラムを指定し 、そ のカラムに実際にデータが格納されている行(NULL以外の値が入っている行)の数をカウントで きます。

例:

下の例では、テーブル「社員マスタ」の行(レコード )の数と、テーブルの行のうち、カラム「成果給」に NULL以外のデータが入っている行の数が出力されます。

SELECT COUNT(*), COUNT(DISTINCT成果給) FROM 社員マスタ

結果:

COUNT(*) COUNT(成果給)

14 3

7.4 GROUP BY- グループ化して結果を出力

SELECT() FROM() <WHERE> <GROUP BY> <HAVING> <ORDER BY>

SELECTステート メントで、GROUP BY句を使うことで、カラムの値を基準にレコード をグループ化し 、結 果を出力できます。GROUP BY句では、テーブルのレコード をカラムの値を使用して複数のグループに分け ることができます。また、カラムは、複数指定することもできます。

■ GROUP BY句で指定したカラムが1つの場合、そのカラムの値として同じ 値を持った行が1つのグ ループとしてまとめられます。この場合、グループの数は、そのカラムに対してDISTINCTを実行し たときに返る値と同じになります。

■ GROUP BY句で指定したカラムが複数の場合、まず、最初のカラムの値を基準に行がグループにまと

められ 、続いて、そのグループに属する行が次のカラムの値を基準にグループにまとめられます。

ドキュメント内 dbMAGIC Ver8.2 SQLガイド (ページ 50-61)