SELECT (Transact-SQL)SELECT (Transact-SQL)

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2008)sìDatabase SQL di AzuresìAzure SQL Data Warehouse sìParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Recupera righe dal database e consente la selezione di uno o più righe o colonne da uno o più tabelle in SQL ServerSQL Server.Retrieves rows from the database and enables the selection of one or many rows or columns from one or many tables in SQL ServerSQL Server. La sintassi completa dell'istruzione SELECT è complessa, ma le clausole principali sono le seguenti:The full syntax of the SELECT statement is complex, but the main clauses can be summarized as:

[Con {[WITH XMLNAMESPACES,] [ <common_table_expression >]}][ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> ] } ]

Selezionare select_list [INTO new_table ]SELECT select_list [ INTO new_table ]

[Da table_source ] [dove search_condition ][ FROM table_source ] [ WHERE search_condition ]

[GROUP BY group_by_expression ][ GROUP BY group_by_expression ]

[Con search_condition ][ HAVING search_condition ]

[ORDER BY order_expression [ASC | DESC]][ ORDER BY order_expression [ ASC | DESC ] ]

L'operatore UNION, EXCEPT e INTERSECT operatori possono essere utilizzati tra le query per combinare o confrontare i risultati in un set di risultati.The UNION, EXCEPT, and INTERSECT operators can be used between queries to combine or compare their results into one result set.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

-- Syntax for SQL Server and Azure SQL Database  

<SELECT statement> ::=    
    [ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]  
    <query_expression>   
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }   
  [ ,...n ] ]   
    [ <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 SQL Data Warehouse 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 ] ) ]  

OsservazioniRemarks

A causa della complessità dell'istruzione SELECT, gli elementi della sintassi e gli argomenti dettagliati sono stati raggruppati e descritti in base alla clausola:Because of the complexity of the SELECT statement, detailed syntax elements and arguments are shown by clause:

WITH XMLNAMESPACESWITH XMLNAMESPACES

WITH common_table_expressionWITH common_table_expression
CONHAVING
Clausola SELECTSELECT Clause UNIONEUNION
Clausola INTOINTO Clause EXCEPT e INTERSECTEXCEPT and INTERSECT
FROMFROM ORDER BYORDER BY
WHEREWHERE Clausola FORFOR Clause
RAGGRUPPA PERGROUP BY Clausola OPTIONOPTION Clause

L'ordine delle clausole nell'istruzione SELECT è significativo.The order of the clauses in the SELECT statement is significant. È possibile omettere qualsiasi clausola facoltativa, ma se tali clausole vengono utilizzate, è necessario specificarle nell'ordine corretto.Any one of the optional clauses can be omitted, but when the optional clauses are used, they must appear in the appropriate order.

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.SELECT statements are permitted in user-defined functions only if the select lists of these statements contain expressions that assign values to variables that are local to the functions.

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.A four-part name constructed with the OPENDATASOURCE function as the server-name part can be used as a table source wherever a table name can appear in a SELECT statement. Non è possibile specificare un nome composto da quattro parti per Database SQL di AzureAzure SQL Database.A four-part name cannot be specified for Database SQL di AzureAzure SQL Database.

Per le istruzioni SELECT in cui sono coinvolte tabelle remote sono previste alcune limitazioni della sintassi.Some syntax restrictions apply to SELECT statements that involve remote tables.

Ordine di elaborazione logica dell'istruzione SELECTLogical Processing Order of the SELECT statement

Nei passaggi seguenti viene mostrato l'ordine di elaborazione logica, o ordine di associazione, per un'istruzione SELECT.The following steps show the logical processing order, or binding order, for a SELECT statement. Questo ordine consente di determinare il momento in cui gli oggetti definiti in un passaggio vengono resi disponibili per le clausole nei passaggi successivi.This order determines when the objects defined in one step are made available to the clauses in subsequent steps. 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.For example, if the query processor can bind to (access) the tables or views defined in the FROM clause, these objects and their columns are made available to all subsequent steps. 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.Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. Tuttavia, è possibile farvi riferimento tramite clausole successive, ad esempio ORDER BY.However, they can be referenced by subsequent clauses such as the ORDER BY clause. L'esecuzione fisica effettiva dell'istruzione è determinata da query processor e l'ordine può variare da questo elenco.The actual physical execution of the statement is determined by the query processor and the order may vary from this list.

  1. FROMFROM
  2. ONON
  3. JOINJOIN
  4. WHEREWHERE
  5. GROUP BYGROUP BY
  6. WITH CUBE o WITH ROLLUPWITH CUBE or WITH ROLLUP
  7. HAVINGHAVING
  8. SELECTSELECT
  9. DISTINCTDISTINCT
  10. ORDER BYORDER BY
  11. Torna all'inizioTOP

Avviso

La precedente sequenza si verifica in genere.The preceding sequence is usually true. Tuttavia, esistono casi non comuni in cui la sequenza può essere diverso.However, there are uncommon cases where the sequence may differ.

Si supponga, ad esempio, si dispone di un indice cluster in una vista, e la vista esclude alcune righe di tabella, elenco selezionare la colonna della vista utilizza una conversione che modifica un tipo di dati da varchar a intero.For example, suppose you have a clustered index on a view, and the view excludes some table rows, and the view's SELECT column list uses a CONVERT that changes a data type from varchar to integer. In questo caso, la funzione CONVERT può essere eseguita prima della clausola WHERE viene eseguita.In this situation, the CONVERT may execute before the WHERE clause executes. Insolito effettivamente.Uncommon indeed. Spesso è possibile modificare la vista per evitare la sequenza di diversi, se è importante nel caso specifico.Often there is a way to modify your view to avoid the different sequence, if it matters in your case.

