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 la Motor de base de datos de SQL Server. La sintaxis completa de la instrucción es compleja, pero las cláusulas principales se pueden resumir de la SELECT
siguiente manera:
[ 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 sus resultados en un conjunto de resultados.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis de SQL Server y 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:
[ 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 SELECT
instrucción , se muestran los elementos de sintaxis detallados y los argumentos por cláusula:
- WITH XMLNAMESPACES
- HAVING
- WITH common_table_expression
- UNION
- Cláusula SELECT
- EXCEPT e INTERSECT
- Cláusula INTO
- ORDER BY
- FROM
- Cláusula FOR
- WHERE
- Cláusula OPTION
- GROUP BY
El orden de las cláusulas de la SELECT
instrucción es significativo. Se puede omitir cualquiera de las cláusulas opcionales pero, cuando se utilizan, deben aparecer en el orden apropiado.
SELECT
Las instrucciones se permiten en funciones definidas por el usuario solo si las listas de selección de estas instrucciones contienen expresiones que asignan valores a variables locales a las funciones.
Un nombre de cuatro partes construido con la OPENDATASOURCE
función como elemento de nombre de servidor se puede usar como origen de tabla siempre que un nombre de tabla pueda aparecer en una SELECT
instrucción . No se puede especificar un nombre de cuatro partes para Azure SQL Database.
Algunas restricciones de sintaxis se aplican a SELECT
las instrucciones que implican tablas remotas.
Orden de procesamiento lógico de la instrucción SELECT
Los pasos siguientes muestran el orden de procesamiento lógico o el orden de enlace para una SELECT
instrucción . 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 (acceso) a las tablas o vistas definidas en la FROM
cláusula , estos objetos y sus columnas están disponibles para todos los pasos posteriores. Por el contrario, dado que la cláusula es el SELECT
paso 8, no se puede hacer referencia a ningún alias de columna o columnas derivadas definidas en esa cláusula mediante cláusulas anteriores. Sin embargo, las cláusulas posteriores pueden hacer referencia a ellas, como la ORDER BY
cláusula . El procesador de consultas determina la ejecución física real de la instrucción y el orden puede variar de esta lista.
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE
oWITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Advertencia
Hay casos poco comunes en los que la secuencia anterior podría diferir. Supongamos que tiene un índice agrupado en una vista y la vista excluye algunas filas de tabla y la lista de columnas de SELECT
la vista usa un CONVERT
que cambia un tipo de datos de varchar a int. En esta situación, CONVERT
puede ejecutarse antes de que se ejecute la WHERE
cláusula . A menudo hay una manera de modificar la vista para evitar la secuencia diferente, si es importante en su caso.
Permisos
La selección de datos requiere SELECT
permiso en la tabla o vista, que se podría heredar de un ámbito superior, como SELECT
el permiso en el esquema o CONTROL
el permiso de 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 tabla con SELECT INTO
también requiere el CREATE TABLE
permiso y el ALTER SCHEMA
permiso en el esquema que posee 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 este primer ejemplo de código se devuelven todas las filas (no se especifica ninguna WHERE
cláusula) y todas las columnas (mediante ) *
de la DimEmployee
tabla.
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 especifica ninguna WHERE
cláusula) y un subconjunto de las columnas (FirstName
, LastName
, StartDate
) de la DimEmployee
tabla de la base de datos AdventureWorksPDW2022 . 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 tienen un EndDate
valor que no NULL
es y de MaritalStatus
M
(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;