Sql-und-Xml - Home

Sql-Tutorial

Daten auswählen mit dem SELECT-Befehl

Die SELECT-Anweisung ist fundamental für jedes Auswählen von Daten und stellt diese in Form einer virtuellen Tabelle zur Verfügung. Diese virtuelle Tabelle, auch Recordset genannt, also eine Menge (= Set) von Records (= Datenzeilen, Datensätzen), existiert zunächst nur temporär im Arbeitsspeicher und wird nach dem Ende der Befehlsausführung verworfen. Wird SELECT ohne weitere Ergänzungen verwendet, so werden die Daten angezeigt. Die Ausgabe kann auch mit SELECT ... INTO ... FROM in eine neue Tabelle kopiert oder mit INSERT INTO ... SELECT ... zu einer bestehenden Tabelle hinzugefügt werden.

Syntax

  • SELECT	[DISTINCT]
    	<Name einer Spalte>
    	<Konstante>
    	<Berechnung>
    	<einer der obigen Ausdrücke> As Spaltenalias
    	[, weitere der obigen Ausdrücke]
    
    FROM <Ausdruck, der eine Tabelle zurückgibt> As Tabellenalias
    
    [WHERE ...]
    
    [GROUP BY ...]
    
    [HAVING ...]
    
    [UNION [ALL]]
    
    [Weitere SELECT-Anweisung, welche dieselbe Zahl von
    	Spalten und Datentypen liefert]
    
    [ORDER BY [Order-By-Ausdruck] ASC | DESC]]
    	[, weitere Sortierungen]
    Dies ist die grundlegende Syntax des SELECT-Befehls. Details zu den Ausdrücken nach FROM, WHERE, GROUP BY und HAVING finden Sie in den Abschnitten über JOIN, WHERE und GROUP BY. Die hiesigen Beispiele behandeln nur den Abschnitt zwischen SELECT und FROM.
  • SELECT <Name einer Spalte - wie oben >
    
    INTO <neue Tabelle>
    
    FROM <Ausdruck, der eine Tabelle zurückgibt> As Tabellenalias

Beispiele

  1. SELECT A_NR,
    	A_NAME,
    	A_PREIS
    FROM ARTIKEL
    Einfache, kommagetrennte Auflistung der gewünschten Spalten, die im Tabellen-Ausdruck vorkommen. Ohne Alias für die Tabelle.
  2. SELECT A.A_NR,
    	A.A_NAME,
    	A.A_PREIS
    FROM ARTIKEL As A
    ORDER BY A.A_PREIS
    Dasselbe wie im ersten Beispiel, aber mit Aliasname A für die Tabelle und aufsteigender Sortierung nach der Spalte A_PREIS.
  3. SELECT A_NR,
    	A_PREIS  As Netto,
    	0.19 As MwSt,
    	A_PREIS * 1.19 As Brutto
    FROM ARTIKEL
    ORDER BY A_PREIS DESC
    Hier werden Alias-Ausdrücke für die Spalten verwendet - das Ergebnis kennt die drei Spalten Netto, MwSt und Brutto. MwSt ist ein konstanter Wert, in der Spalte Brutto wird der Inhalt von A_PREIS multipliziert mit einer Konstanten. Da ein solches Ergebnis keinen Spaltennamen hat, sollte dieser anschließend festgelegt werden. Das Ergebnis wird nach A_PREIS absteigend sortiert.
  4. SELECT A.* FROM ARTIKEL As A
    ORDER BY A.A_NAME ASC,
    	A.A_PREIS DESC
    Hier wird für die Tabelle ein Alias A verwendet und mit * sämtliche Spalten ausgewählt. Das Ergebnis wird aufsteigend nach den Artikel-Namen, absteigend nach den Artikel-Preisen sortiert.
  5. SELECT DISTINCT A.A_NAME
    FROM ARTIKEL As A
    Das Schlüsselwort DISTINCT entfernt alle mehrfach vorkommenden Zeilen mit Ausnahme einer. Diese Abfrage liefert deshalb nicht vier Zeilen mit doppeltem 'Oberhemd', sondern nur drei Zeilen zurück, eine Zelle mit dem Wert 'Oberhemd' wurde entfernt.
  6. SELECT A.A_NAME
    FROM ARTIKEL As A
    UNION
    SELECT B.V_NAME
    FROM VERTRETER As B
    Diese inhaltlich merkwürdige Abfrage liefert alle Artikel- und alle Vertreter-Namen in einer einzigen Liste aus. Da ALL fehlt, werden sechs Zeilen ausgegeben, das doppelte 'Oberhemd' wird nur einfach in das Resultset übernommen. Beachten Sie, daß die Datentypen übereinstimmen müssen und daß jede einzelne SELECT-Abfrage dieselbe Zahl von Spalten zurückliefern muß. Die Spaltennamen müssen allerdings nicht übereinstimmen, bei den SELECT-Anweisungen ab der zweiten Abfrage kann auf ALIAS-Namen verzichtet werden.
  7. SELECT V.*
    	INTO [Kopie-von-Vertreter]
    FROM VERTRETER As V
    Dies transferiert die virtuelle Tabelle in ein reales neues Tabellenobjekt. Zunächst wird die neue Tabelle 'Kopie-von-Vertreter' erstellt und anschließend mit den Zeilen gefüllt, die von der SELECT-Anweisung zurückgegeben wurden. Ergänzt man diese Abfrage um eine WHERE-Klausel 0 = 1, so werden keine Zeilen kopiert, es wird jedoch eine neue leere Tabelle erstellt.

