SELECT (Transact-SQL)
Si applica a:SQL Server
database SQL di Azure
Istanza gestita di SQL di Azure
Azure Synapse Analytics Analytics
Platform System (PDW)
SQL analytics endpoint 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 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.
- FROM
- In...
- JOIN
- WHERE
- GROUP BY
- WITH CUBE o WITH 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 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)
Commenti e suggerimenti
Invia e visualizza il feedback per