SELECT

SELECT 语句是一种查询形式。

调用

此语句可以在使用 DB2 CLI 函数的应用程序中使用,也可以通过 CLP 发出。

语法

                         .-,--------------.
                         V                |
>>-SELECT--+----------+----| selectItem |-+--FROM--------------->
           '-DISTINCT-'
 
   .-,----------------------------------------.
   V                                          |
>----table-name--+--------------------------+-+----------------->
                 '-+----+--correlation-name-'
                   '-AS-'
 
>--+-----------------------------+------------------------------>
   '-WHERE--| search_condition |-'
 
>--+----------------------------------------------+------------->
   |           .-,------------------------------. |
   |           V                                | |
   '-GROUP BY----+---------------+--column-name-+-'
                 '-table-name--.-'
 
>--+----------------------------------------------------------------+-->
   |             .-,--------------.                                 |
   |             V                |                                 |
   '-ORDER BY--+---simple-integer-+-------------------------------+-'
               | .-,--------------------------------------------. |
               | V                                              | |
               '---+---------------+--column-name--+----------+-+-'
                   '-table-name--.-'               '-+-ASC--+-'
                                                     '-DESC-'
 
>--+-----------------------+-----------------------------------><
   '-LIMIT--simple-integer-'
 
selectItem:
 
|--+-*----------------------------------------+-----------------|
   +-COUNT--(--+-| expression |-+--)----------+
   |           '-*--------------'             |
   +-AVG--(----| expression |----)------------+
   +-SUM--(----| expression |----)------------+
   +-MIN--(----| expression |----)------------+
   +-MAX--(----| expression |----)------------+
   +-MOD--(-| expression |-,-| expression |-)-+
   +-LENGTH--(--| expression |--)-------------+
   +-RTRIM--(--| expression |--)--------------+
   +-LCASE--(--| expression |--)--------------+
   '-UCASE--(--| expression |--)--------------'
 
search_condition:
 
   .------------------------------------------------.
   V                                                |
|----+--------------------------------------------+-+-----------|
     '-+-AND-+--+-----+--+-| predicate |--------+-'
       '-OR--'  '-NOT-'  '-| search_condition |-'
 
predicate:
 
                             (1)
|--+-| basic predicate |-+--------------------------------------|
   +-| IN predicate |----+
   +-| LIKE predicate |--+
   '-| NULL predicate |--'
 
basic predicate:
 
|--| expression |--+-=---+--| expression |----------------------|
                   +- <>-+
                   +- <--+
                   +->---+
                   +- <=-+
                   +- >=-+
                   '-||--'
 
IN predicate:
 
                                .-,--------------.
                                V                |
|--| expression |--+-----+--IN----| expression |-+--------------|
                   '-NOT-'
 
LIKE predicate:
 
|--| expression |--+-----+--LIKE--| expression |----------------|
                   '-NOT-'
 
NULL predicate:
 
|--| expression |--IS--+-----+--NULL----------------------------|
                       '-NOT-'
 
expression:
 
   .-operator-----------------------------------.
   V                                            |
|----+----+--+-literal------------------------+-+---------------|
     +- +-+  +-+---------------+--column-name-+
     '- --'  | '-table-name--.-'              |
             +-special register---------------+
             '-function-----------------------'
 
operator:
 
|--+- /-+-------------------------------------------------------|
   +- *-+
   +- +-+
   '- --'
 
 

记录:

  1. 仅 NULL 谓词中允许 BLOB 表达式。

描述

selectItem
*
指定所有列。若指定了 *,则它必须是唯一的选择项。
COUNT(*)
COUNT 函数返回一组行或值中的行或值的数目。COUNT(*) 的自变量是一组行。结果是集合中的行数。只包含 NULL 值的行也被计入在内。
expression
expression 可以是文字、列名、函数或专用寄存器。有效函数包括:COUNT、AVG、SUM、MIN、MAX、MOD、LENGTH 和 RTRIM。

