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.