SELECT

SELECT ステートメントは照会の 1 形式です。

呼び出し

このステートメントは、アプリケーション・プログラム内で DB2 CLI 関数を用いて使用することができます。 また、CLP を介して出すこともできます。

構文

                         .-,------------.
                         V              |
>>-SELECT--+----------+----| 選択項目 |-+--FROM----------------->
           '-DISTINCT-'
 
   .-,------------------------.
   V                          |
>----表名--+----------------+-+--+---------------------+-------->
           '-+----+--相関名-'    '-WHERE--| 検索条件 |-'
             '-AS-'
 
>--+---------------------------------+-------------------------->
   |           .-,-----------------. |
   |           V                   | |
   '-GROUP BY----+---------+--列名-+-'
                 '-表名--.-'
 
>--+---------------------------------------------------+-------->
   |             .-,--------.                          |
   |             V          |                          |
   '-ORDER BY--+---単純整数-+------------------------+-'
               | .-,-------------------------------. |
               | V                                 | |
               '---+---------+--列名--+----------+-+-'
                   '-表名--.-'        '-+-ASC--+-'
                                        '-DESC-'
 
>--+-----------------+-----------------------------------------><
   '-LIMIT--単純整数-'
 
選択項目:
 
|--+-*------------------------+---------------------------------|
   +-COUNT--(--+-| 式 |-+--)--+
   |           '-*------'     |
   +-AVG--(----| 式 |----)----+
   +-SUM--(----| 式 |----)----+
   +-MIN--(----| 式 |----)----+
   +-MAX--(----| 式 |----)----+
   +-MOD--(-| 式 |-,-| 式 |-)-+
   +-LENGTH--(--| 式 |--)-----+
   +-RTRIM--(--| 式 |--)------+
   +-LCASE--(--| 式 |--)------+
   '-UCASE--(--| 式 |--)------'
 
検索条件:
 
   .----------------------------------------.
   V                                        |
|----+------------------------------------+-+-------------------|
     '-+-AND-+--+-----+--+-| 述部 |-----+-'
       '-OR--'  '-NOT-'  '-| 検索条件 |-'
 
述部:
 
                       (1)
|--+-| 基本述部 |--+--------------------------------------------|
   +-| IN 述部 |---+
   +-| LIKE 述部 |-+
   '-| NULL 述部 |-'
 
基本述部:
 
|--| 式 |--+-=---+--| 式 |--------------------------------------|
           +- <>-+
           +- <--+
           +->---+
           +- <=-+
           +- >=-+
           '-||--'
 
IN 述部:
 
                        .-,------.
                        V        |
|--| 式 |--+-----+--IN----| 式 |-+------------------------------|
           '-NOT-'
 
LIKE 述部:
 
|--| 式 |--+-----+--LIKE--| 式 |--------------------------------|
           '-NOT-'
 
NULL 述部:
 
|--| 式 |--IS--+-----+--NULL------------------------------------|
               '-NOT-'
 
式:
 
   .-演算子------------------------.
   V                               |
|----+----+--+-リテラル----------+-+----------------------------|
     +- +-+  +-+---------+--列名-+
     '- --'  | '-表名--.-'       |
             +-特殊レジスター----+
             '-関数--------------'
 
演算子:
 
|--+- /-+-------------------------------------------------------|
   +- *-+
   +- +-+
   '- --'
 
 

注:

  1. BLOB 式は、NULL 述部でのみ使用することができます。

説明

選択項目
*
すべての列を指定します。* を指定する場合、これが唯一の選択項目で なければなりません。
COUNT(*)
COUNT 関数は、1 組の行または値の中の行数または値の数を戻します。COUNT(*) の引き数は 1 組の行です。結果は、1 組の中の行数です。 NULL 値しか入っていない行もカウントされます。
は、リテラル、列名、関数、または特殊レジスターのいずれでも かまいません。妥当な関数は、COUNT、AVG、SUM、MIN、MAX、MOD、 LENGTH、および RTRIM です。

CHAR、VARCHAR、BLOB(n)、DATE、TIME および TIMESTAMP データ・タイプに対する算術演算はサポートされません。

