SELECT ... FROM ... WHERE <Bedingung 1> [<logischer Operator> <Bedingung 2>]Es kann entweder nur eine Bedingung geben. Oder es werden mehrere Bedingungen angegeben, welche mit logischen Operatoren (NOT, AND, OR) miteinander verknüpft sind.
= | Gleichheit |
<> | verschieden |
< | kleiner |
> | größer |
<= | kleiner oder gleich |
>= | größer oder gleich |
IS NULL | prüft, ob die Zelle leer ist |
IS NOT NULL | prüft, ob die Zelle einen Wert enthält |
Between | Zwischen zwei Werten liegend |
In | prüft, ob der linke Ausdruck in einem der rechten vorkommt |
Like | Vergleich auf Textmuster |
Exists | prüft, ob die folgende Unterabfrage mindestens eine Zeile zurückliefert |
NOT | der folgende Ausdruck darf nicht erfüllt sein |
AND | beide Bedingungen müssen erfüllt sein |
OR | mindestens eine Bedingung muß erfüllt sein |
Select A.* FROM ARTIKEL As A WHERE A.A_NR = 11Wählt die Zeile aus, bei welcher die Zelle A_NR den Wert 11 hat. Hier ist eine Bedingung und kein logischer Operator angegeben.
WHERE NOT A.A_NR = 11 WHERE A.A_NR <> 11Wählt alle Zeilen aus, deren A_NR verschieden von 11 und nicht leer (Not Null) ist.
WHERE A_PREIS IS NULLWä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.
WHERE A.A_NAME = 'Oberhemd' And A.A_PREIS < 40.00Dies 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.
WHERE A.A_NAME = 'Oberhemd' Or A.A_PREIS > 40.00Dies 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.
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.WHERE 39.8 <= A.A_PREIS And A.A_PREIS <= 100Diese Version ist gleichwertig zur vorherigen Version.
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.
WHERE 0 = 1oder
WHERE FALSEDieser 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.
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.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]'
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_NRNur 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.
WHERE V.V_Name = 'O''Neil'findet
O'Neil
WHERE A.A_PREIS = 10.00 ... UNION ... WHERE A.A_PREIS <> 10.00liefert alle Zeilen mit Preis, jedoch nicht jene Artikel, für die kein Preis definiert ist, bei welchen die A_PREIS-Zelle leer ist. Denn bei einer leeren Zelle kann keine der obigen Bedingungen positiv geprüft werden.
SELECT A.* FROM ARTIKEL AS A WHERE A.A_NAME = 'Hose' UNION SELECT A.* FROM ARTIKEL AS A WHERE NOT A.A_NAME = 'Hose'Im Rahmen von jedem Logik-Kurs wird Ihnen mitgeteilt, daß diese Abfrage sämtliche Zeilen liefert, hier also 4 Zeilen ausgibt. Löschen Sie anschließend testweise eine Zelle der Spalte A_NAME, etwa eine Zelle mit dem Wert 'Oberhemd'. Löschen Sie nur die Zelle, nicht die Zeile. Führen Sie anschließend die Abfrage erneut aus, so werden Sie nur drei Ergebniszeilen erhalten.
A_NAME = 11 Or A_PREIS > 100wie gewünscht interpretiert wird:
(A_NAME = 11) Or (A_PREIS > 100)Verwenden Sie verschiedene logische Operatoren in einem WHERE-Ausdruck, so nutzen Sie am besten Klammern. Dies ist für jeden, der den Code später bearbeitet und die genaue Operator-Reihenfolge nicht weiß, die sicherste Lösung, damit sich nicht unbeabsichtigte Fehler einschleichen.
Betrachten Sie den folgenden Ausdruck:
WHERE A.A_NR BETWEEN 11 AND 10 OR 15
Der erste Ausdruck ist für A_NR = 11 zumindest für Access in Sql-Interaktiv-lernen erfüllt, so daß mit
einem Datensatz zu rechnen wäre. Da AND stärker bindet als OR und AND zu BETWEEN gehört, wird der Ausdruck
tatsächlich jedoch so ausgewertet:
WHERE (A.A_NR BETWEEN 11 AND 10) OR (15)
Der Ausdruck (15) ist verschieden von 0, damit in den meisten Datenbank-Systemen wahr. Also handelt
es sich um eine Konstante, so daß alle Zeilen ausgegeben werden.
<Spaltenname> = <Wert>kann rechts auch entweder ein anderer Spaltenname oder eine eigenständige in Klammern stehende Select-Abfrage angegeben werden. Diese muß genau eine Zelle zurückliefern. Ebenso kann bei einem Ausdruck der Form
<Spaltenname> IN (<Unterabfrage mit einer Spalte>)eine Unterabfrage eingesetzt werden, die genau eine Spalte zurückliefert. Beispiele hierzu finden Sie im Abschnitt zu Unterabfragen.
If (Exists (Select A.Table_Name From Information_Schema.Tables As A Where A.Table_Name = 'Artikel') ) Drop Table ArtikelDiese Technik ist jedem Group By bzw. Count(*) vorzuziehen, etwa dem folgenden Code:
If ((Select Count(*) From Information_Schema.Tables As A Where A.Table_Name = 'Artikel') > 0) Drop Table Artikel