sql >> Database >  >> RDS >> Database

SQL OR-operator voor beginners

In SQL is de OR operator stelt u in staat alternatieve voorwaarden te gebruiken bij het filteren van uw zoekopdrachten.

De OR operator combineert twee voorwaarden en retourneert TRUE wanneer een van de voorwaarden TRUE . is .

Brontabel

De volgende tabel wordt gebruikt voor de voorbeelden op deze pagina.

SELECT * FROM Pets;

Resultaat:

+---------+-------------+-----------+-----------+------------+
| 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)

Voorbeeld

Hier is een eenvoudig voorbeeld om de OR . te demonstreren telefoniste.

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';

Resultaat:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

We kunnen zien dat het inderdaad de rijen retourneerde waar de PetName kolom was ofwel Fluffy of Tweet . Er zijn geen andere rijen geretourneerd.

Verschillende kolommen

In het vorige voorbeeld vergeleken beide voorwaarden waarden met dezelfde kolom, maar dit is geen vereiste. De uitdrukkingen aan weerszijden van de OR operator kan verschillende kolommen gebruiken om waarden mee te vergelijken. De OR operator retourneert gewoon TRUE wanneer een van deze voorwaarden TRUE . is .

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';

Resultaat:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

Gecombineerd met andere operators

Uw filtercriteria kunnen uitdrukkingen combineren die andere operators gebruiken naast de OR exploitant.

Hier is een voorbeeld met de AND telefoniste.

SELECT * FROM Pets 
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';

Resultaat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
+---------+-------------+-----------+-----------+------------+

Merk op dat ik de OR . omsingelde voorwaarde met haakjes. De reden dat ik dat deed was omdat, standaard, OR operatoren worden geëvalueerd na AND exploitanten. SQL heeft een gedefinieerde prioriteitsvolgorde van de operators in een expressie, en dit dicteert dat de AND operator wordt geëvalueerd vóór de OR exploitant.

U kunt echter haakjes gebruiken om de gedefinieerde prioriteit van de operators in een uitdrukking te overschrijven. Alles tussen haakjes wordt geëvalueerd om één waarde te retourneren. Die waarde kan door elke operator buiten die haakjes worden gebruikt.

Met andere woorden, u kunt haakjes gebruiken om de volgorde aan te geven waarin u wilt dat elke logische operator in een uitdrukking wordt geëvalueerd.

Waarom is dit een probleem?

Bekijk de resultaten wanneer we de haakjes verwijderen.

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';

Resultaat:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

We krijgen eigenlijk een ander resultaat.

Dit komt omdat de zoekopdracht nu PetName = 'Tweet' AND DOB >= '2020-11-20' controleert controleert eerst de OR expressie PetName = 'Fluffy' .

Het is alsof we haakjes rond de AND . plaatsen uitdrukking, zoals deze:

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');

Om de zaken nog meer in de war te brengen, zouden we onze zoekopdracht kunnen herschikken zodat we geen haakjes gebruiken en toch hetzelfde resultaat krijgen als ons eerste voorbeeld met haakjes.

Zoals dit:

SELECT * FROM Pets 
WHERE DOB >= '2020-11-20' 
AND PetName = 'Fluffy' OR PetName = 'Tweet';

Resultaat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
+---------+-------------+-----------+-----------+------------+

In dit geval is de AND expressie werd eerst geëvalueerd, zoals verwacht. De volgorde van de uitdrukkingen is toevallig zo uitgelijnd dat DOB >= '2020-11-20' AND PetName = 'Fluffy' werd als eerste geëvalueerd, dus we hebben het andere huisdier met de naam Fluffy uitgesloten vanwege zijn DOB buiten dat bereik vallen. Pas daarna was de OR uitdrukking geëvalueerd als een alternatieve voorwaarde voor onze bestaande AND resultaat.

De moraal van dit verhaal? Gebruik haakjes als u meerdere operators gebruikt. Op die manier kunt u de exacte volgorde specificeren waarin u elke uitdrukking wilt laten evalueren.


  1. JSON_PRETTY() – Formatteer JSON-documenten voor betere leesbaarheid in MySQL

  2. Een Java-toepassing maken in Oracle JDeveloper, deel 2

  3. MONTHNAME() Voorbeelden – MySQL

  4. Een overzicht van de Percona XtraDB Cluster Kubernetes-operator