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 ]

[ HAVING search_condition ]

[ WINDOW window_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:

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.

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE oppure WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. 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;