Teile einer SELECT-Anweisung

Die vollständige Syntax der SELECT-Anweisung ist komplex, die Hauptklauseln können jedoch wie folgt zusammengefasst werden:

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

Beschreibt die Spalten des Resultsets. Es handelt sich um eine Liste von Ausdrücken, die durch Kommas voneinander getrennt sind. Jeder Ausdruck definiert sowohl das Format (Datentyp und Größe) als auch die Quelle der Daten für die Resultsetspalte. Jeder Ausdruck in der Auswahlliste ist normalerweise ein Verweis auf eine Spalte in der Quelltabelle oder -sicht, aus der die Daten stammen, kann jedoch auch ein beliebiger anderer Ausdruck sein, z. B. eine Konstante oder eine Transact-SQL-Funktion. Wenn Sie den Ausdruck * in einer Auswahlliste verwenden, werden alle Spalten in der Quelltabelle zurückgegeben.

INTO new_table_name

Gibt an, dass das Resultset zum Erstellen einer neuen Tabelle verwendet wird. new_table_name gibt den Namen der neuen Tabelle an.

FROM table_list

Enthält eine Liste der Tabellen, aus denen die Resultsetdaten abgerufen werden. Folgende Quellen sind möglich:

  • Basistabellen auf dem lokalen Server, auf dem SQL Server 2005 ausgeführt wird.
  • Sichten in der lokalen Instanz von SQL Server. SQL Server löst einen Verweis auf eine Sicht intern in Verweise auf die Basistabellen auf, aus denen die Sicht abgeleitet ist.
  • Verknüpfte Tabellen. Dabei handelt es sich um Tabellen in OLE DB-Datenquellen, auf die SQL Server zugreifen kann. Dies wird als verteilte Abfrage bezeichnet. Der Zugriff auf OLE DB-Datenquellen von SQL Server aus ist durch Erstellen eines entsprechenden Verbindungsservers oder durch Verweisen auf die betreffende Datenquelle in einer OPENROWSET- oder OPENQUERY-Funktion möglich.

Die FROM-Klausel kann ebenfalls Verknüpfungsspezifikationen enthalten. Diese definieren den jeweiligen Pfad, den SQL Server beim Navigieren von einer Tabelle zu einer anderen verwenden soll.

Die FROM-Klausel wird auch in DELETE- und UPDATE-Anweisungen zum Definieren der zu ändernden Tabellen verwendet.

WHERE search_conditions

Die WHERE-Klausel ist ein Filter, der die Bedingungen definiert, die jede Zeile in den Quelltabellen erfüllen muss, um für die SELECT-Anweisung qualifiziert zu sein. Nur Zeilen, die diese Bedingungen erfüllen, tragen Daten zum Resultset bei. Daten aus Zeilen, die die Bedingungen nicht erfüllen, werden nicht verwendet.

Die WHERE-Klausel wird auch in DELETE- und UPDATE-Anweisungen zum Definieren der zu ändernden Zeilen in den Zieltabellen verwendet.

GROUP BY group_by_list

Die GROUP BY-Klausel partitioniert das Resultset basierend auf den Werten in den Spalten, die in group_by_list angegeben sind, in Gruppen. Die AdventureWorksSales.SalesOrderHeader-Tabelle weist z. B. 10 Werte in TerritoryID auf. Eine GROUP BY TerritoryID-Klausel partitioniert das Resultset in 10 Gruppen, eine für jeden Wert der TerritoryID-Spalte.

HAVING search_conditions

Die HAVING-Klausel ist ein zusätzlicher Filter, der auf das Resultset angewendet wird. Logisch betrachtet filtert die HAVING-Klausel Zeilen aus dem Zwischenresultset, das durch die Anwendung aller FROM-, WHERE- und GROUP BY-Klauseln in der SELECT-Anweisung erstellt wird. HAVING-Klauseln werden in der Regel mit einer GROUP BY-Klausel verwendet, es ist jedoch keine GROUP BY-Klausel vor einer HAVING-Klausel erforderlich.

