Database
 sql >> Datenbank >  >> RDS >> Database

SQL-ODER-Operator für Anfänger

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.