SELECT (Transact-SQL)SELECT (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

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 ServerSQL Server.Retrieves rows from the database and enables the selection of one or many rows or columns from one or many tables in SQL ServerSQL Server. La sintaxis completa de la instrucción SELECT es compleja, aunque las cláusulas principales se pueden resumir del modo siguiente:The full syntax of the SELECT statement is complex, but the main clauses can be summarized as:

[ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> ] } ][ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> ] } ]

SELECT select_list [ INTO new_table ]SELECT select_list [ INTO new_table ]

[ FROM table_source ] [ WHERE search_condition ][ FROM table_source ] [ WHERE search_condition ]

[ GROUP BY group_by_expression ][ GROUP BY group_by_expression ]

[ HAVING search_condition ][ HAVING search_condition ]

[ ORDER BY order_expression [ ASC | DESC ] ][ 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.The UNION, EXCEPT, and INTERSECT operators can be used between queries to combine or compare their results into one result set.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
<SELECT statement> ::=    
    [ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]  
    <query_expression>   
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }   
  [ ,...n ] ]   
    [ <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 SQL Data Warehouse 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 ] ) ]  
  

NotasRemarks

Debido a la complejidad de la instrucción SELECT, se muestran elementos y argumentos detallados de la sintaxis de cada cláusula:Because of the complexity of the SELECT statement, detailed syntax elements and arguments are shown by clause:

WITH XMLNAMESPACESWITH XMLNAMESPACES

WITH common_table_expressionWITH common_table_expression
HAVINGHAVING
Cláusula SELECTSELECT Clause UNIONUNION
Cláusula INTOINTO Clause EXCEPT e INTERSECTEXCEPT and INTERSECT
FROMFROM ORDER BYORDER BY
WHEREWHERE Cláusula FORFOR Clause
GROUP BYGROUP BY Cláusula OPTIONOPTION Clause

El orden de las cláusulas en la instrucción SELECT es importante.The order of the clauses in the SELECT statement is significant. Se puede omitir cualquiera de las cláusulas opcionales pero, cuando se utilizan, deben aparecer en el orden apropiado.Any one of the optional clauses can be omitted, but when the optional clauses are used, they must appear in the appropriate order.

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.SELECT statements are permitted in user-defined functions only if the select lists of these statements contain expressions that assign values to variables that are local to the functions.

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.A four-part name constructed with the OPENDATASOURCE function as the server-name part can be used as a table source wherever a table name can appear in a SELECT statement. No se puede especificar un nombre de cuatro partes para Base de datos SQL de AzureAzure SQL Database.A four-part name cannot be specified for Base de datos SQL de AzureAzure SQL Database.

Existen algunas restricciones sintácticas en las instrucciones SELECT relacionadas con las tablas remotas.Some syntax restrictions apply to SELECT statements that involve remote tables.

Orden de procesamiento lógico de la instrucción SELECTLogical Processing Order of the SELECT statement

Los pasos siguientes muestran el orden de procesamiento lógico, u orden de enlaces, de una instrucción SELECT.The following steps show the logical processing order, or binding order, for a SELECT statement. Este orden determina cuándo los objetos definidos en un paso están disponibles para las cláusulas en pasos posteriores.This order determines when the objects defined in one step are made available to the clauses in subsequent steps. 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.For example, if the query processor can bind to (access) the tables or views defined in the FROM clause, these objects and their columns are made available to all subsequent steps. 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.Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. Sin embargo, las cláusulas siguientes, tales como la cláusula ORDER BY, sí pueden hacer referencia.However, they can be referenced by subsequent clauses such as the ORDER BY clause. 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.The actual physical execution of the statement is determined by the query processor and the order may vary from this list.

  1. FROMFROM
  2. ONON
  3. JOINJOIN
  4. WHEREWHERE
  5. GROUP BYGROUP BY
  6. WITH CUBE o WITH ROLLUPWITH CUBE or WITH ROLLUP
  7. HAVINGHAVING
  8. SELECTSELECT
  9. DISTINCTDISTINCT
  10. ORDER BYORDER BY
  11. ARRIBATOP

Advertencia

La secuencia anterior suele ser la habitual,The preceding sequence is usually true. pero hay casos poco comunes en los que puede ser distinta.However, there are uncommon cases where the sequence may differ.

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.For example, suppose you have a clustered index on a view, and the view excludes some table rows, and the view's SELECT column list uses a CONVERT that changes a data type from varchar to integer. En esta situación, la función CONVERT se puede ejecutar antes de la cláusula WHERE,In this situation, the CONVERT may execute before the WHERE clause executes. lo cual es verdaderamente poco habitual.Uncommon indeed. A menudo, suele haber una manera de modificar la vista que evita que la secuencia sea diferente, si esto es importante en su caso.Often there is a way to modify your view to avoid the different sequence, if it matters in your case.

