SELECT (Transact-SQL)
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse 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 ]
[ 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 relative alla sintassi Transact-SQL
Sintassi
Sintassi per SQL Server e per il database SQL di Azure
-- 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 > ]
Sintassi per Azure Synapse Analytics e Parallel Data Warehouse e Microsoft Fabric
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and 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 ] ) ]
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.
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE
oppureWITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
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 visualizzazione e che la visualizzazione escluda alcune righe di tabella e che l'elenco della SELECT
colonna SELECT della visualizzazione usi un CONVERT
che modifica un tipo di dati da varchar a integer. In questo caso il 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 SELECT INTO
richiede anche le autorizzazioni CREATE TABLE e ALTER SCHEMA per lo schema che possiede la nuova tabella.
Esempi
Gli esempi seguenti usano il database AdventureWorksPDW2022.
R. Utilizzare 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. Utilizzare 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. Utilizzare DISTINCT con 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. Utilizzare 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. Utilizzare 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. Utilizzare 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. Utilizzare 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. Utilizzare GROUP BY con 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. Utilizzare la 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;