不支持对 CHAR、VARCHAR、BLOB(n)、DATE、TIME 和 TIMESTAMP 数据类型执行算术运算。

literal
literal 可以是数据类型为 INTEGER、SMALLINT、DECIMAL、 CHAR(n)、VARCHAR(n)、BLOB(n)、DATE、TIME 和 TIMESTAMP 的值。
table-name
标识包含您正在查询的列的表。
.
包含两部分的列标识 table-name.column-name 中的分隔符。
column-name
标识您正在查询的列。
COUNT(expression)
COUNT(expression) 的自变量是一组行。此函数应用于通过消去空值而从自变量值派生的行集。结果是集合中的非空值(包括重复的值)的数目。
AVG(expression)
AVG(expression) 函数返回 expression 的平均值。自变量值必须是数字,它们的和必须在结果数据类型的范围之内。此函数应用于通过消去空值而从自变量值派生的值的集合。结果可以为空。
SUM(expression)
SUM(expression) 函数返回 expression 的值的和。自变量值必须是数字,它们的和必须在结果数据类型的范围之内。此函数应用于通过消去空值而从自变量值派生的值的集合。
MIN(expression)
MIN(expression) 函数返回 expression 值集合中的最小值。自变量值可为除 BLOB 外的任何内置类型。此函数应用于通过消去空值而从自变量值派生的值的集合。
MAX(expression)
IAXexpression) 函数返回 expression 值集合中的最大值。自变量值可为除 BLOB 外的任何内置类型。此函数应用于通过消去空值而从自变量值派生的值的集合。
MOD(expression, expression)
MOD(expression, expression) 函数返回第一个自变量除以第二个自变量的余数。仅当第一个自变量是负数时,结果才是负数。

第一个和第二个自变量可以是 SMALLINT 或 INTEGER。

如果两个自变量都是 SMALLINT,则此函数的结果是 SMALLINT;否则,它是 INTEGER。结果可以为空;如果任何自变量为空,则结果是空值。

(expression || expression)
(expression || expression) 返回两个字符串自变量的并置。这两个自变量必须是兼容类型。

函数的结果是字符串。其长度是两个自变量的长度的和。如果自变量可以为空,则结果可以为空;如果自变量为空,则结果为空值。

LENGTH(expression)

LENGTH(expression) 函数返回值的长度。

自变量可以是返回下列内置数据类型的值的表达式:

  • VARCHAR
  • CHAR
  • BLOB

该函数的结果是整数。如果自变量可以为空,则结果可以为空;如果自变量为空,则结果为空值。

结果是自变量的长度。变长字符串的长度是实际长度,而不是最大长度。

BLOB 的长度是用来表示值的字节数。

考虑称为 ADDRESS 的 VARCHAR(50) 列,其值为 '895 Don Mills Road'。LENGTH(ADDRESS) 返回值 18。

RTRIM(expression)

RTRIM(expression) 函数从字符串末尾除去空格。

自变量可以是 CHAR 或 VARCHAR 数据类型。

该函数的结果数据类型始终是 VARCHAR。

所返回的类型的长度参数与自变量数据类型的长度参数相同。

字符串的结果的实际长度是字符串表达式的长度减去为空白字符除去的字节数。图形字符串的实际长度是字符串表达式的长度(以双字节字符数计)减去已除去的双字节空白字符数。如果所有字符都被除去了,则结果为空白变长字符串(长度为零)。

如果自变量可以为空,则结果可以为空;如果自变量为空,则结果为空值。

考虑称为 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';
special register
专用寄存器 CURRENT DATE、CURRENT TIME 和 CURRENT TIMESTAMP 可用来生成当前的日期、时间和时间戳记。
FROM
FROM 子句指定中间结果表。

如果指定一个表引用,则中间结果表就是那个表引用的结果。如果指定了多个表引用,则中间结果表由指定表引用的行的所有可能组合组成(笛卡尔乘积)。每一结果行都是第一个表引用中的一行与第二个表引用中的一行的并置,接着与第三个表引用中的一行并置,依此类推。结果中的行数是所有独立的表引用中的行数的乘积。最多可以在 FROM 子句中指定 20 个表。

