SELECT 语句
SELECT语句是一种查询形式,可以直接在DECLARE CURSOR语句中指定,也可以在DECLARE CURSOR语句中准备并引用。 它也可以通过SPUFI或 Db2 command line processor 进行交互式发布,从而在您的终端上显示结果表。 无论如何, select-statement 指定的表都是 fullselect 的结果。
SELECT语句的授权
对于任何形式的查询,下面定义的权限集必须包含以下权限或权限集之一:
- 对于语句中标识的每个表或视图,权限集必须包含以下内容之一:
- 表格或视图的所有权
- 表或视图的 SELECT 权限
- DBADM 数据库权限(仅限表格)
如果数据库是隐式创建的,则数据库权限必须位于隐式数据库或 DSNDB04 上。
- SYSADM 权限
- SYSCTRL权限(仅限目录表)
- DATAACCESS 权限
安装SYSOPR权限(仅限目录表和系统表)
- 对于语句中标识的每个用户定义的函数,以下选项之一:
- 函数上的EXECUTE权限
- 拥有该功能
- SYSADM 权限
- DATAACCESS 权限

- 对于语句中标识的每个序列对象,以下选项之一:
- 序列对象上的 USAGE 权限
- 序列对象的所有权
- DATAACCESS 权限

如果选择语句是DECLARE CURSOR语句的一部分,则权限集是指计划或包的所有者的授权ID所拥有的权限。
如果选择语句包含 SQL 数据更改语句,则权限集必须包括 SELECT 权限以及目标表或视图上 SQL 数据更改语句的相应权限(插入、更新或删除权限)。
如果 select语句引用了包含活动行或列访问控制的表,并且为该表定义了行权限或列掩码,则语句的授权ID或角色无需权限即可引用这些行权限或列掩码定义中指定的对象。
查询权限设置
如果语句嵌入在应用程序中,则权限集是指计划或包的所有者所拥有的权限。
如果语句是动态准备的,并且应用程序在可信环境中绑定,则权限集是该角色所拥有的一组权限。 否则,特权集取决于动态SQL语句的行为,该行为由选项DYNAMICRULES指定:
- 运行行为
- 特权集是流程中每个授权ID所持有的特权集的集合。
- 绑定行为
- 特权集是指计划或套餐所有者授权ID所拥有的特权。
- 定义行为
- 特权集是指由存储过程或用户定义函数的授权ID持有的特权。
- 调用行为
- 特权集是指存储过程或用户定义函数的调用者的授权ID所拥有的特权。
有关指定运行、绑定、定义或调用行为的DYNAMICRULES值的列表,请参见表1。
当任何形式的查询作为另一个语句的组成部分时,适用于该查询的授权规则将在该语句的描述中指定。 例如,请参阅 CREATE VIEW语句中适用于子选择的 授权规则。
如果您的安装使用了访问控制授权退出( DSNX@XAC ),则该退出可能会控制授权规则,而不是此处列出的规则。
选择语句的语法
选择语句是一种查询形式,可以直接在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语句中隐式调用函数或过程。 例如,如果您从选择语句中调用用户定义的函数,而该用户定义的函数又调用存储过程,那么您就隐式地调用存储过程了。
全选语法
fullselect是 select语句、用于定义具体化查询表的ALTER TABLE语句、CREATE TABLE语句、CREATE VIEW语句、DECLARE GLOBAL TEMPORARY TABLE语句、INSERT语句、UPDATE语句和MERGE语句的组成部分。 更多信息,请参阅全文
子选择语法
子选择是全选择的组成部分。 子选择指定从在 FROM 子句中标识的表或视图中派生的结果表。 更多信息,请参阅子选项。
选择子句的语法
SELECT子句指定最终结果表的列。 列值是通过将选择列表应用于R产生的。 选择列表是SELECT子句中指定的名称和表达式列表,R是子选择操作的结果。 例如,如果只指定了 SELECT、FROM 和 WHERE 子句,则 R 是 WHERE 子句的结果。 更多信息,请参阅选择子句。
从句的语法
FROM 子句指定中间结果表。 更多信息,请参阅从句。
where子句的语法
WHERE子句指定一个结果表,该表由满足搜索条件的R行组成。 R 是子查询的 FROM 子句的结果。 更多信息,请参阅 where子句。
分组子句的语法
GROUP BY子句指定一个结果表,该结果表由中间结果表的行分组组成,而中间结果表是前一个子句的结果。 更多信息,请参阅 group-by-clause。
有-从句的语法
HAVING子句指定一个结果表,该表由满足搜索条件的中间结果表中的那些组组成。 中间结果表是上一句的结果。 如果此子句不是 GROUP BY,则中间结果表被视为一个单独的组,没有子选择子句中前一个子句的分组列。 更多信息,请参阅 “有”的从句。
排序子句的语法
ORDER BY子句用于指定结果表中的行排序。 更多信息,请参阅按条款订购。
取语句的语法
偏移子句的语法
例子 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中 ,但只返回前五行。