PermisosPermissions

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.Selecting data requires SELECT permission on the table or view, which could be inherited from a higher scope such as SELECT permission on the schema or CONTROL permission on the table. Debe pertenecer a los roles fijos de base de datos db_datareader o db_owner o al rol fijo de servidor sysadmin.Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. Si quiere crear una tabla con SELECTINTO, necesitará tener también tanto el permiso CREATETABLE como el permiso ALTERSCHEMA en el esquema al que pertenece la nueva tabla.Creating a new table using SELECTINTO also requires both the CREATETABLE permission, and the ALTERSCHEMA permission on the schema that owns the new table.

Ejemplos:Examples:

Los ejemplos siguientes usan la base de datos AdventureWorksPDW2012AdventureWorksPDW2012.The following examples use the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Usar SELECT para recuperar filas y columnasUsing SELECT to retrieve rows and columns

En esta sección se muestran tres códigos de ejemplo.This section shows three code examples. En el primero, se devuelven todas las filas (no se especifica la cláusula WHERE) y todas las columnas (con *) de la tabla DimEmployee.This first code example returns all rows (no WHERE clause is specified) and all columns (using the *) from the DimEmployee table.

SELECT *  
FROM DimEmployee  
ORDER BY LastName;  

El siguiente ejemplo usa alias de tabla para lograr el mismo resultado.This next example using table aliasing to achieve the same result.

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.This example returns all rows (no WHERE clause is specified) and a subset of the columns (FirstName, LastName, StartDate) from the DimEmployee table in the AdventureWorksPDW2012 database. El nombre del tercer encabezado de columna cambia a FirstDay.The third column heading is renamed to 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”).This example returns only the rows for DimEmployee that have an EndDate that is not NULL and a MaritalStatus of 'M' (married).

SELECT FirstName, LastName, StartDate AS FirstDay  
FROM DimEmployee   
WHERE EndDate IS NOT NULL   
AND MaritalStatus = 'M'  
ORDER BY LastName;  

b.B. Usar SELECT con encabezados de columna y cálculosUsing SELECT with column headings and calculations

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.The following example returns all rows from the DimEmployee table, and calculates the gross pay for each employee based on their BaseRate and a 40-hour work week.

SELECT FirstName, LastName, BaseRate, BaseRate * 40 AS GrossPay  
FROM DimEmployee  
ORDER BY LastName;  

C.C. Usar DISTINCT con SELECTUsing DISTINCT with SELECT

En el siguiente ejemplo se usa DISTINCT para generar una lista de todos los puestos únicos de la tabla DimEmployee.The following example uses DISTINCT to generate a list of all unique titles in the DimEmployee table.

SELECT DISTINCT Title  
FROM DimEmployee  
ORDER BY Title;  

D.D. Usar GROUP BYUsing GROUP BY

En el ejemplo siguiente se busca la cantidad total de todas las ventas de cada día.The following example finds the total amount for all sales on each day.

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.Because of the GROUP BY clause, only one row containing the sum of all sales is returned for each day.

E.E. Usar GROUP BY con varios gruposUsing GROUP BY with multiple groups

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.The following example finds the average price and the sum of Internet sales for each day, grouped by order date and the promotion key.


SELECT OrderDateKey, PromotionKey, AVG(SalesAmount) AS AvgSales, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey, PromotionKey  
ORDER BY OrderDateKey;   

F.F. Usar GROUP BY y WHEREUsing GROUP BY and 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.The following example puts the results into groups after retrieving only the rows with order dates later than August 1, 2002.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
WHERE OrderDateKey > '20020801'  
GROUP BY OrderDateKey  
ORDER BY OrderDateKey;  

G.G. Usar GROUP BY con una expresiónUsing GROUP BY with an expression

En este ejemplo se agrupa por una expresión.The following example groups by an expression. Puede agrupar por una expresión si ésta no incluye funciones de agregado.You can group by an expression if the expression does not include aggregate functions.

SELECT SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY (OrderDateKey * 10);  

H.H. Usar GROUP BY con ORDER BYUsing GROUP BY with ORDER BY

En el siguiente ejemplo se busca la suma de las ventas por día y los pedidos por día.The following example finds the sum of sales per day, and orders by the day.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey  
ORDER BY OrderDateKey;  

I.I. Usar la cláusula HAVINGUsing the HAVING clause

En esta consulta se usa la cláusula HAVING para acotar los resultados.This query uses the HAVING clause to restrict results.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey  
HAVING OrderDateKey > 20010000  
ORDER BY OrderDateKey;  

Consulte tambiénSee Also

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