SELECT (Transact-SQL)

Aplica-se a: simSQL Server (todas as versões compatíveis) SimBanco de Dados SQL do Azure SimInstância Gerenciada do Azure SQL simAzure Synapse Analytics simParallel 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 Server. A sintaxe completa da instrução SELECT é complexa, mas as cláusulas principais podem ser assim resumidas:

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

Os operadores UNION, EXCEPT e INTERSECT podem ser usados entre consultas para combinar ou comparar os resultados em um só conjunto de resultados.

Ícone de link do tópico Convenções da sintaxe Transact-SQL

Sintaxe

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

Observação

Para ver a sintaxe do Transact-SQL para o SQL Server 2014 e versões anteriores, confira a Documentação das versões anteriores.

Comentários

Devido à complexidade da instrução SELECT, os elementos e argumentos de sintaxe detalhados são mostrados por cláusula:

A ordem das cláusulas na instrução SELECT é significativa. Qualquer uma das cláusulas opcionais pode ser omitida, mas quando elas são usadas devem aparecer na ordem apropriada.

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.

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. Um nome de quatro partes não pode ser especificado para Banco de Dados SQL do Azure.

Algumas restrições de sintaxe se aplicam a instruções SELECT que envolvem tabelas remotas.

Ordem de processamento lógico da instrução SELECT

As etapas a seguir mostram a ordem de processamento lógico ou a ordem de associação de uma instrução SELECT. Essa ordem determina quando os objetos definidos em uma etapa são disponibilizados para as cláusulas em etapas subsequentes. 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. 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. Porém, poderão ser referenciadas por cláusulas subsequentes, como a cláusula ORDER BY. A execução física real da instrução é determinada pelo processador de consulta e a ordem pode variar com base nesta lista.

  1. FROM
  2. ATIVADO
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE ou WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINTO
  10. ORDER BY
  11. INÍCIO

Aviso

A sequência anterior geralmente é verdadeira. No entanto, há casos incomuns em que a sequência pode ser diferente.

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. Nessa situação, CONVERT pode ser executado antes da execução da cláusula WHERE. Isso é um tanto incomum. Geralmente, há uma maneira de modificar a exibição para evitar a sequência diferente, se isso é importante em seu caso.

Permissões

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. Ou exige a associação à função de banco de dados fixa db_datareader ou db_owner ou à função de servidor fixa sysadmin. A criação de uma nova tabela com SELECT INTO também exige a permissão CREATE TABLE e a permissão ALTER SCHEMA no esquema que tem a nova tabela.

Exemplos:

O exemplo a seguir usa o banco de dados AdventureWorksPDW2012.

a. Usando SELECT para recuperar linhas e colunas

Esta seção mostra três exemplos de código. 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.

SELECT *  
FROM DimEmployee  
ORDER BY LastName;  

Este próximo exemplo usa a definição de alias da tabela para obter o mesmo resultado.

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. O terceiro título de coluna é renomeado como 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).

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

B. Usando SELECT com títulos de coluna e cálculos

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.

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

C. Usando DISTINCT com SELECT

O exemplo a seguir usa DISTINCT para gerar uma lista de todos os títulos exclusivos na tabela DimEmployee.

SELECT DISTINCT Title  
FROM DimEmployee  
ORDER BY Title;  

D. Usando GROUP BY

O exemplo a seguir localiza a quantidade total de todas as vendas em cada dia.

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.

E. Usando GROUP BY com vários grupos

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.


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

F. Usando GROUP BY e 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.

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

G. Usando GROUP BY com uma expressão

O exemplo a seguir agrupa por uma expressão. É possível agrupar por uma expressão se a mesma não contiver funções de agregação.

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

H. Usando GROUP BY com ORDER BY

O exemplo a seguir localiza a soma de vendas por dia e os pedidos por dia.

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

I. Usando a cláusula HAVING

Essa consulta usa a cláusula HAVING para restringir os resultados.

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

Consulte Também

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