SELECT (Transact-SQL)

Se aplica a: síSQL Server (todas las versiones admitidas) SíAzure SQL Database SíInstancia administrada de Azure SQL síAzure Synapse Analytics síAlmacenamiento de datos paralelos

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 ]

[ HAVING search_condition ]

[ 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.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQL

Sintaxis

-- 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 > ]   
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
[ 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 ] ) ]  
  

Nota

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.

Observaciones

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.

  1. FROM
  2. ACTIVAR
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE o WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. 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 SELECT de la vista usa una instrucción 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:

Los ejemplos siguientes usan la base de datos AdventureWorksPDW2012.

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;  

Consulte también

Ejemplos de SELECT (Transact-SQL)
Sugerencias (Transact-SQL)