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 le righe dal database e abilita la selezione di una o più righe o colonne da una o più tabelle nel motore di database di SQL Server. La sintassi completa dell'istruzione SELECT
è complessa, ma le clausole principali possono essere riepilogate nel modo seguente:
[ 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 ]]
Gli operatori UNION, EXCEPT e INTERSECT possono essere usati tra le query per combinare o confrontare i risultati in un unico set di risultati.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
Sintassi per SQL Server e database SQL di 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> ]
[ ; ]
Sintassi per Azure Synapse Analytics e Parallel Data Warehouse e 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
, vengono visualizzati elementi e argomenti di sintassi dettagliati per clausola:
- WITH XMLNAMESPACES
- HAVING
- WITH common_table_expression
- UNION
- Clausola SELECT
- EXCEPT e INTERSECT
- Clausola INTO
- ORDER BY
- FROM
- Clausola FOR
- WHERE
- Clausola OPTION
- GROUP BY
L'ordine delle clausole nell'istruzione SELECT
è significativo. È possibile omettere qualsiasi clausola facoltativa, ma se tali clausole vengono utilizzate, è necessario specificarle nell'ordine corretto.
SELECT
Le istruzioni sono consentite nelle funzioni definite dall'utente solo se gli elenchi di selezione di queste istruzioni contengono espressioni che assegnano valori a variabili locali alle funzioni.
Un nome in quattro parti costruito con la OPENDATASOURCE
funzione come parte nome-server può essere usato come origine di tabella ovunque un nome di tabella possa essere visualizzato in un'istruzione SELECT
. Non è possibile specificare un nome in quattro parti per database SQL di Azure.
Alcune restrizioni di sintassi si applicano alle SELECT
istruzioni che coinvolgono tabelle remote.
Ordine di elaborazione logico dell'istruzione SELECT
I passaggi seguenti illustrano l'ordine di elaborazione logica, o l'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 FROM
clausola , questi oggetti e le relative colonne vengono resi disponibili a tutti i passaggi successivi. Al contrario, poiché la SELECT
clausola è il passaggio 8, qualsiasi alias di colonna o colonne derivate definite in tale clausola non può essere fatto riferimento dalle clausole precedenti. Tuttavia, è possibile farvi riferimento da clausole successive, ad esempio la ORDER BY
clausola . Query Processor determina l'esecuzione fisica effettiva dell'istruzione e l'ordine può variare da questo elenco.
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE
oppureWITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Avviso
Esistono casi non comuni in cui la sequenza precedente potrebbe differire. Si supponga di avere un indice cluster in una vista e che la vista escluda alcune righe di tabella e che l'elenco di colonne della SELECT
vista usi un CONVERT
oggetto che modifica un tipo di dati da varchar a int. In questo caso, l'oggetto CONVERT
può essere eseguito prima dell'esecuzione della WHERE
clausola . Spesso c'è un modo per modificare la visualizzazione per evitare la diversa sequenza, se è importante nel tuo caso.
Autorizzazioni
La selezione dei dati richiede SELECT
l'autorizzazione per la tabella o la vista, che può essere ereditata da un ambito superiore, ad SELECT
esempio l'autorizzazione per lo schema o CONTROL
l'autorizzazione 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 l'autorizzazione CREATE TABLE
e l'autorizzazione ALTER SCHEMA
per lo schema proprietario della 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. Questo primo esempio di codice restituisce tutte le righe (nessuna WHERE
clausola è specificata) e tutte le colonne (usando ) *
dalla DimEmployee
tabella.
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;
In questo esempio vengono restituite tutte le righe (nessuna WHERE
clausola specificata) e un subset delle colonne (FirstName
, LastName
, StartDate
) dalla DimEmployee
tabella nel database AdventureWorksPDW2022 . 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
le quali è presente un oggetto EndDate
che non NULL
è e uno MaritalStatus
di 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 raggruppare in base a un'espressione se l'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;