リテラル
リテラル は、データ・タイプ INTEGER、SMALLINT、DECIMAL、 CHAR(n)、VARCHAR(n)、BLOB(n)、DATE、TIME または TIMESTAMP の値にすることができます。
表名
照会する列を含んでいる表を指定します。
.
2 つの部分からなる列 ID の区切り文字。表名.列名
列名
照会する列を指定します。
COUNT()
COUNT() の引き数は、1 組の行です。ヌル値の除去により、 引き数値から引き出された 1 組の行にこの関数が適用されます。結果は、重複を 含む、1 組の中の異なる非ヌル値の数です。
AVG()
AVG() 関数は、 の値の平均を戻します。 引き数値は数値でなければなりません。また、合計は、結果のデータ・タイプの範囲内 でなければなりません。ヌル値の除去により、引き数値から引き出された 1 組 の値にこの関数が適用されます。結果はヌル値になる場合があります。
SUM()
SUM() 関数は、 の値の合計を戻します。 引き数値は数値でなければなりません。また、合計は、結果のデータ・タイプの範囲内 でなければなりません。ヌル値の除去により、引き数値から引き出された 1 組 の値にこの関数が適用されます。
MIN()
MIN() 関数は、 の結果の最小値を戻します。 引き数値は、BLOB 以外の任意の組み込みタイプの値を指定することができます。 ヌル値の除去により、引き数値から引き出された 1 組 の値にこの関数が適用されます。
MAX()
MAX() 関数は、 の結果の最大値を戻します。 引き数値は、BLOB 以外の任意の組み込みタイプの値を指定することができます。 ヌル値の除去により、引き数値から引き出された 1 組 の値にこの関数が適用されます。
MOD(式, 式)
MOD(式, 式) 関数は、最初の引き数を 2 番目の引き数で除算した 余りを戻します。最初の引き数が負の値である場合にのみ、結果は負となります。

1 番目、2 番目の引き数は SMALLINT または INTEGER のいずれかです。

両方の引き数が SMALLINT であれば、結果は SMALLINT であり、それ以外の場合は、 INTEGER となります。結果がヌルになる場合があります。つまり、 引き数がヌルであれば、結果はヌル値になります。

(式 || 式)
(式 || 式) は、2 つのストリング引き数を連結した結果を戻します。この 2 つの引き数は、互換タイプでなければなりません。

この関数の結果はストリングです。 その長さは、2 つの引き数の長さの合計です。 引き数がヌル値もとる場合は、結果がヌルになることがあります。つまり、 引き数がヌルであれば、結果はヌル値になります。

LENGTH()

LENGTH() 関数は、値の長さを戻します。

引き数は式にもなり、以下の組み込まれたデータ・タイプの値を戻します。

  • VARCHAR
  • CHAR
  • BLOB

この関数の結果は整数です。引き数がヌル値もとる場合は、結果がヌルになることがあります。つまり、 引き数がヌルであれば、結果はヌル値になります。

結果は、引き数の長さです。可変長ストリングの長さは実際の長さで、最大長ではありません。

BLOB の長さは、値を表すために使用したバイトの数です。

ADDRESS という列名の VARCHAR(50) の列に、「895 Don Mills Road」という値が入っているとします。LENGTH(ADDRESS) は 18 という値を戻します。

RTRIM()

RTRIM() 関数は、ストリングの終わりからブランクを除去します。

引き数は、CHAR または VARCHAR のデータ・タイプにすることができます。

この機能の結果データ・タイプは常に VARCHAR となります。

戻されたタイプの長さパラメーターは、引き数データ・タイプの長さパラメーターと同じになります。

文字ストリングの結果の実際の長さは、ストリング式から、 ブランク文字として除去したバイト数を引いた長さです。 漢字ストリングの結果の実際の長さは、ストリング式から除去したブランク文字 (2 バイト) を引いた長さ (2 バイト文字) です。すべての文字が除去されると、結果は空になり、可変長ストリング (長さはゼロ) となります。