Bemerkungen

  • Machen Sie es dem Sql-Parser möglichst einfach. Verwenden Sie Alias-Namen für Tabellen, dann können die Spalten rascher identifiziert werden, es muß nicht erst ermittelt werden, von welcher Tabelle diese Spalte stammt.
  • Wenn der Spalten-, Alias- oder Tabellenname Sonderzeichen, etwa ein Leerzeichen oder Minus (-) enthält, so schließen Sie den Ausdruck in eckige Klammern ein. Beispiel:
    Select A.A_PREIS * 1.19 As [Aktueller Bruttopreis]
    FROM ARTIKEL
  • Soll ein konstanter Text angegeben werden, so setzen Sie diesen in einfache Hochkommata. Beispiel
    SELECT A.A_NAME, 'aktuell' As Info
    FROM ARTIKEL As A
    Dies liefert zwei Spalten, die erste Spalte heißt 'A_NAME', die zweite 'Info'. Das Ergebnis enthält vier Zeilen, in der ersten Spalte stehen die Werte aus der Tabelle, die zweite Spalte enthält viermal den Text 'aktuell'.
  • Benötigen Sie eine zusätzliche Zahl, etwa beim Vereinigen zweier Tabellen mit UNION, so können Sie diese einfach notieren:
    SELECT A.A_NAME, 1 As [Index]
    FROM ARTIKEL As A
    UNION
    SELECT B.V_NAME, 2
    FROM VERTRETER As B
    Eine solche Technik kann nützlich sein, wenn mit UNION die Ausgaben mehrerer SELECT-Anweisungen zusammengefügt werden und eine Information benötigt wird, aus welchem SELECT-Abschnitt die einzelne Zeile stammt.
  • Hinter FROM folgt ein Ausdruck, der eine Tabelle zurückgibt. Dies kann, wie in den obigen Beispielen, eine einfache Tabelle sein, das Ergebnis einer JOIN-Verknüpfung oder einer Unterabfrage. Ferner lassen es manche Datenbanksysteme zu, daß der FROM-Abschnitt fehlt. In diesem Fall wird genau eine Zeile ausgegeben.
  • Beim Sortieren auf dem MS-SQLServer kann der Aliasname in der ORDER-BY-Klausel angegeben werden. Access dagegen versteht diesen Namen nicht, so daß bei der Sortierung nach dem Ergebnis einer Rechenoperation diese erneut notiert werden muß.
  • Verwendet man die Technik 'SELECT ... INTO ... FROM ...', um eine neue Tabelle zu erzeugen und enthält die ursprüngliche Tabelle eine automatisch hochzählende ID (Identity(1,1)), so wird dieser spezielle Spaltentyp auch in der Zieltabelle erzeugt. Soll dies vermieden werden, kann zur Identitätsspalte 0 hinzugefügt und der Spaltenname als Alias notiert werden:
    SELECT U.Umsatz_Nr + 0 As [Umsatz_Nr], U.A_Nr
    	Into [Umsatz-Kopie]
    FROM UMSATZ As U
    Nun wird die Spalte Umsatz_Nr der neuen Tabelle als Integer definiert.

© 2003-2017 Jürgen Auer, Berlin.