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
  • Inicio del cambioAutoridad de instalación SYSOPR (solo tablas de catálogo y tablas de sistema)fin del cambio
Si una consulta incluye una función definida por el usuario, los privilegios que posee el ID de autorización de la declaración deben incluir al menos uno de los siguientes:
  • 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
Inicio del cambioSi 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
fin del cambio

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

Inicio del cambio 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. fin del cambio

Inicio del cambioSi 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:fin del cambio

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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualWITH,expresión-tabla-común selección completa1 cláusula-actualizacióncláusula-sólo-lectura2Cláusula optimizecláusula-isolationcláusula de no responsabilidadSKIP LOCKED DATA3
Notas:
  • 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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualsubselección( selección completa)cláusula-values1UNIONEXCEPTINTERSECTDISTINCTALLsubselección( selección completa)cláusula-order-bycláusula-desplazamientocláusula-captación
cláusula-values
Leer diagrama de sintaxisOmitir el diagrama de sintaxis visual VALUES referencia-secuencia(, referencia-secuencia)
Notas:
  • 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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visual cláusula-select cláusula-from cláusula-where cláusula-group-by cláusula-having cláusula-order-by cláusula-desplazamiento cláusula-captació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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visual SELECT ALLDISTINCT *,expresiónASnuevo-nombre-de-columnafila-sin-paquetenombre-tablanombre-vistanombre-correlación.*

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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualFROM,referencia-tabla

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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualWHEREcondición-búsqueda

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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualGROUP BY ,expresión-agrupaciónconjuntos-agrupaciónsupergrupos

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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualHAVINGcondición-búsqueda

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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualORDER BY ,clave-clasificaciónASCDESCINPUT SEQUENCEORDER OFdesignador de tabla

clave-clasificación

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualnombre-columnaenteroclave-de-orden-expresión

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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visual FETCH FIRSTNEXT1get-row-countROWROWS ONLY

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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visual OFFSET desplazamiento-de-filas ROWROWS

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_TAB es 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.