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.
Sintaxis de la cláusula select
Descripción de la cláusula select
- ALL
- Conserva todas las filas de la tabla de resultados finales y no elimina los duplicados redundantes. Este es el valor predeterminado.
- DISTINCT
- Elimina todas las filas excepto una de los juegos de filas duplicadas de la tabla resultante final.
Dos filas son duplicadas entre sí solo si cada valor de la primera fila es igual al valor correspondiente de la segunda fila. Para determinar las filas duplicadas, dos valores nulos se consideran iguales.
Cuando se especifica SELECT DISTINCT, ninguna columna o expresión de la lista implícita o explícita puede devolver un valor que sea un tipo de datos LOB o XML. Cuando una columna o expresión de la lista devuelve un valor que es un tipo de datos DECFLOAT y existen múltiples representaciones de bits del mismo número en el resultado intermedio, el valor que se devuelve es impredecible. Consulte Comparaciones numéricas para obtener información adicional.
Los controles de acceso a columnas no afectan al funcionamiento de SELECT DISTINCT. La eliminación de filas duplicadas se basa en los valores de columna originales, no en los valores enmascarados. Sin embargo, tras la aplicación de máscaras de columna, los valores enmascarados en la tabla de resultados finales podrían no reflejar la singularidad que impone SELECT DISTINCT.
Si se aplica una máscara de columna a una columna que deriva directa o indirectamente el resultado de SELECT DISTINCT, SELECT DISTINCT puede devolver un resultado que no es determinista. Las siguientes condiciones son algunos ejemplos de cuándo podría devolverse un resultado que no es determinista:- La definición de la máscara de columna hace referencia a otras columnas de la tabla a las que se aplica la máscara de columna.
- La columna se menciona en el argumento de una función escalar incorporada, como COALESCE, IFNULL, NULLIF, MAX, MIN, LOCATE, TOTALORDER, etc.
- La columna se referencia en el argumento de una función de agregación.
- La columna está incrustada en una expresión y la expresión contiene una función que no es determinista o tiene una acción externa.
Por compatibilidad con otras implementaciones de SQL, se puede especificar UNIQUE como sinónimo de DISTINCT.
- *
- Representa una lista de columnas de la tabla R, excluyendo cualquier columna que esté definida con el atributo IMPLICITLY HIDDEN. La lista de nombres se establece cuando se prepara la declaración que contiene la cláusula SELECT. Por lo tanto, * no identifica ninguna columna que se haya añadido a una tabla después de que se haya preparado el estado.
Una columna que se define con el atributo IMPLICITLY HIDDEN puede ser referenciada explícitamente en la lista de selección.
* no puede utilizarse en la definición de un permiso de fila o una máscara de columna.
- expresión
- Especifica los valores de una columna del resultado. Cada nombre de columna de la expresión debe identificar sin ambigüedades una columna de la tabla de resultados intermedios.
El resultado de la expresión no debe ser de tipo matriz, excepto en los siguientes contextos:

- La lista de selección externa de una fullselect que no incluye un operador de conjunto distinto de UNION ALL, en la definición de un cursor que no se puede desplazar
- La lista de selección externa de una instrucción SELECT INTO, cuando el destino de la columna correspondiente de la tabla de resultados de fullselect es una variable de matriz
- La lista de selección externa de una fullselect escalar que no incluye un operador de conjunto en el lado derecho de una sentencia de asignación SET o de una sentencia de asignación SQL PL, cuando el destino correspondiente de la asignación es una variable de matriz

