In SQL das OR
Mit dem Operator können Sie beim Filtern Ihrer Abfragen alternative Bedingungen verwenden.
Das OR
-Operator kombiniert zwei Bedingungen und gibt TRUE
zurück wenn eine der Bedingungen TRUE
ist .
Quelltabelle
Die folgende Tabelle wird für die Beispiele auf dieser Seite verwendet.
SELECT * FROM Pets;
Ergebnis:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Beispiel
Hier ist ein einfaches Beispiel, um das OR
zu demonstrieren Betreiber.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';
Ergebnis:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Wir können sehen, dass es tatsächlich die Zeilen zurückgegeben hat, in denen PetName
Spalte war entweder Fluffy
oder Tweet
. Es wurden keine anderen Zeilen zurückgegeben.
Unterschiedliche Spalten
Im vorherigen Beispiel verglichen beide Bedingungen Werte mit derselben Spalte, aber dies ist keine Voraussetzung. Die Ausdrücke auf beiden Seiten des OR
Operator kann verschiedene Spalten verwenden, um Werte zu vergleichen. Das OR
Der Operator gibt einfach TRUE
zurück wenn eine dieser Bedingungen TRUE
ist .
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';
Ergebnis:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Kombiniert mit anderen Operatoren
Ihre Filterkriterien können Ausdrücke kombinieren, die zusätzlich zum OR
andere Operatoren verwenden Operator.
Hier ist ein Beispiel, das das AND
enthält Betreiber.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
Ergebnis:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Beachten Sie, dass ich das OR
eingeschlossen habe Bedingung mit Klammern. Der Grund, warum ich das getan habe, war, dass standardmäßig OR
Operatoren werden nach AND
ausgewertet Betreiber. SQL hat eine definierte Rangfolge der Operatoren in einem Ausdruck, und dies schreibt vor, dass AND
Operator wird vor dem OR
ausgewertet Operator.
Sie können jedoch Klammern verwenden, um die definierte Rangfolge der Operatoren in einem Ausdruck zu überschreiben. Alles in Klammern wird ausgewertet, um einen einzelnen Wert zurückzugeben. Dieser Wert kann von jedem Operator außerhalb dieser Klammern verwendet werden.
Mit anderen Worten, Sie können Klammern verwenden, um die Reihenfolge anzugeben, in der jeder logische Operator in einem Ausdruck ausgewertet werden soll.
Warum ist das ein Problem?
Sehen Sie sich die Ergebnisse an, wenn wir die Klammern entfernen.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
Ergebnis:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Wir kommen tatsächlich zu einem anderen Ergebnis.
Dies liegt daran, dass die Abfrage jetzt PetName = 'Tweet' AND DOB >= '2020-11-20'
prüft zuerst, überprüft dann das OR
Ausdruck PetName = 'Fluffy'
.
Es ist, als ob wir das AND
in Klammern setzen würden Ausdruck, etwa so:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Um die Dinge jedoch noch mehr zu verwirren, könnten wir unsere Abfrage so umstellen, dass wir keine Klammern verwenden, und dennoch dasselbe Ergebnis wie unser erstes Beispiel mit Klammern erhalten.
So:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
Ergebnis:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
In diesem Fall das AND
expression wurde wie erwartet zuerst ausgewertet. Die Reihenfolge der Ausdrücke stimmte zufällig so überein, dass DOB >= '2020-11-20' AND PetName = 'Fluffy'
wurde zuerst bewertet, also haben wir das andere Haustier namens Fluffy aufgrund seines DOB
ausgeschlossen außerhalb dieses Bereichs fallen. Erst danach kam das OR
Ausdruck, der als alternative Bedingung zu unserem bestehenden AND
ausgewertet wird Ergebnis.
Die Moral dieser Geschichte? Verwenden Sie Klammern, wenn Sie mehrere Operatoren verwenden. Auf diese Weise können Sie die genaue Reihenfolge angeben, in der jeder Ausdruck ausgewertet werden soll.