SELECT sentencia
La sentencia SELECT es la forma de una consulta que puede especificarse directamente en una sentencia DECLARE CURSOR, o prepararse y luego referenciarse en una sentencia DECLARE CURSOR. También puede emitirse de forma interactiva utilizando SPUFI o el protocolo de intercambio de datos de formularios ( Db2 command line processor), que hace que se muestre una tabla de resultados en su terminal. En cualquier caso, la tabla especificada por select-statement es el resultado de fullselect.
Autorización para declaraciones SELECT
Para cualquier tipo de consulta, el conjunto de privilegios que se define a continuación debe incluir una de las siguientes autoridades o conjuntos de privilegios:
- Para cada tabla o vista identificada en la declaración, el conjunto de privilegios debe incluir uno de los siguientes:
- Propiedad de la tabla o vista
- El privilegio SELECT en la tabla o vista
- Autoridad DBADM para la base de datos (solo tablas)
Si la base de datos se crea de forma implícita, los privilegios de la base de datos deben estar en la base de datos implícita o en DSNDB04.
- Autorización SYSADM
- Autorización SYSCTRL (sólo tablas de catálogo)
- Autorización DATAACCESS
Autoridad de instalación SYSOPR (solo tablas de catálogo y tablas de sistema)
- Para cada función definida por el usuario que se identifique en la declaración, una de las siguientes:
- El privilegio EXECUTE en la función
- Titularidad de la función
- Autorización SYSADM
- Autorización DATAACCESS
Si una consulta incluye un objeto de secuencia, los privilegios que posee el ID de autorización de la declaración deben incluir al menos uno de los siguientes:- Para cada objeto de secuencia que se identifique en la declaración, uno de los siguientes:
- El privilegio USAGE en el objeto de secuencia
- Propiedad del objeto de secuencia
- Autorización DATAACCESS

