Parti di un'istruzione SELECT
La sintassi completa dell'istruzione SELECT è complessa, ma le clausole principali sono le seguenti:
SELECT select_list
[ INTO new_table_name ]
FROM table_list
[ WHERE search_conditions ]
[ GROUP BY group_by_list ]
[ HAVING search_conditions ]
[ ORDER BY order_list [ ASC | DESC ] ]
select_list
Indica le colonne del set di risultati. È un elenco di espressioni separate da virgola. Ogni espressione definisce il formato (tipo di dati e dimensioni) e l'origine dei dati della colonna del set di risultati. Ogni espressione è in genere un riferimento a una colonna della tabella o della vista di origine da cui provengono i dati, ma può essere qualsiasi espressione, ad esempio una costante o una funzione Transact-SQL. L'espressione * specifica che devono essere restituite tutte le colonne della tabella di origine.
INTO new_table_name
Indica che il set di risultati viene utilizzato per la creazione di una nuova tabella, il cui nome è specificato in new_table_name.
FROM table_list
Include l'elenco delle tabelle da cui recuperare i dati del set di risultati. È possibile specificare le origini seguenti:
- Tabelle di base del server locale che esegue SQL Server 2005.
- Viste nell'istanza locale di SQL Server. Un riferimento a una vista viene risolto internamente nei riferimenti alle tabelle di base che costituiscono la vista.
- Tabelle collegate, ovvero tabelle delle origini dati OLE DB accessibili a SQL Server. Tale comportamento viene definito query distribuita. Per accedere a un'origine dati OLE DB da SQL Server, è possibile connettersi a tale origine come server collegato oppure farvi riferimento in una funzione OPENROWSET o OPENQUERY.
La clausola FROM può inoltre includere specifiche di join, le quali definiscono il percorso specifico utilizzato in SQL Server nel passaggio da una tabella all'altra.
La clausola FROM viene infine utilizzata in istruzioni DELETE e UPDATE per definire le tabelle da modificare.
WHERE search_conditions
La clausola WHERE è un filtro che definisce le condizioni che devono essere soddisfatte affinché le righe delle tabelle di origine vengano incluse nel risultato dell'istruzione SELECT. Nel set di risultati vengono inclusi solo i dati delle righe che soddisfano le condizioni specificate, mentre i dati delle altre righe vengono ignorati.
La clausola WHERE viene inoltre utilizzata in istruzioni DELETE e UPDATE per definire le righe delle tabelle di destinazione da modificare.
GROUP BY group_by_list
La clausola GROUP BY suddivide il set di risultati in gruppi in base ai valori delle colonne di group_by_list. La tabella AdventureWorksSales.SalesOrderHeader contiene ad esempio 10 valori in TerritoryID. Una clausola GROUP BY TerritoryID suddivide il set di risultati in 10 gruppi, uno per ciascun valore di TerritoryID.
HAVING search_conditions
La clausola HAVING è un ulteriore filtro applicato al set di risultati. Dal punto di vista logico, la clausola HAVING filtra le righe del set di risultati intermedio creato in seguito all'applicazione di clausole FROM, WHERE o GROUP BY dell'istruzione SELECT. Sebbene la clausola HAVING non debba essere preceduta dalla clausola GROUP BY, le due clausole vengono in genere utilizzate congiuntamente.
ORDER BY order_list[ ASC | DESC ]
La clausola ORDER BY definisce l'ordine in cui vengono disposte le righe del set di risultati. order_list specifica le colonne del set di risultati che costituiscono l'elenco di ordinamento. Le parole chiave ASC e DESC consentono di specificare se le righe devono essere disposte in ordine crescente o decrescente.
La clausola ORDER BY riveste una notevole importanza. In base alla teoria relazionale, infatti, le righe di un set di risultati non seguono alcun ordine a meno che non venga specificata tale clausola. La clausola ORDER BY deve essere inclusa in qualsiasi istruzione SELECT in cui è l'ordinamento delle righe del set di risultati è rilevante.
Le clausole di un'istruzione SELECT devono essere specificate secondo l'ordine appropriato.
Tutti i riferimenti agli oggetti del database non devono essere ambigui. Di seguito sono elencate le possibili cause di ambiguità degli oggetti:
In un sistema possono essere disponibili più oggetti con lo stesso nome. È possibile, ad esempio, che per Schema1 e Schema2 sia disponibile una tabella denominata TableX. Per risolvere l'ambiguità e specificare la tabella TableX di proprietà di Schema1, è necessario specificare il nome completo della tabella indicando almeno il nome dello schema:
SELECT * FROM Schema1.TableX
Il database in cui si trova l'oggetto non corrisponde necessariamente al database corrente al momento dell'esecuzione di SELECT. Per fare in modo che venga utilizzato sempre l'oggetto appropriato, indipendentemente dal database corrente, è necessario specificare il nome completo dell'oggetto indicando il database e lo schema:
SELECT * FROM AdventureWorks.Purchasing.ShipMethod
Le tabelle e le viste specificate nella clausola FROM possono includere nomi di colonna duplicati. Di frequente il nome di colonna delle chiavi esterne è identico a quello della chiave primaria corrispondente. Per risolvere l'ambiguità tra nomi duplicati, è necessario specificare il nome completo della colonna indicando il nome della tabella o della vista:
SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name FROM Sales.Customer JOIN Sales.Store ON ( Sales.Customer.CustomerID = Sales.Store.CustomerID) WHERE Sales.Customer.TerritoryID = 1
Questa sintassi diventa eccessivamente complessa quando è necessario specificare il nome completo di tabelle e viste. Per risolvere il problema, è possibile assegnare alla tabella un nome di correlazione, noto anche come alias o variabile di intervallo, specificando la parola chiave AS nella clausola FROM. Il nome completo della tabella o della vista deve quindi essere specificato solo nella clausola FROM. In tutti gli altri riferimenti alla tabella o alla vista è possibile utilizzare il nome di correlazione. Se si applicano i nomi di correlazione e si assegna un nome completo alle tabelle dell'esempio precedente, si otterrà l'istruzione SELECT seguente:
SELECT DISTINCT c.CustomerID, s.Name FROM Sales.Customer AS c JOIN Sales.Store AS s ON ( c.CustomerID = s.CustomerID) WHERE c.TerritoryID = 1
Per ulteriori informazioni sulla qualificazione degli oggetti, vedere Identificatori.
Nella documentazione in linea di SQL Server molti esempi di Transact-SQL sono stati semplificati omettendo i nomi completi per agevolarne la lettura. Nelle istruzioni Transact-SQL eseguite in sistemi di produzione è tuttavia consigliabile utilizzare nomi completi.
Vedere anche
Altre risorse
Espressioni (Transact-SQL)
SELECT (Transact-SQL)
IDENTITY (proprietà) (Transact-SQL)