SELECT (Transact-SQL)

Anwendungsbereich: JaSQL Server (alle unterstützten Versionen) JaAzure SQL-Datenbank JaVerwaltete Azure SQL-Instanz JaAzure Synapse Analytics JaParallel Data Warehouse

Ruft Zeilen aus der Datenbank ab und ermöglicht die Auswahl einer oder vieler Zeilen oder Spalten aus einer Tabelle oder aus zahlreichen Tabellen in SQL Server. Die vollständige Syntax der SELECT-Anweisung ist komplex, die Hauptklauseln können jedoch 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 ]

[ ORDER BY order_expression [ ASC | DESC ]]

Die Operatoren UNION, EXCEPT und INTERSECT können zwischen Abfragen verwendet werden, um deren Ergebnisse in einem Resultset zu kombinieren oder zu vergleichen.

Symbol für Themenlink Transact-SQL-Syntaxkonventionen

Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
<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 for Azure Synapse Analytics 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 ] ) ]  
  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.

Bemerkungen

Da die SELECT-Anweisung relativ komplex ist, werden ausführliche Syntaxelemente und Argumente nach Klauseln zusammengefasst aufgeführt:

Die Reihenfolge der Klauseln in der SELECT-Anweisung ist wichtig. Jede der optionalen Klauseln kann ausgelassen werden. Wenn sie jedoch verwendet werden, müssen sie in der richtigen Reihenfolge stehen.

SELECT-Anweisungen sind in benutzerdefinierten Funktionen nur dann zulässig, wenn die Auswahllisten dieser Anweisungen Ausdrücke enthalten, die lokalen Variablen der Funktionen Werte zuweisen.

Ein mit der OPENDATASOURCE-Funktion als Servername konstruierter vierteiliger Name kann als Tabellenquelle überall dort verwendet werden, wo ein Tabellenname in einer SELECT-Anweisung vorkommen kann. Für Azure SQL-Datenbank kann kein vierteiliger Name angegeben werden.

Für SELECT-Anweisungen, die Remotetabellen einbeziehen, gelten einige Syntaxeinschränkungen.

Logische Verarbeitungsreihenfolge der SELECT-Anweisung

Die folgenden Schritte beschreiben die logische Verarbeitungs- oder Bindungsreihenfolge der 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 z. B. eine Bindung mit den in der FROM-Klausel definierten Tabellen oder Sichten herstellen (bzw. darauf zugreifen) kann, werden diese Objekte und die dazugehörigen Spalten für alle nachfolgenden Schritten verfügbar gemacht. Umgekehrt kann auf die in dieser Klausel definierten Spaltenaliase oder abgeleiteten Spalten nicht durch vorhergehende Klauseln verwiesen werden, da die SELECT-Klausel Schritt 8 ist. Allerdings kann durch nachfolgende Klauseln wie der ORDER BY-Klausel darauf verwiesen werden. Die tatsächliche physische Ausführung der Anweisung wird durch den Abfrageprozessor bestimmt, und die Reihenfolge kann von dieser Liste abweichen.

  1. FROM
  2. EIN
  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

Die oben dargestellte Reihenfolge ist in der Regel zutreffend. Es gibt jedoch Ausnahmefälle, in denen die Reihenfolge abweichen kann.

Nehmen wir als Beispiel einen gruppierten Index für eine Sicht, die manche Tabellenzeilen ausschließt und deren SELECT-Spaltenliste CONVERT verwendet, wodurch ein Datentyp von varchar in integer geändert wird. In diesem Fall kann CONVERT ausgeführt werden, bevor die WHERE-Klausel ausgeführt wird. Dies ist wirklich ein Ausnahmefall. Es gibt meistens eine Möglichkeit, die Sicht zu ändern, um die veränderte Reihenfolge zu vermeiden, falls dies in Ihrem Fall relevant ist.

Berechtigungen

Die Auswahl von Daten erfordert die Berechtigung SELECT für die Tabelle oder Sicht, die über einen höheren Bereich, beispielsweise über die Berechtigung SELECT für das Schema oder die Berechtigung CONTROL für die Tabelle, vererbt werden kann. Oder sie erfordert die Mitgliedschaft in der festen Datenbankrolle db_datareader oder db_owner oder der festen Serverrolle sysadmin. Das Erstellen einer neuen Tabelle mit SELECT INTO erfordert auch die Berechtigungen CREATE TABLE und ALTER SCHEMA für das Schema, das die neue Tabelle besitzt.

Beispiele:

In den folgenden Beispielen wird die AdventureWorksPDW2012-Datenbank verwendet.

A. Verwenden von SELECT zum Abrufen von Zeilen und Spalten

In diesem Abschnitt werden drei Codebeispiele aufgeführt. Im ersten Codebeispiel werden alle Zeilen (es ist keine WHERE-Klausel angegeben) und alle Spalten (mit *) 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 DimEmployee-Tabelle in der AdventureWorksPDW2012-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 für DimEmployee zurückgegeben, die über ein EndDate verfügen, das nicht NULL ist und über einen MaritalStatus von „M“ (married = verheiratet) verfügen.

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

B. Verwenden von SELECT mit Spaltenüberschriften und Berechnungen

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. Verwenden von DISTINCT mit SELECT

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: Verwenden von GROUP BY

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. Verwenden von GROUP BY mit mehreren Gruppen

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. Verwenden von GROUP BY und WHERE

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. Verwenden von GROUP BY mit einem Ausdruck

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. Verwenden von GROUP BY mit ORDER BY

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. Verwenden der HAVING-Klausel

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;  

Weitere Informationen

SELECT-Beispiele (Transact-SQL)
Hints (Transact-SQL) (Hinweise (Transact-SQL))