SELECT (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric

Recupera righe dal database e consente la selezione di una o più righe o colonne da una o più tabelle in SQL Server. La sintassi completa dell'istruzione SELECT è complessa, ma le clausole principali sono le seguenti:

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

[ WINDOW window expression]

[ ORDER BY order_expression [ ASC | DESC ]]

È possibile usare gli operatori UNION, EXCEPT e INTERSECT tra le query per combinare o confrontare i risultati di più query in un unico set di risultati.

Convenzioni di sintassi Transact-SQL

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Osservazioni:

A causa della complessità dell'istruzione SELECT, gli elementi della sintassi e gli argomenti dettagliati sono stati raggruppati e descritti in base alla clausola:

L'ordine delle clausole nell'istruzione SELECT è significativo. È possibile omettere qualsiasi clausola facoltativa, ma se tali clausole vengono utilizzate, è necessario specificarle nell'ordine corretto.

Le istruzioni SELECT sono consentite in funzioni definite dall'utente solo se gli elenchi di selezione di tali istruzioni includono espressioni per l'assegnazione di valori a variabili che sono locali rispetto alle funzioni.

Un nome composto da quattro parti costruito con la funzione OPENDATASOURCE come parte del nome di server può essere utilizzato come origine di tabella in qualsiasi punto di istruzioni SELECT in cui sono consentiti i nomi di tabella. Non è possibile specificare un nome in quattro parti per il database SQL di Azure.

Per le istruzioni SELECT in cui sono coinvolte tabelle remote sono previste alcune limitazioni della sintassi.

Ordine di elaborazione logico dell'istruzione SELECT

Nei passaggi seguenti viene mostrato l'ordine di elaborazione logica, o ordine di associazione, per un'istruzione SELECT. Questo ordine consente di determinare il momento in cui gli oggetti definiti in un passaggio vengono resi disponibili per le clausole nei passaggi successivi. Ad esempio, se Query Processor può essere associato alle tabelle o alle viste definite nella clausola FROM, ovvero gli viene consentito l'accesso, questi oggetti e le relative colonne vengono resi disponibili in tutti i passaggi successivi. Invece, poiché la clausola SELECT si trova al passaggio 8, tramite le clausole precedenti non è possibile fare riferimento a qualsiasi alias di colonna o colonna derivata definito in tale clausola. Tuttavia, è possibile farvi riferimento tramite clausole successive, ad esempio ORDER BY. L'esecuzione fisica effettiva dell'istruzione viene determinata da Query Processor e l'ordine potrebbe essere diverso rispetto a questo elenco.

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

Avviso

La sequenza precedente si rivela in genere esatta. Tuttavia, esistono casi non comuni in cui la sequenza può variare.

Si supponga, ad esempio, di avere un indice cluster in una vista, che la vista escluda alcune righe di tabella e che l'elenco della colonna SELECT della vista usi una funzione CONVERT che modifica un tipo di dati da varchar a integer. In questo caso la funzione CONVERT può essere eseguita prima della clausola WHERE. Si tratta di una situazione molto insolita. Spesso è possibile modificare la vista per evitare una sequenza diversa, se è importante nel caso specifico.

Autorizzazioni

La selezione di dati richiede l'autorizzazione SELECT per la tabella o la vista che potrebbe essere ereditata da un ambito più elevato, ad esempio l'autorizzazione SELECT per lo schema o l'autorizzazione CONTROL per la tabella. Oppure richiede l'appartenenza al ruolo predefinito del database db_datareader o db_owner o il ruolo predefinito del server sysadmin. La creazione di una nuova tabella tramite SELECTINTO richiede anche le autorizzazioni CREATE TABLE e ALTER SCHEMA per lo schema proprietario della nuova tabella.

Esempi:

Negli esempi seguenti viene usato il database AdventureWorksPDW2022 .

R. Utilizzo dell'istruzione SELECT per il recupero di righe e colonne

Questa sezione illustra i tre esempi di codice. Nel primo esempio di codice vengono restituite tutte le righe (clausola WHERE omessa) e tutte le colonne, usando *, della tabella DimEmployee.

SELECT *  
FROM DimEmployee  
ORDER BY LastName;  

Nell'esempio successivo vengono usati gli alias di tabella per ottenere lo stesso risultato.

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

Nell'esempio vengono restituite tutte le righe (clausola WHERE omessa) e un subset delle colonne (FirstName, LastName, StartDate) della tabella DimEmployee del database AdventureWorksPDW2012. L'intestazione della terza colonna è stata rinominata FirstDay.

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

In questo esempio vengono restituite solo le righe per DimEmployee che hanno un valore di EndDate che non è NULL e un valore di MaritalStatus pari a "M" (sposato).

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

B. Utilizzo dell'istruzione SELECT con intestazioni e calcoli di colonna

Nell'esempio seguente vengono restituite tutte le righe della tabella DimEmployee e viene calcolata la retribuzione lorda per ogni dipendente in base al valore di BaseRate e considerando 40 ore di lavoro alla settimana.

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

C. Utilizzo della clausola DISTINCT con l'istruzione SELECT

L'esempio seguente usa DISTINCT per generare un elenco di tutti i titoli univoci nella tabella DimEmployee.

SELECT DISTINCT Title  
FROM DimEmployee  
ORDER BY Title;  

D. Utilizzo della clausola GROUP BY

L'esempio seguente trova l'importo totale di tutte le vendite in ogni giornata.

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

La presenza della clausola GROUP BY comporta la restituzione di una sola riga contenente il totale di tutte le vendite per ogni giornata.

E. Utilizzo della clausola GROUP BY con più gruppi

Nell'esempio seguente viene individuato il prezzo medio e la somma delle vendite su Internet per ogni giorno, raggruppati per data dell'ordine e per chiave di innalzamento di livello.


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

F. Utilizzo delle clausole GROUP BY e WHERE

Nell'esempio seguente i risultati vengono suddivisi in gruppi dopo che sono state recuperate solo le righe con date successive al 1 agosto 2002.

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

G. Utilizzo della clausola GROUP BY con un'espressione

Nell'esempio seguente vengono creati gruppi in base a un'espressione. È possibile creare gruppi in base a un'espressione se tale espressione non include funzioni di aggregazione.

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

H. Utilizzo della clausola GROUP BY con la clausola ORDER BY

Nell'esempio seguente le vendite vengono sommate e ordinate per giorno.

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

I. Utilizzo della clausola HAVING

Questa query usa la clausola HAVING per limitare i risultati.

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

Vedi anche

Esempi di istruzioni SELECT (Transact-SQL)
Hint (Transact-SQL)