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

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure 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:

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

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

[Desde table_source ] [donde search_condition ][ FROM table_source ] [ WHERE search_condition ]

[GROUP BY group_by_expression ][ GROUP BY group_by_expression ]

[Tener search_condition ][ HAVING search_condition ]

[ORDER BY expresiónOrden [ASC | DESC]][ ORDER BY order_expression [ ASC | DESC ] ]

La UNION, EXCEPT y operadores INTERSECT se pueden utilizar entre consultas para combinar o comparar sus 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 ] ) ]  

ComentariosRemarks

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
TENERHAVING
Cláusula SELECTSELECT Clause UNIÓNUNION
Cláusula INTOINTO Clause EXCEPT e INTERSECTEXCEPT and INTERSECT
FROMFROM ORDENAR PORORDER BY
WHEREWHERE Cláusula FORFOR Clause
AGRUPAR PORGROUP 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 generado con la función OPENDATASOURCE como la parte del nombre de servidor se puede usar como origen de tabla siempre que sea un nombre de tabla puede aparecer en una instrucción SELECT.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 viene 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

PermissionsPermissions

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. O debe pertenecer a la db_datareader o db_owner funciones fijas de base de datos, o la sysadmin rol fijo de servidor.Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. Crear una nueva tabla mediante SELECTINTO también necesita tanto el CREATETABLE permiso y el ALTERSCHEMA permiso 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 muestra tres ejemplos de código.This section shows three code examples. Este primer ejemplo de código devuelve todas las filas (no se especifica ninguna cláusula WHERE) y todas las columnas (mediante el *) desde el DimEmployee tabla.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 utilizando el 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;  

Este ejemplo devuelve todas las filas (no se especifica ninguna cláusula WHERE) y un subconjunto de las columnas (FirstName, LastName, StartDate) desde el DimEmployee tabla el AdventureWorksPDW2012 base de datos.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 tercer encabezado de columna ha cambiado a FirstDay.The third column heading is renamed to FirstDay.

SELECT FirstName, LastName, StartDate AS FirstDay  
FROM DimEmployee   
ORDER BY LastName;  

Este ejemplo devuelve solo las filas de DimEmployee que tienen un EndDate que no sea NULL y un MaritalStatus de ' m ' (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 ejemplo siguiente devuelve todas las filas de la DimEmployee de tabla y calcula el sueldo bruto de cada empleado en función de sus BaseRate y 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 ejemplo siguiente se utiliza DISTINCT para generar una lista de todos los títulos únicos en el DimEmployee tabla.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;  

Causa de la GROUP BY cláusula, se devuelve una única fila que contiene la suma de todas las ventas para 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 ejemplo siguiente se busca el precio medio y la suma de ventas por Internet para cada día, agrupadas por fecha de pedido y la 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 ejemplo siguiente se coloca los resultados en grupos después de recuperar únicamente las filas con las fechas de pedidos a más tardar el 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 ejemplo siguiente 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

Esta consulta utiliza la HAVING cláusula para restringir 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;  

Vea tambiénSee Also

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