SELECT (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric
Ruft Zeilen aus der Datenbank ab und ermöglicht die Auswahl einer oder mehrerer Zeilen oder Spalten aus einer oder vielen Tabellen in der SQL Server-Datenbank-Engine. Die vollständige Syntax der SELECT
Anweisung ist komplex, aber die Hauptklauseln können wie folgt zusammengefasst werden:
[ 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 ]]
Die Operatoren UNION, EXCEPT und INTERSECT können zwischen Abfragen verwendet werden, um ihre Ergebnisse in einem Resultset zu kombinieren oder zu vergleichen.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server und Azure SQL-Datenbank:
<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 für Azure Synapse Analytics, Parallel Data Warehouse und 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 ] ) ]
Hinweise
Aufgrund der Komplexität der SELECT
Anweisung werden detaillierte Syntaxelemente und Argumente pro Klausel angezeigt:
- WITH XMLNAMESPACES
- HAVING
- WITH common_table_expression
- UNION
- SELECT-Klausel
- EXCEPT und INTERSECT
- INTO-Klausel
- ORDER BY
- FROM
- FOR-Klausel
- WHERE
- OPTION-Klausel
- GROUP BY
Die Reihenfolge der Klauseln in der SELECT
Anweisung ist erheblich. Jede der optionalen Klauseln kann ausgelassen werden. Wenn sie jedoch verwendet werden, müssen sie in der richtigen Reihenfolge stehen.
SELECT
Anweisungen sind nur in benutzerdefinierten Funktionen zulässig, wenn die Auswahllisten dieser Anweisungen Ausdrücke enthalten, die Variablen, die lokal für die Funktionen sind, Werte zuweisen.
Ein vierteiliger Name, der mit der OPENDATASOURCE
Funktion als Servernamenteil erstellt wird, kann als Tabellenquelle verwendet werden, wo ein Tabellenname in einer SELECT
Anweisung angezeigt werden kann. Für Azure SQL-Datenbank kann kein vierteiliger Name angegeben werden.
Einige Syntaxeinschränkungen gelten für SELECT
Anweisungen, die Remotetabellen umfassen.
Logische Verarbeitungsreihenfolge der SELECT-Anweisung
Die folgenden Schritte zeigen die logische Verarbeitungsreihenfolge oder die Bindungsreihenfolge für eine SELECT
Anweisung. Diese Reihenfolge bestimmt, wann die in einem Schritt definierten Objekte in nachfolgenden Schritten für die Klauseln verfügbar gemacht werden. Wenn der Abfrageprozessor beispielsweise die in der FROM
Klausel definierten Tabellen oder Ansichten binden kann, werden diese Objekte und deren Spalten allen nachfolgenden Schritten zur Verfügung gestellt. Da die Klausel Schritt 8 ist, können alle in dieser SELECT
Klausel definierten Spaltenalias oder abgeleiteten Spalten nicht durch vorangehende Klauseln referenziert werden. Sie können jedoch durch nachfolgende Klauseln wie die ORDER BY
Klausel referenziert werden. Der Abfrageprozessor bestimmt die tatsächliche physische Ausführung der Anweisung, und die Reihenfolge kann von dieser Liste abweichen.
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE
oderWITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Warnung
Es gibt ungewöhnliche Fälle, in denen sich die vorherige Sequenz unterscheiden kann. Angenommen, Sie haben einen gruppierten Index in einer Ansicht, und die Ansicht schließt einige Tabellenzeilen aus, und die Spaltenliste der Ansicht SELECT
verwendet einen CONVERT
Datentyp von Varchar int. In diesem Fall kann die CONVERT
Klausel ausgeführt werden, bevor die WHERE
Klausel ausgeführt wird. Häufig gibt es eine Möglichkeit, Ihre Ansicht zu ändern, um die unterschiedliche Reihenfolge zu vermeiden, wenn es in Ihrem Fall wichtig ist.
Berechtigungen
Das Auswählen von Daten erfordert SELECT
die Berechtigung für die Tabelle oder Ansicht, die von einem höheren Bereich geerbt werden kann, z SELECT
. B. die Berechtigung für das Schema oder CONTROL
die Berechtigung für die Tabelle. Oder sie erfordert die Mitgliedschaft in der festen Datenbankrolle db_datareader oder db_owner oder der festen Serverrolle sysadmin. Für das Erstellen einer neuen Tabelle mit Verwendung SELECT INTO
sind auch die CREATE TABLE
Berechtigung und die ALTER SCHEMA
Berechtigung für das Schema erforderlich, das die neue Tabelle besitzt.
Beispiele
In den folgenden Beispielen wird die Datenbank AdventureWorksPDW2022 verwendet.
A. SELECT zum Abrufen von Zeilen und Spalten verwenden
In diesem Abschnitt werden drei Codebeispiele aufgeführt. In diesem ersten Codebeispiel werden alle Zeilen (keine WHERE
Klausel angegeben) und alle Spalten (mit dem *
) aus der DimEmployee
Tabelle zurückgegeben.
SELECT *
FROM DimEmployee
ORDER BY LastName;
Im nächsten Beispiel wird Aliasing von Tabellen verwendet, um das gleiche Ergebnis zu erzielen.
SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;
In diesem Beispiel werden alle Zeilen (keine WHERE
Klausel angegeben) und eine Teilmenge der Spalten (FirstName
, LastName
, StartDate
) aus der Tabelle in der DimEmployee
AdventureWorksPDW2022-Datenbank zurückgegeben. Die Überschrift der dritten Spalte wird in FirstDay
umbenannt.
SELECT FirstName,
LastName,
StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;
In diesem Beispiel werden nur die Zeilen zurückgegeben, für DimEmployee
die das EndDate
nicht und ein MaritalStatus
(M
verheiratet) istNULL
.
SELECT FirstName,
LastName,
StartDate AS FirstDay
FROM DimEmployee
WHERE EndDate IS NOT NULL
AND MaritalStatus = 'M'
ORDER BY LastName;
B. SELECT mit Spaltenüberschriften und Berechnungen verwenden
Das folgende Beispiel gibt alle Zeilen aus der DimEmployee
-Tabelle zurück und berechnet das Bruttogehalt für jeden Mitarbeiter basierend auf BaseRate
und einer 40-Stunden-Woche.
SELECT FirstName,
LastName,
BaseRate,
BaseRate * 40 AS GrossPay
FROM DimEmployee
ORDER BY LastName;
C. DISTINCT mit SELECT verwenden
Im folgenden Beispiel wird DISTINCT
zum Generieren einer Liste aller eindeutigen Titel in der DimEmployee
-Tabelle verwendet.
SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;
D: GROUP BY verwenden
Im folgenden Beispiel wird die Gesamtsumme aller Verkäufe pro Tag gesucht.
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
Aufgrund der GROUP BY
-Klausel wird für jeden Tag nur eine Zeile zurückgegeben, die die Summe aller Verkäufe enthält.
E. GROUP BY mit mehreren Gruppen verwenden
Im folgenden Beispiel wird der Durchschnittspreis und die Summe aller Internetverkäufe pro Tag gesucht und nach Bestelldatum und Promotion Key gruppiert.
SELECT OrderDateKey,
PromotionKey,
AVG(SalesAmount) AS AvgSales,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, PromotionKey
ORDER BY OrderDateKey;
F. GROUP BY und WHERE verwenden
In diesem Beispiel werden die Ergebnisse in Gruppen zusammengefasst, nachdem nur die Zeilen mit Bestelldaten nach dem 1. August 2002 abgerufen wurden.
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
WHERE OrderDateKey > '20020801'
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
G. GROUP BY mit einem Ausdruck verwenden
Im folgenden Beispiel wird nach einem Ausdruck gruppiert. Sie können nach einem Ausdruck gruppieren, wenn dieser keine Aggregatfunktionen enthält.
SELECT SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY (OrderDateKey * 10);
H. GROUP BY mit ORDER BY verwenden
Im folgenden Beispiel wird die Summe der Verkäufe und Bestellungen pro Tag gesucht.
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
I. Die HAVING-Klausel verwenden
Diese Abfrage verwendet die HAVING
-Klausel, um Ergebnisse zu beschränken.
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20010000
ORDER BY OrderDateKey;