SELECT 语句

SELECT语句是一种查询形式,可以直接在DECLARE CURSOR语句中指定,也可以在DECLARE CURSOR语句中准备并引用。 它也可以通过SPUFI或 Db2 command line processor 进行交互式发布,从而在您的终端上显示结果表。 无论如何, select-statement 指定的表都是 fullselect 的结果。

SELECT语句的授权

对于任何形式的查询,下面定义的权限集必须包含以下权限或权限集之一:

  • 对于语句中标识的每个表或视图,权限集必须包含以下内容之一:
    • 表格或视图的所有权
    • 表或视图的 SELECT 权限
    • DBADM 数据库权限(仅限表格)

    如果数据库是隐式创建的,则数据库权限必须位于隐式数据库或 DSNDB04 上。

  • SYSADM 权限
  • SYSCTRL权限(仅限目录表)
  • DATAACCESS 权限
  • 更改开始安装SYSOPR权限(仅限目录表和系统表)更改结束
如果查询包含用户定义的函数,则语句授权ID所拥有的权限必须至少包含以下一项:
  • 对于语句中标识的每个用户定义的函数,以下选项之一:
    • 函数上的EXECUTE权限
    • 拥有该功能
  • SYSADM 权限
  • DATAACCESS 权限
更改开始如果查询包含序列对象,则语句授权ID所拥有的权限必须至少包含以下一项:
  • 对于语句中标识的每个序列对象,以下选项之一:
    • 序列对象上的 USAGE 权限
    • 序列对象的所有权
  • DATAACCESS 权限
更改结束

如果选择语句是DECLARE CURSOR语句的一部分,则权限集是指计划或包的所有者的授权ID所拥有的权限。

如果选择语句包含 SQL 数据更改语句,则权限集必须包括 SELECT 权限以及目标表或视图上 SQL 数据更改语句的相应权限(插入、更新或删除权限)。

如果 select语句引用了包含活动行或列访问控制的表,并且为该表定义了行权限或列掩码,则语句的授权ID或角色无需权限即可引用这些行权限或列掩码定义中指定的对象。

查询权限设置

更改开始 如果语句嵌入在应用程序中,则权限集是指计划或包的所有者所拥有的权限。 更改结束

更改开始如果语句是动态准备的,并且应用程序在可信环境中绑定,则权限集是该角色所拥有的一组权限。 否则,特权集取决于动态SQL语句的行为,该行为由选项DYNAMICRULES指定:更改结束

运行行为
特权集是流程中每个授权ID所持有的特权集的集合。
绑定行为
特权集是指计划或套餐所有者授权ID所拥有的特权。
定义行为
特权集是指由存储过程或用户定义函数的授权ID持有的特权。
调用行为
特权集是指存储过程或用户定义函数的调用者的授权ID所拥有的特权。

有关指定运行、绑定、定义或调用行为的DYNAMICRULES值的列表,请参见表1

当任何形式的查询作为另一个语句的组成部分时,适用于该查询的授权规则将在该语句的描述中指定。 例如,请参阅 CREATE VIEW语句中适用于子选择的 授权规则。

如果您的安装使用了访问控制授权退出( DSNX@XAC ),则该退出可能会控制授权规则,而不是此处列出的规则。

选择语句的语法

阅读语法图跳过可视化语法图WITH,公共表表达式 全查询1 更新子句read-only-clause2优化子句isolation-clause疑问句SKIP LOCKED DATA3
注意:
  • 1 如果 fullselect 是 VALUES 子句、公共表表达式更新子句只读子句优化子句隔离子句查询无子句和跳过锁定数据,则不能同时指定这些子句
  • 2 如果指定了更新子句 ,则不得指定只读子句
  • 3 同一条款不得重复出现。

选择语句是一种查询形式,可以直接在DECLARE CURSOR语句或FOR语句中指定,也可以在DECLARE CURSOR语句中准备并引用,或者直接在SQLJ赋值子句中指定。 您也可以使用SPUFI或 Db2 command line processor 来生成结果表,并显示在您的终端上。 无论如何 ,select语句指定的结果表都是 fullselect的结果 更多信息,请参阅 select-statement

