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 ]

[ HAVING search_condition ]

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

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.

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