SELECT (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento en Microsoft Fabric
Recupera filas de la base de datos y habilita la selección de una o varias filas o columnas de una o varias tablas en SQL Server. La sintaxis completa de la instrucción SELECT es compleja, aunque las cláusulas principales se pueden resumir del modo siguiente:
[ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> ] } ]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ ORDER BY order_expression [ ASC | DESC ]]
Los operadores UNION, EXCEPT e INTERSECT se pueden usar entre consultas para combinar o comparar resultados en un conjunto de resultados.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis de SQL Server y Azure SQL Database
-- Syntax for SQL Server and Azure SQL Database
<SELECT statement> ::=
[ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]
<query_expression>
[ ORDER BY <order_by_expression> ]
[ <FOR Clause>]
[ OPTION ( <query_hint> [ ,...n ] ) ]
<query_expression> ::=
{ <query_specification> | ( <query_expression> ) }
[ { UNION [ ALL ] | EXCEPT | INTERSECT }
<query_specification> | ( <query_expression> ) [...n ] ]
<query_specification> ::=
SELECT [ ALL | DISTINCT ]
[TOP ( expression ) [PERCENT] [ WITH TIES ] ]
< select_list >
[ INTO new_table ]
[ FROM { <table_source> } [ ,...n ] ]
[ WHERE <search_condition> ]
[ <GROUP BY> ]
[ HAVING < search_condition > ]
Sintaxis para Azure Synapse Analytics, Almacenamiento de datos en paralelo y Microsoft Fabric
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric
[ WITH <common_table_expression> [ ,...n ] ]
SELECT <select_criteria>
[;]
<select_criteria> ::=
[ TOP ( top_expression ) ]
[ ALL | DISTINCT ]
{ * | column_name | expression } [ ,...n ]
[ FROM { table_source } [ ,...n ] ]
[ WHERE <search_condition> ]
[ GROUP BY <group_by_clause> ]
[ HAVING <search_condition> ]
[ ORDER BY <order_by_expression> ]
[ OPTION ( <query_option> [ ,...n ] ) ]
Comentarios
Debido a la complejidad de la instrucción SELECT, se muestran elementos y argumentos detallados de la sintaxis de cada cláusula:
El orden de las cláusulas en la instrucción SELECT es importante. Se puede omitir cualquiera de las cláusulas opcionales pero, cuando se utilizan, deben aparecer en el orden apropiado.
Las instrucciones SELECT se permiten en las funciones definidas por el usuario solo si las listas de selección de estas instrucciones contienen expresiones que asignan valores a variables locales de las funciones.
Un nombre de cuatro partes creado con la función OPENDATASOURCE como la parte de nombre de servidor se puede usar como origen de tabla en todos los lugares de una instrucción SELECT donde pueda aparecer un nombre de tabla. No se puede especificar un nombre de cuatro partes para Azure SQL Database.
Existen algunas restricciones sintácticas en las instrucciones SELECT relacionadas con las tablas remotas.
Orden de procesamiento lógico de la instrucción SELECT
Los pasos siguientes muestran el orden de procesamiento lógico, u orden de enlaces, de una instrucción SELECT. Este orden determina cuándo los objetos definidos en un paso están disponibles para las cláusulas en pasos posteriores. Por ejemplo, si el procesador de consultas puede enlazar (obtener acceso) a las tablas o las vistas definidas en la cláusula FROM, estos objetos y sus columnas están disponibles para todos los pasos siguientes. Por el contrario, dado que la cláusula SELECT es el paso 8, las cláusulas anteriores no pueden hacer referencia a los alias de columna o columnas derivadas definidas en esa cláusula. Sin embargo, las cláusulas siguientes, tales como la cláusula ORDER BY, sí pueden hacer referencia. La ejecución física real de la instrucción está determinada por el procesador de consultas y el orden puede variar en esta lista.
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE
oWITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Advertencia
La secuencia anterior suele ser la habitual, pero hay casos poco comunes en los que puede ser distinta.
Por ejemplo, imagine que tiene un índice agrupado en una vista y esa vista excluye algunas filas de la tabla, mientras que la lista de columnas de la vista SELECT
usa una CONVERT
que cambia un tipo de datos de varchar a integer. En esta situación, la función CONVERT
se puede ejecutar antes de la cláusula WHERE
. lo cual es verdaderamente poco habitual. A menudo, suele haber una manera de modificar la vista que evita que la secuencia sea diferente, si esto es importante en su caso.
Permisos
La selección de datos necesita el permiso SELECT en la tabla o en la vista, que se puede heredar de un ámbito superior como el permiso SELECT en el esquema o el permiso CONTROL en la tabla. Debe pertenecer a los roles fijos de base de datos db_datareader o db_owner o al rol fijo de servidor sysadmin. La creación de una nueva tabla con SELECT INTO
también requiere los permisos CREATE TABLE y ALTER SCHEMA en el esquema al que pertenece la nueva tabla.
Ejemplos
En los siguientes ejemplos se usa la base de datos AdventureWorksPDW2022.
A Usar SELECT para recuperar filas y columnas
En esta sección se muestran tres códigos de ejemplo. En el primero, se devuelven todas las filas (no se especifica la cláusula WHERE) y todas las columnas (con *
) de la tabla DimEmployee
.
SELECT *
FROM DimEmployee
ORDER BY LastName;
El siguiente ejemplo usa alias de tabla para lograr el mismo resultado.
SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;
En este ejemplo se devuelven todas las filas (no se ha especificado la cláusula WHERE) y un subconjunto de las columnas (FirstName
, LastName
, StartDate
) de la tabla DimEmployee
de la base de datos AdventureWorksPDW2012
. El nombre del tercer encabezado de columna cambia a FirstDay
.
SELECT FirstName, LastName, StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;
En este ejemplo, solo se devuelven las filas de DimEmployee
que tengan un valor de EndDate
distinto de NULL y un valor de MaritalStatus
de “M” (que se corresponde con “casado”).
SELECT FirstName, LastName, StartDate AS FirstDay
FROM DimEmployee
WHERE EndDate IS NOT NULL
AND MaritalStatus = 'M'
ORDER BY LastName;
B. Usar SELECT con encabezados de columna y cálculos
El siguiente ejemplo devuelve todas las filas de la tabla DimEmployee
y calcula el sueldo bruto de cada empleado partiendo de su BaseRate
y de una semana laboral de 40 horas.
SELECT FirstName, LastName, BaseRate, BaseRate * 40 AS GrossPay
FROM DimEmployee
ORDER BY LastName;
C. Usar DISTINCT con SELECT
En el siguiente ejemplo se usa DISTINCT
para generar una lista de todos los puestos únicos de la tabla DimEmployee
.
SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;
D. Usar GROUP BY
En el ejemplo siguiente se busca la cantidad total de todas las ventas de cada día.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
Debido a la cláusula GROUP BY
, solo se devuelve una fila que contiene la suma de todas las ventas de cada día.
E. Usar GROUP BY con varios grupos
En el siguiente ejemplo se busca el precio medio y la suma de ventas por Internet de cada día, agrupados por fecha de pedido y por clave de promoción.
SELECT OrderDateKey, PromotionKey, AVG(SalesAmount) AS AvgSales, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, PromotionKey
ORDER BY OrderDateKey;
F. Usar GROUP BY y WHERE
En el siguiente ejemplo, los resultados se colocan en grupos después de recuperar únicamente las filas con fechas de pedido posteriores al 1 de agosto de 2002.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
WHERE OrderDateKey > '20020801'
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
G. Usar GROUP BY con una expresión
En este ejemplo se agrupa por una expresión. Puede agrupar por una expresión si ésta no incluye funciones de agregado.
SELECT SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY (OrderDateKey * 10);
H. Usar GROUP BY con ORDER BY
En el siguiente ejemplo se busca la suma de las ventas por día y los pedidos por día.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
I. Usar la cláusula HAVING
En esta consulta se usa la cláusula HAVING
para acotar los resultados.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20010000
ORDER BY OrderDateKey;