ORDER BY order_list[ ASC | DESC ]

Die ORDER BY-Klausel definiert die Reihenfolge, in der die Zeilen im Resultset sortiert werden. order_list gibt die Liste der Resultsetspalten an, nach deren Werten sortiert wird. Die ASC- und DESC-Schlüsselwörter werden verwendet, um anzugeben, ob die Zeilen in aufsteigender (ASC) oder absteigender (DESC) Reihenfolge sortiert werden.

ORDER BY ist wichtig, weil das relationale Datenmodell besagt, dass nur dann von einer bestimmten Reihenfolge der Zeilen in einem Resultset ausgegangen werden kann, wenn ORDER BY angegeben ist. ORDER BY muss in jeder SELECT-Anweisung verwendet werden, bei der die Reihenfolge der Zeilen im Resultset von Bedeutung ist.

Die Klauseln in einer SELECT-Anweisung müssen in der richtigen Reihenfolge angegeben werden.

Jeder Verweis auf ein Datenbankobjekt muss eindeutig sein. Mehrdeutigkeit kann verschiedene Ursachen haben:

  • Es kann mehrere Objekte gleichen Namens in einem System geben. Es ist z. B. möglich, dass sowohl Schema1 als auch Schema2 eine Tabelle mit dem Namen TableX verwenden. Um die Mehrdeutigkeit aufzulösen und TableX von Schema1 anzugeben, kennzeichnen Sie den Tabellennamen mindestens mit dem Benutzernamen als Qualifizierer:

    SELECT *
    FROM Schema1.TableX
    
  • Die Datenbank, in der sich das Objekt befindet, ist bei Ausführung der SELECT-Anweisung möglicherweise nicht die aktuelle Datenbank. Um sicherzustellen, dass unabhängig von der Einstellung für die aktuelle Datenbank immer das richtige Objekt verwendet wird, qualifizieren Sie den Objektnamen mit dem Datenbank- und Schemanamen:

    SELECT *
    FROM AdventureWorks.Purchasing.ShipMethod
    
  • Es ist möglich, dass mehrere in der FROM-Klausel angegebene Tabellen und Sichten einen bestimmten Spaltennamen besitzen. Fremdschlüssel weisen häufig denselben Spaltennamen wie der zugehörige Primärschlüssel auf. Um die Mehrdeutigkeit zwischen mehrfach vorkommenden Namen aufzulösen, muss der Spaltenname mit dem Tabellen- oder Sichtnamen qualifiziert werden:

    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
    

    Diese Syntax wird unübersichtlich, wenn die Tabellen- und Sichtnamen vollqualifiziert sein müssen. Dieses Problem lässt sich lösen, indem der Tabelle mithilfe des AS-Schlüsselwortes in der FROM-Klausel ein abhängiger Name (auch Bereichsvariable oder Alias genannt) zugewiesen wird. Der vollqualifizierte Tabellen- oder Sichtname muss dann nur in der FROM-Klausel angegeben werden. Alle anderen Tabellen- oder Sichtverweise können den abhängigen Namen verwenden. Durch Anwenden von abhängigen Namen und vollständiges Qualifizieren der Tabellennamen im vorherigen Beispiel wird die folgende SELECT-Anweisung erstellt:

    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
    

Weitere Informationen zur Objektqualifikation finden Sie unter Bezeichner.

Viele Transact-SQL-Beispiele in der SQL Server-Onlinedokumentation sind insofern vereinfacht, als keine qualifizierten Namen verwendet werden. Auch wenn diese Elemente der Übersichtlichkeit halber in den Beispielen nicht aufgeführt sind, sollten für Transact-SQL-Anweisungen in Produktionssystemen qualifizierte Namen verwendet werden.

Siehe auch

Andere Ressourcen

Ausdrücke (Transact-SQL)
SELECT (Transact-SQL)
IDENTITY-Eigenschaft (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005