Symfoware Server SQLビギナーズガイド - FUJITSU -
目次 索引 前ページ次ページ

第6章 いろいろなデータ操作の方法> 6.2 いろいろな探索条件を指定する

6.2.3 値がいくつかの値の集合に含まれるかを調べる

値がいくつかの値の集合に含まれるかを調べるには、IN述語、限定述語またはEXISTS述語を使用します。

■値の集合に含まれるかを調べる

特定の値が、限定された値の集合の中に含まれるかを調べるには、IN述を使用します。比較する値の集合は、限定値リスまたは副問合で指定します。限定値リストを指定した例を以下に示します。

例1

在庫表から、製品番号が“123”、“124”、“226”または“227”のどれかである行を特定します。指定の結果を“図:IN述語の指定例”に示します。
SELECT 製品番号, 製品名, 在庫数量, 倉庫番号 FROM 在庫管理.在庫表

       WHERE  製品番号  IN  (123, 124, 226, 227)
                 (1)                (2)

(1) 値式

(2) 限定値リスト

(1)〜(2) IN述語

[図:IN述語の指定例]

限定値リストには、値式と比較する値を括弧でくくって指定します。限定値リストの値は、ホスト変数または定数で指定します。列名などは指定できません。

IN述語の結果は、値式の値が括弧内の値のどれかと等しい場合、真となります。すべてと等しくない場合、結果は偽となります。値式がNULL値か、括弧内のどれかの値がNULL値の場合、結果は不定となります。

IN述語の結果については“SQLリファレンス”を参照してください。

◆副問合せを用いたIN述

値式と比較する値が、ほかの表から導き出される値であるような場合に、限定値リストの代わりに副問合せを記述します。

副問合せの括弧の中は問合せ指定と同じ形式です。ただし、副問合せの場合、導出される表は、列数が1つであることが必要です。したがって、探索条件の左辺には1個の値(列名、関数など)を指定することを意味しています。副問合せを用いたIN述語の例を以下に示します。

 

例2

取引製品が“351”の製品を発注している会社名を取り出します。
SELECT 会社名  FROM  在庫管理.会社表  WHERE

   会社番号 IN (SELECT 取引先 FROM 在庫管理.発注表 WHERE 取引製品 = 351)
      (1)              ↓              (2)
                    列数は1つ

(1) 値式(1個)

(2) 副問合せ

(1)〜(2) IN述語

[図:副問合せを用いたIN述語の例]

■値の集合と比較す

探索条件として、限定された値の集合との比較を指定する場合には、限定述を使用します。限定述語は、比較演算子と限定子(ALL、SOMEまたはANY)を使用して指定します。

副問合せの括弧の中は問合せ指定と同じ形式です。ただし、副問合せの場合、導出される表は、列数が1つであることが必要です。したがって、探索条件の左辺には1個の値(列名、関数など)を指定することを意味しています。

また、副問合せに指定された表に含まれない列、すなわち外側の問合せに指定された表に含まれる列を副問合せの探索条件に指定している場合、その副問合せは“外への参照がある副問合せ”と呼びます。限定述語に外への参照がある副問合せを指定した例を以下に示します。

 

例3

すべての取引先について、その取引先からの発注数量が在庫数量を上回っている製品番号を検索します。副問合せの表(発注表)に含まれない列、すなわち外側の問合せの表(在庫表)に含まれる列(製品番号)を探索条件に指定しています。検索の結果を“図:限定述語の指定例”に示します。

[図:限定述語の指定例]

■特定の条件の行が存在するかを調べる

副問合せを指定し、その副問合せの結果が空(すなわち、副問合せの結果、導出される表の行数が0)となるか否かで行を特定する場合に、EXISTS述を使用します。“EXISTS”のあとに指定した副問合せの結果が空でない場合、このEXISTS述語は真となります。副問合せの結果が空の場合は、EXISTS述語は偽となります。

副問合せの括弧の中は問合せ指定と同じ形式です。副問合せの結果が2列以上の表になってもかまいません。EXISTS述語の指定例を以下に示します。

例4

発注価格が500万を超えている製品の製品番号と製品名を取り出します。発注価格は、仕入価格×発注数量で求められます。
SELECT 製品番号, 製品名 FROM 在庫管理.在庫表 WHERE

   EXISTS (SELECT *  FROM 在庫管理.発注表 WHERE 取引製品 = 製品番号
    (1)        ↓                    (2)
        複数の列も可能      AND (仕入価格 * 発注数量) > 5000000)
                                          (2)

(1)〜(2) EXISTS述語

(2) 副問合せ

[図:EXISTS述語の指定例]


目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 2006