table-name
指定成表引用的每个 table-name 都必须标识现有的表。
AS
标识表定义。
correlation-name
每个 correlation-name 都定义为 table-name 紧前面的指示符。如果对表指定一个相关名,则对该表列的任何限定引用都必须使用该相关名,而不是使用表名。如果指定同一个 table-name 两次,则至少一个指定的后面应跟随有 correlation-namecorrelation-name 用来限定对表列的引用。作为限定符,相关名可以用来避免不明确性或建立相关引用。它也可以仅仅用作表的简短名。
WHERE
指定选择行的条件。可以省略此子句,或指定搜索条件。如果省略此子句,则会选择所有表行。
search_condition
search_condition 指定关于给定行的为真、为假或未知的条件。

search_condition 的结果通过对每个指定谓词的结果应用指定的逻辑运算符(AND、OR 或 NOT)而导出。谓词对两个值作比较。如果未指定逻辑运算符,则搜索条件的结果就是指定的谓词的结果。

首先对圆括号内的搜索条件求值。如果圆括号未指定求值顺序,则 NOT 优先于 AND,而 AND 优先于 OR。同一优先级别的运算符的求值顺序未定义,这样可以优化搜索条件。

将对每一表行应用 search_condition,而所选择的行就是 search_condition 的结果为真的那些行。

搜索条件中的每个 column-name 都必须标识一个表列。

NOT
若指定 NOT,则谓词的结果相反。
expression
expression 可以是文字、列名、专用寄存器或函数。

不支持对 CHAR、VARCHAR、BLOB(n)、DATE、TIME 和 TIMESTAMP 数据类型执行算术运算。

literal
literal 可以是数据类型为 INTEGER、SMALLINT、DECIMAL、 CHAR(n)、VARCHAR(n)、BLOB(n)、DATE、TIME 或 TIMESTAMP 的值。
table-name
标识包含作为谓词操作数的列的表。
.
两部分列标识 table-name.column-name 中的分隔符。
column-name
标识作为谓词操作数的列。
special register
标识作为谓词操作数的专用寄存器。专用寄存器 CURRENT DATE、CURRENT TIME 和 CURRENT TIMESTAMP 可用来生成当前的日期、时间和时间戳记。
function
可包括 LCASE、UCASE、MOD、LENGTH 和 RTRIM 函数。
operator
可以是下列任何运算符:

=
等于。

<>
不等于。

<
小于。

>
大于。

<=
小于或等于。

>=
大于或等于。

||
返回两个字符串自变量的并置。

LIKE
与一个字符串相匹配。使用单字节字符集(SBCS)下划线字符来引用一个 SBCS 字符。使用双字节字符集(DBCS)下划线字符来引用一个 DBCS 字符。例如,条件 WHERE PART_NUMBER LIKE '_0' 返回所有以 0 结束的两位部件号(例如,20、30 和 40)。使用 %(SBCS 或 DBCS) 来引用具有零个或更多个 SBCS 或 DBCS 字符的字符串。例如,条件 WHERE DEPT_NUMBER LIKE '2%' 返回所有以数字 2 开始的部门号(例如,20、27 或 234)。

NOT LIKE
没有一个字符相同。

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
指定结果表的行的排序。
column-name
通常标识结果表的列。在这种情况下,column-name 必须是选择列表中命名列的列名。
simple-integer
必须大于 0 且不大于结果表中的列数。整数 n 标识结果表的第 n 列。
ASC
以升序使用列的值。
DESC
以降序使用列的值。
LIMIT simple-integer
将要返回给应用程序的行数限制为结果集中的头 n 行, 其中 n 是整数。必须大于 0。
关系运算符
可以是下列其中一个运算符

+

-

*

/

规则

BLOB 数据类型列不能用于 GROUP BY、ORDER BY 和 DISTINCT 子句。

注意事项

示例

示例 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

相关参考