引き数がヌル値もとる場合は、結果がヌルになることがあります。つまり、 引き数がヌルであれば、結果はヌル値になります。

NAME という列名の CHAR(50) の列に、「Cliff」という値が入っていると します。RTRIM(NAME) は「Cliff」を戻します。LENGTH(RTRIM(NAME)) は 5 を戻します。

LCASE / UCASE

LCASE 関数または LOWER 関数は、SBCS 文字がすべて小文字に変換されたストリングを戻します。つまり、文字 A から Z が文字 a から z に変換され、発音区別符号が付いた文字があれば、それらは同等の小文字に変換されます。

引き数は、値のデータ・タイプが CHAR か VARCHAR である式でなくてはなりません。

上記の関数の結果は、引き数と同じデータ・タイプと長さの属性を持つことになります。引き数がヌル値もとる場合は、結果がヌルになることがあります。つまり、 引き数がヌルであれば、結果はヌル値になります。

EMPLOYEE 表の列 JOB の値に含まれる文字は小文字で戻されることを確認してください。例えば、次のようにします。

SELECT LCASE(JOB)
     FROM EMPLOYEE
     WHERE EMPNO = '000020';
特殊レジスター
現在の日付、時刻およびタイム・スタンプを生成するために、 特殊レジスター CURRENT DATE、CURRENT TIME および CURRENT TIMESTAMP を使用することができます。
FROM
FROM 文節は、中間結果表を指定します。

1 つの表参照を指定した場合、中間結果表は単純にその表参照の結果です。 2 つ以上の表参照を指定した場合、中間結果表は、指定した表参照の行の可能な 組み合わせすべて (カルテシアン積) で構成されます。結果の各行は、最初の表参照 からの行を 2 番目の表参照からの行と連結したもの、さらに、2 番目の行は 3 番目 の表参照からの行と連結した行になります。以下同様です。 結果における行数は、各表参照における行数の積となります。 FROM 文節には、最大 20 まで表を指定できます。

表名
表参照として指定する各表名 は、既存の表を示す必要があります。
AS
表定義を指定します。
相関名
相関名 は、直前の表名 を指定機能として定義します。 表に関して相関名を指定した場合、表の列へのすべての修飾参照は、表名ではなく 相関名を使用する必要があります。同じ表名 を 2 回指定する場合、 少なくとも 1 つの表名指定の後に相関名 を付ける必要があります。 相関名 は、表の列への参照を修飾するために使用します。 修飾子として相関名を使うことによって、あいまいになることを 防いだり、相関参照を設定したりすることができます。また、相関名は、単に表名 を短くした名前として使うこともできます。
WHERE
行を選択する条件を指定します。この文節は省略できます。 省略しない場合には、検索条件を指定してください。この文節を省略すると、 表のすべての行が選択されます。
検索条件
検索条件 は、指定された行に関して、 真、偽、または不明となる条件を指定します。

検索条件 の結果は、指定した各述部の結果に対して、指定した 論理演算子 (AND、OR、NOT) を適用することによって得られます。 述部は 2 つの値を比較します。論理演算子を指定しなければ、 検索条件の結果は、指定した述部の結果となります。

括弧内の検索条件が先に評価されます。評価の順序を括弧で指定していない場合、NOT が AND の前に 適用され、AND が OR の前に適用されます。同じ順序レベルの演算子が評価される順序は、検索条件の最適化が できるように未定義となっています。

表の各行に検索条件 が適用され、検索条件 の 結果が真となった行が選択されます。

検索条件の中の各列名 は、表の列を示すものでなければなりません。

NOT
NOT を指定すると、述部の結果は逆になります。
は、 リテラル、列名、特殊レジスター、関数のいずれでもかまいません。

CHAR、VARCHAR、BLOB(n)、DATE、TIME および TIMESTAMP データ・タイプに対する算術演算はサポートされません。