Si la sentencia select forma parte de una sentencia DECLARE CURSOR, el conjunto de privilegios son los privilegios que posee el ID de autorización del propietario del plan o paquete.
Si la sentencia SELECT contiene una sentencia SQL de modificación de datos, el conjunto de privilegios debe incluir el privilegio SELECT y los privilegios adecuados para la sentencia SQL de modificación de datos (privilegios de inserción, actualización o eliminación) en la tabla o vista de destino.
Si la sentencia select hace referencia a una tabla que contiene un control de acceso de fila o columna activo, y se definen permisos de fila o máscaras de columna para la tabla, el ID de autorización o el rol de la sentencia no necesita autorización para hacer referencia a objetos que se especifican en las definiciones de esos permisos de fila o máscaras de columna.
Conjuntos Privilege para consultas
Si la declaración está integrada en un programa de aplicación, el conjunto de privilegios son los privilegios que posee el propietario del plan o paquete. 
Si el estado se prepara dinámicamente y la aplicación está vinculada en un contexto de confianza, el conjunto de privilegios es el conjunto de privilegios que posee ese rol. De lo contrario, el conjunto de privilegios depende del comportamiento de la sentencia SQL dinámica, que se especifica mediante la opción DYNAMICRULES:
- Comportamiento de ejecución
- El conjunto de privilegios es la unión de los conjuntos de privilegios que posee cada ID de autorización del proceso.
- Comportamiento de vinculación
- El conjunto de privilegios son los privilegios que posee el ID de autorización del propietario del plan o paquete.
- Definir comportamiento
- El conjunto de privilegios son los privilegios que posee el ID de autorización del propietario del procedimiento almacenado o de la función definida por el usuario.
- Comportamiento de invocación
- El conjunto de privilegios son los privilegios que posee el ID de autorización del invocador del procedimiento almacenado o de la función definida por el usuario.
Para obtener una lista de los valores de DYNAMICRULES que especifican ejecutar, vincular, definir o invocar un comportamiento, consulte la Tabla 1.
Cuando se utiliza cualquier forma de consulta como componente de otra instrucción, las reglas de autorización que se aplican a la consulta se especifican en la descripción de dicha instrucción. Por ejemplo, consulte las reglas de autorización que se aplican a la subselección en una instrucción CREATE VIEW en CREATE VIEW statement.
Si su instalación utiliza la salida de autorización de control de acceso ( DSNX@XAC ), esa salida podría estar controlando las reglas de autorización en lugar de las reglas que se enumeran aquí.
Sintaxis para la sentencia select
- 1 Si fullselect es una cláusula VALUES, common-table-expression, update-clause, read-only-clause, optimize-clause, isolation-clause, queryno-clause y SKIP LOCKED DATA no deben especificarse también
- 2 La cláusula de solo lectura no debe especificarse si se especifica la cláusula de actualización.
- 3 La misma cláusula no debe especificarse más de una vez.
La sentencia select es la forma de una consulta que puede especificarse directamente en una sentencia DECLARE CURSOR o FOR, prepararse y luego referenciarse en una sentencia DECLARE CURSOR, o especificarse directamente en una cláusula de asignación SQLJ. También puede emitirse utilizando SPUFI o el protocolo de intercambio de datos de la industria de la joyería ( Db2 command line processor), que hace que se muestre una tabla de resultados en su terminal. En cualquier caso, la tabla de resultados especificada por una sentencia select es el resultado de fullselect. Para más información, consulte select-statement.
Las tablas y la vista identificadas en una sentencia select pueden estar en el servidor actual o en cualquier subsistema de Db2 con el que el servidor actual pueda establecer una conexión.
Para consultas locales en Db2 for z/OS® o consultas remotas en las que el servidor y el solicitante son Db2 for z/OS, si una tabla está codificada como ASCII o Unicode, los datos recuperados se codifican en EBCDIC. Para obtener información sobre cómo recuperar datos codificados en ASCII o Unicode, consulte Consultas distribuidas contra tablas ASCII o Unicode.
Una sentencia select puede invocar implícita o explícitamente funciones definidas por el usuario o invocar implícitamente procedimientos almacenados. Esta técnica se conoce como anidamiento de sentencias SQL. Una función o procedimiento se invoca implícitamente en una sentencia select cuando se invoca en un nivel inferior. Por ejemplo, si invoca una función definida por el usuario desde una sentencia select y la función definida por el usuario invoca un procedimiento almacenado, está invocando implícitamente el procedimiento almacenado.
Sintaxis para fullselect
- 1 Si se especifica la cláusula values-clause, no se deben especificar también UNION, EXCEPT, INTERSECT, order-by-clause o fetch-clause. Si fullselect contiene una cláusula values, sólo debe especificarse en una sentencia select a la que se haga referencia mediante statement-name en una sentencia PREPARE.
El fullselect es un componente de la sentencia select, de la sentencia ALTER TABLE para la definición de una tabla de consulta materializada, de la sentencia CREATE TABLE, de la sentencia CREATE VIEW, de la sentencia DECLARE GLOBAL TEMPORARY TABLE, de la sentencia INSERT, de la sentencia UPDATE y de la sentencia MERGE. Para más información, consulte fullselect
Sintaxis para subselección
La subselección es un componente de la selección completa. Una subselección especifica una tabla de resultados que deriva de las tablas o vistas identificadas en la cláusula FROM. Para más información, consulte la subsección.
Sintaxis de la cláusula select
La cláusula SELECT especifica las columnas de la tabla de resultado final. Los valores de la columna se producen mediante la aplicación de la lista de selección a R. La lista de selección es una lista de nombres y expresiones especificados en la cláusula SELECT, y R es el resultado de la operación anterior de la subselección. Por ejemplo, si SELECT, FROM y WHERE son las únicas cláusulas especificadas, R es el resultado de esa cláusula WHERE. Para más información, consulte la cláusula select.
Sintaxis de la cláusula from
La cláusula FROM especifica una tabla resultante intermedia. para más información, consulte la cláusula from.
Sintaxis de la cláusula where
La cláusula WHERE especifica una tabla de resultados que consta de aquellas filas de R para las que la condición de búsqueda es verdadera. R es el resultado de la cláusula FROM de la subselección. Para más información, consulte la cláusula where.
Sintaxis para la cláusula group-by
La cláusula GROUP BY especifica una tabla de resultados que consta de una agrupación de las filas de la tabla de resultados intermedia que es el resultado de la cláusula anterior. Para más información, consulte la cláusula de agrupación.
Sintaxis de la cláusula having
La cláusula HAVING especifica una tabla de resultados que consta de aquellos grupos de la tabla de resultados intermedia para los que la condición-búsqueda es verdadera. La tabla de resultados intermedia es el resultado de la cláusula anterior. Si esta cláusula no es GROUP BY, la tabla de resultados intermedia se considera un solo grupo sin columnas de agrupación de la cláusula anterior de la subselección. Para más información, consulte la cláusula having.
Sintaxis de la cláusula order-by
La cláusula ORDER BY especifica una ordenación de las filas de la tabla resultante. Para más información, consulte la cláusula de pedido.
Sintaxis de la cláusula fetch
FL 500 La cláusula fetch limita el número de filas que se pueden recuperar. Para más información, consulte fetch-clause.
Sintaxis de la cláusula offset
FL 500 La cláusula offset especifica el número de filas de la tabla de resultados que se deben omitir antes de recuperar cualquier fila. Para más información, consulte la cláusula de compensación.
Ejemplos de SELECT
Ejemplo 1: Seleccionar todas las filas de DSN8C10.EMP.
SELECT * FROM DSN8C10.EMP;Ejemplo 2: Seleccionar todas las filas de DSN8C10.EMP, ordenando la tabla de resultados en orden cronológico por fecha de contratación.
SELECT * FROM DSN8C10.EMP ORDER BY HIREDATE;Ejemplo 3: Seleccione el número de departamento (WORKDEPT) y el salario medio del departamento (SALARY) para todos los departamentos de la tabla DSN8C10.EMP. Ordene la tabla resultante por orden ascendente por el salario medio del departamento.
SELECT WORKDEPT, AVG(SALARY) FROM DSN8C10.EMP GROUP BY WORKDEPT ORDER BY 2;Ejemplo 4: Cambiar varios salarios, bonificaciones y comisiones en la tabla DSN8C10.EMP. Limitar los cambios a los empleados de los departamentos D11 y D21. Utiliza actualizaciones posicionadas para hacer esto con un cursor llamado UP_CUR. Utilice una cláusula FOR UPDATE en la declaración del cursor para indicar que se actualizan todas las columnas actualizables. A continuación se muestra la declaración de un programa 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;A partir de donde se declara el cursor, se actualizarían todas las columnas actualizables. Si solo se necesitara actualizar columnas específicas, como por ejemplo solo la columna de salario, se podría utilizar la cláusula FOR UPDATE para especificar la columna de salario (FOR UPDATE OF SALARY).
Ejemplo 5: Encuentre la bonificación máxima, mínima y media en la tabla DSN8C10.EMP. Ejecutar la sentencia con aislamiento de lectura no comprometido, independientemente del valor de ISOLATION con el que esté vinculado el plan o paquete que contiene la sentencia. Asigne 13 como número de consulta para la instrucción SELECT.
EXEC SQL SELECT MAX(BONUS), MIN(BONUS), AVG(BONUS) INTO :MAX, :MIN, :AVG FROM DSN8C10.EMP WITH UR QUERYNO 13;Si se especifica la opción de enlace EXPLAIN(YES), se insertan filas en la tabla del plan. El valor utilizado para la columna QUERYNO para estas filas es 13.
Ejemplo 6: La declaración del cursor que se muestra a continuación se encuentra en un programa PL/I. En la consulta dentro de la declaración,
X.RMT_TABes un alias para una tabla en algún otro Db2. Por lo tanto, cuando se utiliza la consulta, se procesa mediante el acceso DRDA. Véase Bases de datos relacionales distribuidas.La declaración indica que no se realizarán actualizaciones o eliminaciones posicionadas con el cursor de la consulta. También especifica que la ruta de acceso para la consulta se optimice para la recuperación de un máximo de 50 filas. Aun así, el programa puede recuperar más de 50 filas de la tabla de resultados, que consiste en toda la tabla identificada por el alias. Sin embargo, cuando se recuperan más de 50 filas, el rendimiento podría degradarse.
EXEC SQL DECLARE C1 CURSOR FOR SELECT * FROM X.RMT_TAB OPTIMIZE FOR 50 ROWS FOR READ ONLY;La cláusula FETCH FIRST podría utilizarse en lugar de la cláusula OPTIMIZE FOR para garantizar que solo se recuperen 50 filas, como en el siguiente ejemplo:EXEC SQL DECLARE C1 CURSOR FOR SELECT * FROM X.RMT_TAB FETCH FIRST 50 ROWS ONLY;Ejemplo 7: Supongamos que la tabla DSN8C10.EMP tiene 1000 filas y desea ver los primeros cinco valores EMP_ROWID que se insertaron en DSN8C10.EMP_PHOTO_RESUME.
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;Las 1000 filas se insertan en DSN8C10.EMP_PHOTO_RESUME, pero solo se devuelven las cinco primeras.
