SELECT (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric

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 Mecanismo de Banco de Dados do SQL Server. A sintaxe completa da instrução é complexa SELECT , mas as orações principais podem ser resumidas da seguinte forma:

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

[ JANELA window_expression ]

[ ORDER BY order_expression [ ASC | DESC ] ]

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

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe do SQL Server e do Banco de Dados SQL do Azure:

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

A sintaxe do Azure Synapse Analytics, do Parallel Data Warehouse e do Microsoft Fabric:

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

Comentários

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

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

SELECT As instruções são permitidas em funções definidas pelo usuário somente se as listas de seleção dessas instruções contiverem expressões que atribuem valores a variáveis locais para as funções.

Um nome de quatro partes construído com a OPENDATASOURCE função como a parte do nome do servidor pode ser usado como uma fonte de tabela sempre que um nome de tabela pode aparecer em uma SELECT instrução. Um nome de quatro partes não pode ser especificado para o Banco de Dados SQL do Azure.

Algumas restrições de sintaxe se aplicam a SELECT instruções 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 ordem de associação, de uma SELECT instrução. 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 consultas puder associar (acessar) as tabelas ou exibições definidas na FROM cláusula, esses objetos e suas colunas serão disponibilizados para todas as etapas subsequentes. Por outro lado, como a cláusula é a SELECT etapa 8, quaisquer aliases de coluna ou colunas derivadas definidas nessa cláusula não podem ser referenciadas por cláusulas anteriores. No entanto, eles podem ser referenciados por cláusulas subsequentes, como a ORDER BY cláusula. O processador de consultas determina a execução física real da instrução e a ordem pode variar dessa lista.

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE ou WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

Aviso

Existem casos incomuns em que a sequência anterior pode ser diferente. Suponha que você tenha um índice clusterizado em uma exibição, e a exibição exclua algumas linhas da tabela, e a lista de colunas da SELECT exibição use um CONVERT que altera um tipo de dados de varchar para int. Nessa situação, o CONVERT pode ser executado antes que a WHERE cláusula seja executada. Muitas vezes, há uma maneira de modificar sua exibição para evitar a sequência diferente, se for importante no seu caso.

Permissões

A seleção de dados requer SELECT permissão na tabela ou exibição, que pode ser herdada de um escopo mais alto, como SELECT permissão no esquema ou CONTROL permissão 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 usando SELECT INTO também requer a CREATE TABLE permissão e a ALTER SCHEMA permissão no esquema que possui a nova tabela.

Exemplos

Os exemplos a seguir usam o banco de dados AdventureWorksPDW2022.

R. Usar 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 WHERE cláusula é especificada) e todas as colunas (usando o *) da DimEmployee tabela.

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 WHERE cláusula é especificada) e um subconjunto das colunas (FirstName, LastName, StartDate) da DimEmployee tabela no banco de dados AdventureWorksPDW2022 . O terceiro título de coluna é renomeado como FirstDay.

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

Este exemplo retorna apenas as linhas para DimEmployee que têm um EndDate que não NULL é e um MaritalStatus de M (casado).

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

B. Usar 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. Usar 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. Usar 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. Usar 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. Usar 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. Usar 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. Usar 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. Usar 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;