选择语句中指定的表和视图可以位于当前服务器上,也可以位于当前服务器可以与之建立连接的任何 Db2 子系统中。

对于本地查询( Db2 for z/OS® )或服务器和请求者位于远程( Db2 for z/OS )的查询,如果表格编码为ASCII或Unicode,则检索到的数据将编码为EBCDIC。 有关检索以ASCII或Unicode编码的数据的信息,请参阅对ASCII或Unicode表的分布式查询

一个精选语句可以隐式或显式调用用户定义的函数,也可以隐式调用存储过程。 这种技术被称为SQL语句嵌套。 当在较低级别调用时,在select语句中隐式调用函数或过程。 例如,如果您从选择语句中调用用户定义的函数,而该用户定义的函数又调用存储过程,那么您就隐式地调用存储过程了。

全选语法

阅读语法图跳过可视化语法图子查询( 全查询)值子句1UNIONEXCEPTINTERSECTDISTINCTALL子查询( 全查询)order-by-clauseoffset-clausefetch-子句
值子句
阅读语法图跳过可视化语法图 VALUES sequence-reference(, sequence-reference)
注意:
  • 1 如果指定了 values-clause ,则不能同时指定 UNION、EXCEPT、INTERSECT、 order-by-clausefetch-clause。 如果 fullselect 包含 values-clause ,则只能在 PREPARE 语句中通过 statement-name 引用的 select 语句中指定 fullselect。

fullselect是 select语句、用于定义具体化查询表的ALTER TABLE语句、CREATE TABLE语句、CREATE VIEW语句、DECLARE GLOBAL TEMPORARY TABLE语句、INSERT语句、UPDATE语句和MERGE语句的组成部分。 更多信息,请参阅全文

子选择语法

阅读语法图跳过可视化语法图 select-clause from-clause where 子句 分组子句 having-clause order-by-clause offset-clause fetch-子句

子选择是全选择的组成部分。 子选择指定从在 FROM 子句中标识的表或视图中派生的结果表。 更多信息,请参阅子选项

选择子句的语法

阅读语法图跳过可视化语法图 SELECT ALLDISTINCT *,表达式AS新列名未打包的行table-name视图名称相关名称.*

SELECT子句指定最终结果表的列。 列值是通过将选择列表应用于R产生的。 选择列表是SELECT子句中指定的名称和表达式列表,R是子选择操作的结果。 例如,如果只指定了 SELECT、FROM 和 WHERE 子句,则 R 是 WHERE 子句的结果。 更多信息,请参阅选择子句

从句的语法

阅读语法图跳过可视化语法图FROM,表引用

FROM 子句指定中间结果表。 更多信息,请参阅从句

where子句的语法

阅读语法图跳过可视化语法图WHERE搜索条件

WHERE子句指定一个结果表,该表由满足搜索条件的R行组成。 R 是子查询的 FROM 子句的结果。 更多信息,请参阅 where子句

分组子句的语法

阅读语法图跳过可视化语法图GROUP BY ,分组表达分组集超级集团

GROUP BY子句指定一个结果表,该结果表由中间结果表的行分组组成,而中间结果表是前一个子句的结果。 更多信息,请参阅 group-by-clause

有-从句的语法

阅读语法图跳过可视化语法图HAVING搜索条件

HAVING子句指定一个结果表,该表由满足搜索条件的中间结果表中的那些组组成。 中间结果表是上一句的结果。 如果此子句不是 GROUP BY,则中间结果表被视为一个单独的组,没有子选择子句中前一个子句的分组列。 更多信息,请参阅 “有”的从句

排序子句的语法

阅读语法图跳过可视化语法图ORDER BY ,排序键ASCDESCINPUT SEQUENCEORDER OF表号

排序键

阅读语法图跳过可视化语法图列名整数排序-关键字表达式

ORDER BY子句用于指定结果表中的行排序。 更多信息,请参阅按条款订购

取语句的语法

阅读语法图跳过可视化语法图 FETCH FIRSTNEXT1取行数ROWROWS ONLY