- COMO nuevo-nombre-de-col umna
- Nombra o cambia el nombre de la columna del resultado. El nombre no debe estar calificado y no tiene que ser exclusivo. new-column-name es un identificador SQL de 128 bytes e UTF-8 es o menos.
- nombre.*
- Representa una lista de columnas de nombre, excluyendo cualquier columna que esté definida como implícitamente oculta, en el orden en que las columnas son producidas por la cláusula FROM. el nombre puede ser un nombre de tabla, de vista o de correlación, y debe designar un nombre de tabla, vista o correlación expuesto en la cláusula FROM que sigue inmediatamente a la cláusula SELECT. El primer nombre de la lista identifica la primera columna de la tabla o vista, el segundo nombre de la lista identifica la segunda columna de la tabla o vista, y así sucesivamente.
La lista de nombres se establece cuando se prepara la declaración que contiene la cláusula SELECT. Por lo tanto, * no identifica ninguna columna que se haya añadido a una tabla después de que se haya preparado el estado.
nombre.* no puede utilizarse en la definición de un permiso de fila o una máscara de columna.
Las sentencias SQL pueden prepararse de nuevo implícita o explícitamente. El efecto de otra preparación en las declaraciones que incluyen * o nombre.* es que se restablezca la lista de nombres. Por lo tanto, el número de columnas devueltas por la sentencia podría cambiar.
El número de columnas en el resultado de SELECT es el mismo que el número de expresiones en la forma operativa de la lista de selección (es decir, la lista establecida en el momento en que se prepara la instrucción), y no puede exceder de 750. El resultado de una subconsulta debe ser una sola columna, a menos que la subconsulta se utilice en un predicado EXISTS.
Notas:
- Si la cláusula FROM contiene una instrucción MERGE:
- La lista SELECT no debe referirse implícita o explícitamente a una columna que tenga un tipo de datos LOB, un tipo de datos ROWID (o un tipo distinto que se base en un LOB o ROWID), o un tipo de datos XML.
- Columnas implícitamente ocultas en la lista de selección:
- El resultado de SELECT * no incluye ninguna columna que esté definida con el atributo IMPLICITLY HIDDEN. Para que se incluya en el resultado, las columnas ocultas implícitamente se deben especificar explícitamente en la lista de selección.
- Datos VARBINARIOS:
- Si la tabla identificada tiene un índice en una columna VARBINARY o una columna que es un tipo distinto basado en el tipo de datos VARBINARY, esa columna de índice no puede especificar el atributo DESC. Para consultar la tabla identificada, elimine el índice o cambie el tipo de datos de la columna a BINARIO y, a continuación, vuelva a crear el índice.
- Aplicación de la lista de selección:
- Algunos de los resultados de aplicar la lista de selección a R dependen de si se utiliza GROUP BY o HAVING. Las tres listas siguientes describen los resultados.
- SI no se utiliza ni GROUP BY ni HAVING:
- La lista de selección puede incluir funciones agregadas solo si incluye otras funciones agregadas, constantes o expresiones que solo involucren constantes.
- Si la lista de selección no incluye funciones agregadas, se aplica a cada fila de R y el resultado contiene tantas filas como filas hay en R.
- Si la lista de selección incluye funciones agregadas, R es la fuente de los argumentos de las funciones y el resultado de aplicar la lista de selección es una fila, incluso cuando R no tiene filas.
- Si se utiliza una máscara de columna para enmascarar los valores en la tabla de resultados finales, y la lista de selección incluye funciones agregadas, la definición de la máscara de columna no debe hacer referencia a lo siguiente:
- una selección completa escalar
- Una función agregada
- Si se utiliza HAVING y no se utiliza GROUP BY:
- Cada expresión o nombre de columna en una expresión de la lista de selección debe especificarse dentro de una función agregada. Las constantes o expresiones que solo implican constantes también pueden estar en la lista de selección.Si se utiliza una máscara de columna para enmascarar los valores en la tabla de resultados finales, la definición de la máscara de columna no debe hacer referencia a lo siguiente:
- una selección completa escalar
- Una función agregada
- Si se utiliza GROUP BY:
- Cada expresión de la lista de selección debe utilizar una o más expresiones de agrupación. O bien, cada expresión o nombre de columna en una expresión debe:
- Identificar sin ambigüedades una columna de agrupación de R.
- Debe especificarse en una función agregada.
- Ser una referencia correlacionada. (Un nombre de columna es una referencia correlacionada si identifica una columna de una tabla o vista identificada en una subselección externa)
- Si una expresión de la lista de selección es una selección completa escalar, una referencia correlacionada de la selección completa escalar a un grupo R debe identificar una columna de agrupación o estar contenida dentro de una función agregada. Por ejemplo, la siguiente consulta falla porque la referencia correlacionada T1.C1 || T1.C2 en la lista de selección del fullselect escalar no coincide con una columna de agrupación de la subselección externa. (No se admite la coincidencia de la expresión de agrupación T1.C1 || T1.C2 )
SELECT MAX(T1.C2) AS X1, (SELECT T1.C1 || T1.C2 FROM T2 GROUP BY T2.C1) AS Y1 FROM T1 GROUP BY T1.C1, T1.C1 || T1.C2; - No puede utilizar GROUP BY con un nombre definido mediante la cláusula AS a menos que el nombre esté definido en una expresión de tabla anidada. El ejemplo 6 muestra el uso válido de AS y GROUP BY en una instrucción SELECT.
En cualquier caso, la enésima columna del resultado contiene los valores especificados al aplicar la enésima expresión en la forma operativa de la lista de selección.
Si se utiliza una máscara de columna para enmascarar los valores de columna en la tabla de resultados finales, una columna a la que se aplique la máscara de columna debe cumplir una de las siguientes condiciones:- La columna debe especificarse en una función agregada y la definición de la máscara de columna no debe hacer referencia a lo siguiente:
- una selección completa escalar
- Una función agregada
- La columna debe identificar un nombre de columna en la cláusula GROUP BY y la columna no debe ser referenciada en una expresión en la cláusula GROUP BY. Además, cualquier columna de la misma tabla que la columna a la que se aplica la máscara de columna y a la que se hace referencia en la definición de la máscara de columna debe identificarse con un nombre de columna en la cláusula GROUP BY. No se debe hacer referencia a estas columnas en una expresión de la cláusula GROUP BY.
- Una columna de una tabla no base en la lista de selección debe especificarse en una función agregada si se utiliza una máscara de columna para enmascarar los valores de columna en la tabla de resultados finales, y la columna de una tabla no base se asigna directa o indirectamente a un nombre de columna o a una expresión en una expresión de tabla materializada o vista a la tabla donde se aplica la máscara de columna.
- Cada expresión de la lista de selección debe utilizar una o más expresiones de agrupación. O bien, cada expresión o nombre de columna en una expresión debe:
- Efecto de las máscaras de columna en las columnas de resultados:
- Cuando las máscaras de columna están habilitadas, determinan los valores en la tabla de resultados finales de una lista de selección más externa. Cuando se habilita una máscara de columna para una columna, si la columna aparece en la lista de selección más externa (implícita o explícitamente), la máscara de columna se aplica a la columna para producir los valores de la tabla de resultados finales. Si la columna en sí no aparece en la lista de selección más externa, pero se incluye en el resultado (por ejemplo, aparece en una expresión de tabla materializada o en una vista), el valor enmascarado se incluye en la tabla de resultados de la expresión de tabla o vista para que pueda utilizarse en la tabla de resultados final.
Las máscaras de columna habilitadas no interfieren con las operaciones de otras cláusulas dentro de la sentencia, como las cláusulas WHERE, GROUP BY, HAVING, SELECT DISTINCT y ORDER BY.
Las filas que se devuelven en la tabla de resultados finales permanecen igual, excepto que los valores en las filas de resultados podrían estar enmascarados. Por lo tanto, si una columna con valores enmascarados también aparece en una cláusula ORDER BY con una expresión de clave de ordenación, el orden se basa en los valores de la columna original (los valores enmascarados en la tabla de resultados finales podrían no reflejar ese orden). Del mismo modo, los valores enmascarados podrían no reflejar la singularidad impuesta por un SELECT DISTINCT. Si la columna enmascarada está incrustada en una expresión, el resultado de la expresión podría ser diferente porque la máscara de columna se aplica a la columna antes de que se evalúe la expresión. Por ejemplo, una máscara de columna en la columna SSN puede cambiar el resultado de la función COUNT(DISTINCT SSN) porque la operación DISTINCT se realiza en los valores enmascarados. Sin embargo, si la expresión de la consulta es la misma que la expresión que se utiliza para enmascarar el valor de la columna en la definición de la máscara de columna, el resultado de la expresión podría permanecer sin cambios. Por ejemplo, la expresión en la consulta es
'XXX-XX-' || SUBSTR(SSN, 8, 4)y la misma expresión se utiliza en la definición de la máscara de columna. En este ejemplo concreto, la expresión de la consulta puede sustituirse por la columna SSN para evitar que la misma expresión se evalúe dos veces.Si aparece una expresión " CASE " en la lista de selección más externa, las máscaras de columna no se aplican a la condición de búsqueda de la cláusula WHEN.
Cuando la definición de una máscara de columna se aplica a una instrucción SQL para enmascarar valores de columna en la tabla de resultados finales, la semántica de la máscara de columna podría entrar en conflicto con cierta semántica SQL en la instrucción. En estas situaciones, la combinación del enunciado y la máscara de columna podría devolver un error.
Consulte la instrucción ALTER TABLE para obtener más información sobre la aplicación de máscaras de columna habilitadas.
- Atributos nulos de las columnas de resultados:
- Las columnas de resultados permiten valores nulos si se derivan de uno de los siguientes:
- Cualquier función agregada excepto COUNT o COUNT_BIG
- Una columna que permite valores nulos
- Una columna de vista en una lista de selección externa que se deriva de una expresión aritmética
- Una expresión aritmética en una lista de selección externa
- Una expresión aritmética que permite valores nulos
- Una función escalar o expresión de cadena que permite valores nulos
- Una variable host que tiene una variable indicadora, un parámetro o variable SQL, una variable global o, en el caso de Java™, una variable host o expresión cuyo tipo puede representar un valor nulo de Java
- Resultado de un operador de conjuntos si al menos uno de los elementos correspondientes de la lista de selección es anulable
- Nombres de las columnas de resultados:
- En los siguientes casos, una columna de resultados se considera una columna con nombre:
- Si se especifica la cláusula AS, el nombre de la columna del resultado es el nombre especificado en esta cláusula.
- Si no se especifica la cláusula AS y se especifica una lista de columnas en la cláusula de correlaciones, el nombre de la columna de resultados es el nombre correspondiente en la lista de columnas de correlación.
- Si no se especifica ni una cláusula AS ni una lista de columnas en la cláusula de correlación y la columna de resultados se deriva únicamente de una sola columna (sin funciones ni operadores), el nombre de la columna de resultados es el nombre sin calificador de esa columna.
- Si no se especifica ni una cláusula AS ni una lista de columnas en la cláusula de correlación y la columna de resultados se deriva únicamente de una única variable SQL, variable global o parámetro SQL (sin funciones ni operadores), el nombre de la columna de resultados es el nombre sin calificador de esa variable SQL, variable global o parámetro SQL.
En todos los demás casos, una columna de resultados es una columna sin nombre.
Los nombres de las columnas de resultados, las variables SQL y las variables globales se colocan en el área del descriptor SQL (SQLDA) cuando se ejecuta la instrucción DESCRIBE. Esto permite que un procesador SQL interactivo como SPUFI, el " Db2 command line processor" o el " QMF " utilice los nombres de las columnas al mostrar los resultados. Los nombres en el SQLDA incluyen aquellos especificados por la cláusula AS.
- Tipos de datos de las columnas de resultados:
- Cada columna del resultado de SELECT adquiere un tipo de datos de la expresión de la que se deriva. La siguiente tabla muestra los tipos de datos de las columnas de resultados.
Tabla 1. Tipos de datos de las columnas del resultado Cuando la expresión es... El tipo de datos de la columna de resultados es... el nombre de cualquier columna numérica Igual que el tipo de datos de la columna, con la misma precisión y escala para las columnas decimales. Una constante entera Entero Una constante decimal o de punto flotante Igual que el tipo de datos de la constante, con la misma precisión y escala para las constantes decimales. Para las constantes de punto flotante, el tipo de datos es DOBLE PRECISIÓN. Una constante decimal de punto flotante DECFLOAT(34) El nombre de cualquier variable de host numérica Igual que el tipo de datos de la variable, con la misma precisión y escala para variables decimales. El resultado es decimal si el tipo de datos de la variable host no es un tipo de datos SQL; por ejemplo, DISPLAY SIGN LEADING SEPARATE en COBOL. Una expresión aritmética o de cadena Igual que el tipo de datos del resultado, con la misma precisión y escala para resultados decimales como se describe en Expresiones. Cualquier función El tipo de datos del resultado de la función. Para una función incorporada, consulte Funciones incorporadas y funciones que se suministran con Db2 para determinar el tipo de datos del resultado. Para una función definida por el usuario, el tipo de datos del resultado es el que se definió en la instrucción CREATE FUNCTION para la función. el nombre de cualquier columna de serie el mismo que el tipo de datos de la columna, con el mismo atributo de longitud. El nombre de cualquier variable de cadena de host Igual que el tipo de datos de la variable, con un atributo de longitud igual a la longitud de la variable. El resultado es una cadena de caracteres de longitud variable si el tipo de datos de la variable host no es un tipo de datos SQL; por ejemplo, una cadena terminada en NUL en C. Una cadena de caracteres constante de longitud n VARCHAR (n ). Una constante de cadena binaria de longitud n VARBINARIO(n ) Una constante de cadena gráfica de longitud n VARGRÁFICO(n ). el nombre de una columna de indicación de fecha y hora el mismo tipo de datos de la columna. El nombre de una columna ROWID ID de fila. El nombre de una columna de tipo distinto Igual que el tipo distinto de la columna, con los mismos atributos de longitud, precisión y escala, si los hubiera. Para obtener información sobre el CCSID de la columna de resultados, consulte Reglas para tipos de datos de resultados.
