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

GILT FÜR: jaSQL Server jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel 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 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. Die vollständige Syntax der SELECT-Anweisung ist komplex, die Hauptklauseln können jedoch wie folgt zusammengefasst werden:The full syntax of the SELECT statement is complex, but the main clauses can be summarized as:

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

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

[ FROM table_source ] [ WHERE search_condition ][ FROM table_source ] [ WHERE search_condition ]

[ GROUP BY group_by_expression ][ GROUP BY group_by_expression ]

[ HAVING search_condition ][ HAVING search_condition ]

[ ORDER BY order_expression [ ASC | DESC ] ][ 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.The UNION, EXCEPT, and INTERSECT operators can be used between queries to combine or compare their results into one result set.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- 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 ] ) ]  
  

RemarksRemarks

Da die SELECT-Anweisung relativ komplex ist, werden ausführliche Syntaxelemente und Argumente nach Klauseln zusammengefasst aufgeführt: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
HAVINGHAVING
SELECT Clause (SELECT-Klausel)SELECT Clause UNIONUNION
INTO-KlauselINTO Clause EXCEPT und INTERSECTEXCEPT and INTERSECT
FROMFROM ORDER BYORDER BY
WHEREWHERE FOR-KlauselFOR Clause
GROUP BYGROUP BY OPTION Clause (OPTION-Klausel)OPTION Clause

Die Reihenfolge der Klauseln in der SELECT-Anweisung ist wichtig.The order of the clauses in the SELECT statement is significant. Jede der optionalen Klauseln kann ausgelassen werden. Wenn sie jedoch verwendet werden, müssen sie in der richtigen Reihenfolge stehen.Any one of the optional clauses can be omitted, but when the optional clauses are used, they must appear in the appropriate order.

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.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.

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.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. Für Azure SQL-DatenbankAzure SQL Database kann kein vierteiliger Name angegeben werden.A four-part name cannot be specified for Azure SQL-DatenbankAzure SQL Database.

Für SELECT-Anweisungen, die Remotetabellen einbeziehen, gelten einige Syntaxeinschränkungen.Some syntax restrictions apply to SELECT statements that involve remote tables.

Logische Verarbeitungsreihenfolge der SELECT-AnweisungLogical Processing Order of the SELECT statement

Die folgenden Schritte beschreiben die logische Verarbeitungs- oder Bindungsreihenfolge der SELECT-Anweisung.The following steps show the logical processing order, or binding order, for a SELECT statement. Diese Reihenfolge bestimmt, wann die in einem Schritt definierten Objekte in nachfolgenden Schritten für die Klauseln verfügbar gemacht werden.This order determines when the objects defined in one step are made available to the clauses in subsequent steps. 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.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. 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.Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. Allerdings kann durch nachfolgende Klauseln wie der ORDER BY-Klausel darauf verwiesen werden.However, they can be referenced by subsequent clauses such as the ORDER BY clause. Die tatsächliche physische Ausführung der Anweisung wird durch den Abfrageprozessor bestimmt, und die Reihenfolge kann von dieser Liste abweichen.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 oder WITH ROLLUPWITH CUBE or WITH ROLLUP
  7. HAVINGHAVING
  8. SELECTSELECT
  9. DISTINCTDISTINCT
  10. ORDER BYORDER BY
  11. TOPTOP

Warnung

Die oben dargestellte Reihenfolge ist in der Regel zutreffend.The preceding sequence is usually true. Es gibt jedoch Ausnahmefälle, in denen die Reihenfolge abweichen kann.However, there are uncommon cases where the sequence may differ.

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.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 diesem Fall kann CONVERT ausgeführt werden, bevor die WHERE-Klausel ausgeführt wird.In this situation, the CONVERT may execute before the WHERE clause executes. Dies ist wirklich ein Ausnahmefall.Uncommon indeed. Es gibt meistens eine Möglichkeit, die Sicht zu ändern, um die veränderte Reihenfolge zu vermeiden, falls dies in Ihrem Fall relevant ist.Often there is a way to modify your view to avoid the different sequence, if it matters in your case.

BerechtigungenPermissions

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.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. Oder sie erfordert die Mitgliedschaft in der festen Datenbankrolle db_datareader oder db_owner oder der festen Serverrolle sysadmin.Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. Das Erstellen einer neuen Tabelle mit SELECTINTO erfordert auch die Berechtigungen CREATETABLE und ALTERSCHEMA für das Schema, das die neue Tabelle besitzt.Creating a new table using SELECTINTO also requires both the CREATETABLE permission, and the ALTERSCHEMA permission on the schema that owns the new table.

Beispiele:Examples:

In den folgenden Beispielen wird die AdventureWorksPDW2012AdventureWorksPDW2012-Datenbank verwendet.The following examples use the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Verwenden von SELECT zum Abrufen von Zeilen und SpaltenUsing SELECT to retrieve rows and columns

In diesem Abschnitt werden drei Codebeispiele aufgeführt.This section shows three code examples. Im ersten Codebeispiel werden alle Zeilen (es ist keine WHERE-Klausel angegeben) und alle Spalten (mit *) aus der DimEmployee-Tabelle zurückgegeben.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;  

Im nächsten Beispiel wird Aliasing von Tabellen verwendet, um das gleiche Ergebnis zu erzielen.This next example using table aliasing to achieve the same result.

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.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. Die Überschrift der dritten Spalte wird in FirstDay umbenannt.The third column heading is renamed to FirstDay.

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.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. Verwenden von SELECT mit Spaltenüberschriften und BerechnungenUsing SELECT with column headings and calculations

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

Im folgenden Beispiel wird DISTINCT zum Generieren einer Liste aller eindeutigen Titel in der DimEmployee-Tabelle verwendet.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. Verwenden von GROUP BYUsing GROUP BY

Im folgenden Beispiel wird die Gesamtsumme aller Verkäufe pro Tag gesucht.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;  

Aufgrund der GROUP BY-Klausel wird für jeden Tag nur eine Zeile zurückgegeben, die die Summe aller Verkäufe enthält.Because of the GROUP BY clause, only one row containing the sum of all sales is returned for each day.

E.E. Verwenden von GROUP BY mit mehreren GruppenUsing GROUP BY with multiple groups

Im folgenden Beispiel wird der Durchschnittspreis und die Summe aller Internetverkäufe pro Tag gesucht und nach Bestelldatum und Promotion Key gruppiert.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. Verwenden von GROUP BY und WHEREUsing GROUP BY and WHERE

In diesem Beispiel werden die Ergebnisse in Gruppen zusammengefasst, nachdem nur die Zeilen mit Bestelldaten nach dem 1. August 2002 abgerufen wurden.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. Verwenden von GROUP BY mit einem AusdruckUsing GROUP BY with an expression

Im folgenden Beispiel wird nach einem Ausdruck gruppiert.The following example groups by an expression. Sie können nach einem Ausdruck gruppieren, wenn dieser keine Aggregatfunktionen enthält.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. Verwenden von GROUP BY mit ORDER BYUsing GROUP BY with ORDER BY

Im folgenden Beispiel wird die Summe der Verkäufe und Bestellungen pro Tag gesucht.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. Verwenden der HAVING-KlauselUsing the HAVING clause

Diese Abfrage verwendet die HAVING-Klausel, um Ergebnisse zu beschränken.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;  

Weitere InformationenSee Also

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