PermissionsPermissions

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.Selecting data requires SELECT permission on the table or view, which could be inherited from a higher scope such as SELECT permission on the schema or CONTROL permission on the table. O richiede l'appartenenza di db_datareader o db_owner ruoli predefiniti del database, o sysadmin ruolo predefinito del server.Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. Creazione di una nuova tabella tramite SELECTINTO richiede inoltre il CREATETABLE autorizzazione e ALTERSCHEMA autorizzazione per lo schema a cui appartiene la nuova tabella.Creating a new table using SELECTINTO also requires both the CREATETABLE permission, and the ALTERSCHEMA permission on the schema that owns the new table.

Esempi:Examples:

Nell'esempio seguente viene utilizzato il database AdventureWorksPDW2012AdventureWorksPDW2012.The following examples use the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Utilizzo dell'istruzione SELECT per il recupero di righe e colonneUsing SELECT to retrieve rows and columns

Questa sezione illustra i tre esempi di codice.This section shows three code examples. Questo primo esempio di codice restituisce tutte le righe (una clausola WHERE non omessa) e tutte le colonne (utilizzando la *) dal DimEmployee tabella.This first code example returns all rows (no WHERE clause is specified) and all columns (using the *) from the DimEmployee table.

SELECT *  
FROM DimEmployee  
ORDER BY LastName;  

Questo esempio l'utilizzo di alias di tabella per ottenere lo stesso risultato.This next example using table aliasing to achieve the same result.

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

Questo esempio vengono restituite tutte le righe (una clausola WHERE non omessa) e un subset delle colonne (FirstName, LastName, StartDate) dal DimEmployee tabella il AdventureWorksPDW2012 database.This example returns all rows (no WHERE clause is specified) and a subset of the columns (FirstName, LastName, StartDate) from the DimEmployee table in the AdventureWorksPDW2012 database. Intestazione della terza colonna è stata rinominata FirstDay.The third column heading is renamed to FirstDay.

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

Questo esempio vengono restituite solo le righe per DimEmployee che dispongono di un EndDate che non è NULL e un MaritalStatus di m' ' (sposato).This example returns only the rows for DimEmployee that have an EndDate that is not NULL and a MaritalStatus of ‘M’ (married).

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

B.B. Utilizzo dell'istruzione SELECT con intestazioni e calcoli di colonnaUsing SELECT with column headings and calculations

L'esempio seguente restituisce tutte le righe dal DimEmployee tabella e calcola la retribuzione lorda per ogni dipendente in base alle loro BaseRate e lavoro 40 ore alla settimana.The following example returns all rows from the DimEmployee table, and calculates the gross pay for each employee based on their BaseRate and a 40-hour work week.

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

C.C. Utilizzo della clausola DISTINCT con l'istruzione SELECTUsing DISTINCT with SELECT

L'esempio seguente usa DISTINCT per generare un elenco di tutti i titoli univoci nel DimEmployee tabella.The following example uses DISTINCT to generate a list of all unique titles in the DimEmployee table.

SELECT DISTINCT Title  
FROM DimEmployee  
ORDER BY Title;  

D.D. Utilizzo della clausola GROUP BYUsing GROUP BY

Nell'esempio seguente consente di trovare la quantità totale per tutte le vendite in ogni giorno.The following example finds the total amount for all sales on each day.

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

Perché il GROUP BY clausola, per ciascun giorno in cui viene restituita solo una riga contenente la somma di tutte le vendite.Because of the GROUP BY clause, only one row containing the sum of all sales is returned for each day.

E.E. Utilizzo della clausola GROUP BY con più gruppiUsing GROUP BY with multiple groups

Nell'esempio seguente consente di individuare il prezzo medio e la somma delle vendite Internet per ogni giorno, raggruppati per data dell'ordine e la chiave di innalzamento di livello.The following example finds the average price and the sum of Internet sales for each day, grouped by order date and the promotion key.


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

F.F. Utilizzo delle clausole GROUP BY e WHEREUsing GROUP BY and WHERE

Nell'esempio seguente inserisce i risultati in gruppi dopo il recupero solo le righe con date successive a 1 agosto 2002.The following example puts the results into groups after retrieving only the rows with order dates later than August 1, 2002.

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

G.G. Utilizzo della clausola GROUP BY con un'espressioneUsing GROUP BY with an expression

Nell'esempio seguente vengono creati gruppi in base a un'espressione.The following example groups by an expression. È possibile creare gruppi in base a un'espressione se tale espressione non include funzioni di aggregazione.You can group by an expression if the expression does not include aggregate functions.

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

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

Nell'esempio seguente consente di trovare la somma delle vendite per ogni giorno e orders entro il giorno.The following example finds the sum of sales per day, and orders by the day.

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

I.I. Utilizzo della clausola HAVINGUsing the HAVING clause

Questa query utilizza la HAVING clausola per limitare i risultati.This query uses the HAVING clause to restrict results.

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

Vedere ancheSee Also

Selezionare esempi ( Transact-SQL )SELECT Examples (Transact-SQL)
Hint per la ( Transact-SQL )Hints (Transact-SQL)