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

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Recupera linhas do banco de dados e permite a seleção de uma ou várias linhas ou colunas de uma ou várias tabelas no 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. A sintaxe completa da instrução SELECT é complexa, mas as cláusulas principais podem ser assim resumidas: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 ] ]

Os operadores UNION, EXCEPT e INTERSECT podem ser usados entre consultas para combinar ou comparar os resultados em um único conjunto de resultados.The UNION, EXCEPT, and INTERSECT operators can be used between queries to combine or compare their results into one result set.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- 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 ] ) ]  
  

RemarksRemarks

Devido à complexidade da instrução SELECT, os elementos e argumentos de sintaxe detalhados são mostrados por 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

A ordem das cláusulas na instrução SELECT é significativa.The order of the clauses in the SELECT statement is significant. Qualquer uma das cláusulas opcionais pode ser omitida, mas quando elas são usadas devem aparecer na ordem apropriada.Any one of the optional clauses can be omitted, but when the optional clauses are used, they must appear in the appropriate order.

As instruções SELECT serão permitidas em funções definidas pelo usuário apenas se as listas de seleção dessas instruções contiverem expressões que atribuam valores a variáveis que são locais a essas funções.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.

Um nome de quatro partes construído com a função OPENDATASOURCE como a parte do nome do servidor pode ser usado como uma origem de tabela sempre que um nome de tabela puder aparecer em uma instrução 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. Um nome de quatro partes não pode ser especificado para Banco de dados SQL do AzureAzure SQL Database.A four-part name cannot be specified for Banco de dados SQL do AzureAzure SQL Database.

Algumas restrições de sintaxe se aplicam a instruções SELECT que envolvem tabelas remotas.Some syntax restrictions apply to SELECT statements that involve remote tables.

Ordem de processamento lógico da instrução SELECTLogical Processing Order of the SELECT statement

As etapas a seguir mostram a ordem de processamento lógico ou a ordem de associação de uma instrução SELECT.The following steps show the logical processing order, or binding order, for a SELECT statement. Essa ordem determina quando os objetos definidos em uma etapa são disponibilizados para as cláusulas em etapas subsequentes.This order determines when the objects defined in one step are made available to the clauses in subsequent steps. Por exemplo, se o processador de consulta puder ser associado (acessar) a tabelas ou exibições definidas na cláusula FROM, esses objetos e suas colunas serão disponibilizados para todas as etapas subsequentes.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. De modo oposto, como a cláusula SELECT é a etapa 8, qualquer alias de coluna ou coluna derivada definida naquela cláusula não poderá ser referenciada por cláusulas precedentes.Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. Porém, poderão ser referenciadas por cláusulas subsequentes, como a cláusula ORDER BY.However, they can be referenced by subsequent clauses such as the ORDER BY clause. A execução física real da instrução é determinada pelo processador de consulta e a ordem pode variar com base nesta 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 ou WITH ROLLUPWITH CUBE or WITH ROLLUP
  7. HAVINGHAVING
  8. SELECTSELECT
  9. DISTINCTDISTINCT
  10. ORDER BYORDER BY
  11. INÍCIOTOP

Aviso

A sequência anterior geralmente é verdadeira.The preceding sequence is usually true. No entanto, há casos incomuns em que a sequência pode ser diferente.However, there are uncommon cases where the sequence may differ.

Por exemplo, suponha que você tenha um índice clusterizado em uma exibição e a exibição exclui algumas linhas de tabela e lista de colunas SELECT da exibição usa um CONVERT que altera um tipo de dados de varchar para 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. Nessa situação, CONVERT pode ser executado antes da execução da cláusula WHERE.In this situation, the CONVERT may execute before the WHERE clause executes. Isso é um tanto incomum.Uncommon indeed. Geralmente, há uma maneira de modificar a exibição para evitar a sequência diferente, se isso é importante em seu caso.Often there is a way to modify your view to avoid the different sequence, if it matters in your case.

PermissõesPermissions

A seleção de dados exige a permissão SELECT na tabela ou exibição, que pode ser herdada de um escopo superior, como a permissão SELECT no esquema ou a permissão CONTROL na tabela.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. Ou exige a associação à função de banco de dados fixa db_datareader ou db_owner ou à função de servidor fixa sysadmin.Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. A criação de uma nova tabela com SELECTINTO também exige a permissão CREATETABLE e a permissão ALTERSCHEMA no esquema que possui a nova tabela.Creating a new table using SELECTINTO also requires both the CREATETABLE permission, and the ALTERSCHEMA permission on the schema that owns the new table.

Exemplos:Examples:

O exemplo a seguir usa o banco de dados AdventureWorksPDW2012AdventureWorksPDW2012.The following examples use the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Usando SELECT para recuperar linhas e colunasUsing SELECT to retrieve rows and columns

Esta seção mostra três exemplos de código.This section shows three code examples. Este primeiro exemplo de código retorna todas as linhas (nenhuma cláusula WHERE foi especificada) e todas as colunas (usando o *) da tabela 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;  

Este próximo exemplo usa a definição de alias da tabela para obter o mesmo resultado.This next example using table aliasing to achieve the same result.

SELECT e.*  
FROM DimEmployee AS e  
ORDER BY LastName;  

Este exemplo retorna todas as linhas (nenhuma cláusula WHERE foi especificada) e um subconjunto das colunas (FirstName, LastName, StartDate) da tabela DimEmployee no banco de dados 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. O terceiro título de coluna é renomeado como FirstDay.The third column heading is renamed to FirstDay.

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

Este exemplo retorna somente as linhas de DimEmployee que têm uma EndDate que não é NULL e um MaritalStatus igual a 'M' (married, 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. Usando SELECT com títulos de coluna e cálculosUsing SELECT with column headings and calculations

O exemplo a seguir retorna todas as linhas da tabela DimEmployee e calcula o pagamento bruto de cada funcionário com base em sua BaseRate e em uma semana de trabalho 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. Usando DISTINCT com SELECTUsing DISTINCT with SELECT

O exemplo a seguir usa DISTINCT para gerar uma lista de todos os títulos exclusivos na tabela 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. Usando GROUP BYUsing GROUP BY

O exemplo a seguir localiza a quantidade total de todas as vendas em cada dia.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;  

Devido à cláusula GROUP BY, somente uma linha que contém a soma de todas as vendas é retornada para cada dia.Because of the GROUP BY clause, only one row containing the sum of all sales is returned for each day.

E.E. Usando GROUP BY com vários gruposUsing GROUP BY with multiple groups

O exemplo a seguir localiza o preço médio e a soma de vendas pela Internet de cada dia, agrupados por data do pedido e código promocional.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. Usando GROUP BY e WHEREUsing GROUP BY and WHERE

O exemplo a seguir põe os resultados em grupos depois de recuperar apenas as linhas com datas de pedido posteriores a 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. Usando GROUP BY com uma expressãoUsing GROUP BY with an expression

O exemplo a seguir agrupa por uma expressão.The following example groups by an expression. É possível agrupar por uma expressão se a mesma não contiver funções de agregação.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. Usando GROUP BY com ORDER BYUsing GROUP BY with ORDER BY

O exemplo a seguir localiza a soma de vendas por dia e os pedidos por dia.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. Usando a cláusula HAVINGUsing the HAVING clause

Essa consulta usa a cláusula HAVING para restringir os 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 TambémSee Also

Exemplos de SELECT (Transact-SQL)SELECT Examples (Transact-SQL)
Hints (Transact-SQL)Hints (Transact-SQL)