リテラル
リテラル は、データ・タイプ INTEGER、SMALLINT、DECIMAL、 CHAR(n)、VARCHAR(n)、BLOB(n)、DATE、TIME、 または TIMESTAMP の値にすることができます。
表名
述部のオペランドである列を含んでいる表を指定します。
.
2 つの部分からなる列 ID の区切り文字。表名.列名
列名
述部のオペランドである列を指定します。
特殊レジスター
述部のオペランドである特殊レジスターを指定します。 現在の日付、時刻およびタイム・スタンプを生成するために、 特殊レジスター CURRENT DATE、CURRENT TIME および CURRENT TIMESTAMP を使用することができます。
関数
組み込める関数は LCASE、UCASE、MOD、LENGTH、および RTRIM です。
演算子
以下のいずれかの演算子を指定することができます。

=
等しい。

<>
等しくない。

<
より小さい。

>
より大きい。

<=
より小さいか等しい。

>=
より大きいか等しい。

||
2 つのストリング引き数を連結した結果を戻します。

LIKE
1 つの文字ストリングを突き合わせます。1 つの 1 バイト文字セット文字 (SBCS) を表すには、SBCS の下線を使用します。 1 つの 2 バイト文字セット文字 (DBCS) を表すには、DBCS の下線を使用します。 例えば、条件が WHERE PART_NUMBER LIKE '_0' の場合、0 で終わるすべての 2 桁の パーツ番号 (例えば、20、30、40 など) が戻ります。ゼロ以上の SBCS または DBCS 文字のストリングを表す場合は、% (SBCS あるいは DBCS のいずれでも) を使用してください。例えば、 条件が WHERE DEPT_NUMBER LIKE '2%' の場合、2 で始まるすべての 部門番号 (20、27、234 など) が戻ります。

NOT LIKE
同じ文字が 1 つもありません。

IN
値の集合と一致するもの。 述部 IN は、値を値の集合と比較します。

例:

SELECT lname, fname FROM emp WHERE state IN ('CA', 'AZ', 'OR');

SELECT c1 FROM t1 WHERE c1*5-6 IN (mod(c2,2)+5,c3+4/2);

NOT IN
値の集合と一致しないもの。述部 NOT IN は、値を値の集合と比較します。

例:

SELECT empid FROM emp WHERE city NOT IN ('San Jose', 'Morgan Hill', 'Santa Clara');

IS NULL
ヌル値を含んでいます。

IS NOT NULL
ヌル値を含んでいません。
AND
指定した場合、論理演算子 AND が、指定した各述部の結果に適用されます。
OR
指定した場合、論理演算子 OR が、指定した各述部の結果に適用されます。
GROUP BY
R の行のグループ化により構成される中間結果表を作成します。R は 副選択に関する前の文節の結果です。
ORDER BY
結果表の行の配列を指定します。
列名
通常は、結果表の列を指定します。この場合、列名 は選択リスト 内の指定された列の列名でなければなりません。
単純整数
1 以上で、結果表の列の数以下でなければなりません。整数 n は 結果表の n 列目を示します。
ASC
列の値を昇順で使用します。
DESC
列の値を降順で使用します。
LIMIT 単純整数
アプリケーションに戻す行の数を、応答セット内の最初の n 行に制限します。 この n は整数です。 0 より大である必要があります。
関連演算子
以下のいずれかの演算子を指定することができます。

+
加算

-
減算

*
乗算

/
除算

規則

GROUP BY、ORDER BY、および DISTINCT 文節で BLOB データ・タイプ列を使用することはできません。

注意事項

例 1: EMPLOYEE 表から 01/01/1980 以降に雇用された 従業員 (EMPNO および LASTNAME) を選択し、ラストネーム (LASTNAME) の順に並べます。

SELECT EMPNO, LASTNAME FROM EMPLOYEE
 WHERE HIREDATE > '01/01/1980'
 ORDER BY LASTNAME

例 2: EMPLOYEE 表の部門ごとに平均給与を計算します。

SELECT DEPT, AVG(SALARY) FROM EMPLOYEE
 GROUP BY DEPT

例 3: 各販売地域ごとに最大販売量を計算し、 販売量の多い方から少ない方へと順に、地域別に結果を表示します。

SELECT REGION, MAX(SALES_VOL) FROM SALES
 GROUP BY REGION ORDER BY 2 DESC

関連した解説