FL 500 取语句限制了可取行的数量。 更多信息,请参阅 fetch子句

偏移子句的语法

阅读语法图跳过可视化语法图 OFFSET 偏移行数 ROWROWS

FL 500偏移子句指定在检索任何行之前要跳过的结果表行数。 更多信息,请参阅偏移条款

例子 SELECT

  • 示例1:选择 DSN8C10.EMP中的所有行。

       SELECT * FROM DSN8C10.EMP;
  • 示例2:选择 DSN8C10.EMP中的所有行,按入职日期将结果表按时间顺序排列。

       SELECT * FROM DSN8C10.EMP
          ORDER BY HIREDATE;
  • 例3: 选择表 DSN8C10.EMP 中所有部门的部门编号(WORKDEPT)和部门平均工资(SALARY)。 按部门平均工资升序排列结果表。

       SELECT WORKDEPT, AVG(SALARY)
         FROM DSN8C10.EMP
         GROUP BY WORKDEPT
         ORDER BY 2;
  • 示例4:更改 DSN8C10.EMP 表中各种工资、奖金和佣金。 仅限 D11 和 D21 部门员工参与。 使用名为UP_CUR的游标进行定位更新。 在游标声明中使用FOR UPDATE子句,表示所有可更新的列都已更新。 以下是 PL/I 程序的声明。

       EXEC SQL DECLARE UP_CUR CURSOR FOR
         SELECT WORKDEPT, EMPNO, SALARY, BONUS, COMM
           FROM DSN8C10.EMP
           WHERE WORKDEPT IN ('D11','D21')
           FOR UPDATE;

    从光标所在的位置开始,所有可更新的列都会更新。 如果只需要更新特定的列,例如仅更新工资列,则可以使用FOR UPDATE子句来指定工资列(FOR UPDATE OF SALARY)。

  • 例题5:求 表DSN8C10.EMP 中奖金的最大值、最小值和平均值。 无论包含语句的计划或程序包的 ISOLATION 值为何,语句都将以未承诺的读取隔离执行。 将13作为SELECT语句的查询编号。

       EXEC SQL
         SELECT MAX(BONUS), MIN(BONUS), AVG(BONUS)
           INTO :MAX, :MIN, :AVG
           FROM DSN8C10.EMP
           WITH UR
           QUERYNO 13;

    如果指定了绑定选项EXPLAIN(YES),则会将行插入计划表。 这些行的QUERYNO列的值为13。

  • 例 6: 下图是 PL/I 程序中的游标声明。 在声明中的查询中, X.RMT_TAB 是其他 Db2 中一个表的别名。 因此,当使用查询时,会通过DRDA访问进行处理。 参见分布式关系数据库

    声明指出,查询光标不会进行任何定位更新或删除操作。 它还规定,查询的访问路径应针对最多50行的检索进行优化。 即使如此,程序仍可以从结果表中检索出50多行,该结果表由别名标识的整个表组成。 但是,当检索超过50行时,性能可能会下降。

       EXEC SQL DECLARE C1 CURSOR FOR
         SELECT * FROM X.RMT_TAB
         OPTIMIZE FOR 50 ROWS
         FOR READ ONLY;
    可以使用FETCH FIRST子句代替OPTIMIZE FOR子句,以确保只检索50行,如下例所示:
       EXEC SQL DECLARE C1 CURSOR FOR
         SELECT * FROM X.RMT_TAB
         FETCH FIRST 50 ROWS ONLY;
  • 示例 7:假设DSN8C10.EMP 有 1000 行,您想查看插入到 DSN8C10.EMP_PHOTO_RESUME 中的前五个 EMP_ROWID 值。

       EXEC SQL DECLARE CS1 CURSOR FOR
         SELECT EMP_ROWID
           FROM FINAL TABLE (INSERT INTO DSN8C10.EMP_PHOTO_RESUME (EMPNO)
                            SELECT EMPNO FROM DSN8C10.EMP)
           FETCH FIRST 5 ROWS ONLY;

    所有1000行都插入到 DSN8C10.EMP_PHOTO_RESUME中 ,但只返回前五行。