Mit WHERE wenige Zeilen auswählen

Die SELECT-Anweisung liefert eine virtuelle Tabelle, bestehend aus Zeilen und Spalten zurück. Der nach FROM folgende WHERE-Abschnitt kann Spaltennamen verwenden, um Bedingungen festzulegen. Für jede Zeile wird geprüft, ob die durch den Spaltennamen festgelegte Zelle die Bedingung erfüllt. Falls dies der Fall ist, wird die Zeile zur Ausgabe hinzugefügt, ansonsten wird diese Zeile nicht zum Resultset ergänzt.

Syntax

Beispiele:

  1. Select A.*
    FROM ARTIKEL As A
    WHERE A.A_NR = 11
    Wählt die Zeile aus, bei welcher die Zelle A_NR den Wert 11 hat. Hier ist eine Bedingung und kein logischer Operator angegeben.
  2. WHERE NOT A.A_NR = 11
    WHERE A.A_NR <> 11
    Wählt alle Zeilen aus, deren A_NR verschieden von 11 und nicht leer (Not Null) ist.
  3. WHERE A_PREIS IS NULL
    Wählt jene Zeilen aus, bei welchen derzeit kein Preis definiert ist, bei denen die Zelle A_PREIS also leer ist. Beachten Sie, daß eine Zelle mit dem Wert 0 nicht leer ist, sondern den Wert 0 enthält. Ebenso ist bei Zellen mit Text die Belegung mit einer leeren Zeichenfolge (A_NAME = "" bzw. '') verschieden von der Zuweisung A_NAME = NULL bzw. der Abfrage A_NAME IS NULL.
  4. WHERE A.A_NAME = 'Oberhemd' And A.A_PREIS < 40.00
    Dies wählt nur jene Zeilen aus, bei denen sowohl der Wert in A_NAME gleich 'Oberhemd' und der Wert in A_PREIS kleiner als 40.00 ist. Es wird nur die Zeile mit A_NR = 12 ausgewählt.
  5. WHERE A.A_NAME = 'Oberhemd' Or A.A_PREIS > 40.00
    Dies wählt jene Zeilen aus, bei denen der Wert in A_NAME gleich 'Oberhemd' oder der Wert in A_PREIS größer als 40.00 ist. Die einzigste Zeile, die einen Preis < 40.00 hat, beschreibt ein 'Oberhemd', so daß von dieser Abfrage alle vier Zeilen zurückgegeben werden.
  6. WHERE A.A_PREIS BETWEEN 39.8 AND 100.00
    Listet die beiden Zeilen auf, deren Preis zwischen 39.8 und 100.00 liegt. Die Randwerte werden mitgezählt, deshalb ist die Zeile A_NR = 12 im Ergebnis enthalten. Beachten Sie, daß das AND zum BETWEEN gehört und hier keine logische Bedeutung hat.
  7. WHERE 39.8 <= A.A_PREIS And A.A_PREIS <= 100
    Diese Version ist gleichwertig zur vorherigen Version.
  8. WHERE A.A_NAME IN ('Hose', 'Mantel', 'Strümpfe')
    Vergleicht den Wert von A_NAME mit jedem der in der Klammer angegebenen Werten. Stimmt er mit einem dieser überein, so wird die betreffende Zeile ausgegeben. Der Ausdruck ist gleichwertig zu
    WHERE A.A_NAME = 'Hose' OR
    	A.A_NAME = 'Mantel' OR
    	A.A_NAME = 'Strümpfe'
    Rechts kann, wie hier, eine Liste von Konstanten, berechneten Werten oder eine Unterabfrage notiert werden. Die Unterabfrage muß eine Spalte zurückliefern.
  9. WHERE 0 = 1
    oder
    WHERE FALSE
    Dieser Ausdruck liefert immer False zurück, es werden also keine Zeilen ausgewählt. Dies kann verwendet werden, falls nur die Spaltennamen gewünscht sind. Analog liefert 0 = 0 oder TRUE alle Zeilen zurück, so daß eine solche WHERE-Klausel redundant ist.
  10. Textvergleiche mit LIKE
    SELECT V.* FROM VERTRETER
    WHERE V.V_NAME LIKE 'Me_er, Franz'
    Mit LIKE können Zellen gegen Textmuster geprüft werden, ohne daß eine vollständige Übereinstimmung notwendig ist. Der Unterstrich (_) fungiert als Platzhalter für ein Zeichen, so daß der obige Ausdruck sowohl 'Meyer, Franz' als auch 'Meier, Franz' findet.
    WHERE A.V_NAME LIKE 'Me%'
    Das Prozentzeichen (%) schließt 0 bis mehrere Zeichen ein, so daß aus der Beispieldatenbank sowohl 'Meier, Franz' als auch 'Meyer, Emil' gefunden wird.
  11. Suche nach den Sonderzeichen '_' und '%': Wenn Sie nach diesen Sonderzeichen selbst suchen möchten, dann setzen Sie diese in eckige Klammern ([]). Damit wird die eckige Klammer selbst zum Sonderzeichen, so daß auch eine Suche nach einer eckigen Klammer den Einschluß erfordert. Ansonsten erlauben eckige Klammern das Angeben eines Bereiches. Beispiel:
    WHERE <Spaltenname> LIKE '%Tulpen[_]und[_]Zwiebeln%'
    findet 'Hier gibt es Tulpen_und_Zwiebeln', nicht jedoch 'Hier gibt es Tulpen-und-Zwiebeln'. Entfernt man die Eckklammern, werden beide Einträge ausgegeben.
    WHERE <Spaltenname> LIKE 'Mayer [5-7]'
    WHERE <Spaltenname> LIKE 'Mayer [567]'
    findet 'Mayer 5', 'Mayer 6', 'Mayer 7', nicht jedoch 'Mayer 8'
    WHERE <Spaltenname> LIKE 'Mayer [[]5]'
    findet 'Mayer [5]'
  12. Mit Exists prüfen, ob eine Unterabfrage Werte enthält:
    SELECT A.A_NR
    FROM ARTIKEL As A
    WHERE EXISTS
    	(SELECT B.UMSATZ_NR
    	FROM UMSATZ As B
    	WHERE B.A_NR = A.A_NR)
    
    Diese Abfrage liefert jene Artikel einmal (!) zurück, für die es Einträge in der Tabelle 'Umsatz' gibt. Diese Abfrage erzeugt dasselbe Ergebnis wie:
    SELECT DISTINCT A.A_NR
    FROM ARTIKEL As A INNER JOIN UMSATZ As U
    ON A.A_NR = U.A_NR
    Nur wird die letztere Abfrage in der Regel teurer sein, da zunächst alle passenden Zeilen gesucht und mehrfache Einträge anschließend mit DISTINCT entfernt werden. EXISTS bricht dagegen ab, falls bereits eine einzige Zeile gefunden wurde.

Bemerkungen


© 2003-2018 Jürgen Auer, Berlin.