I SQL er OR operatør giver dig mulighed for at bruge alternative betingelser, når du filtrerer dine forespørgsler.
OR operator kombinerer to betingelser og returnerer TRUE når en af betingelserne er TRUE .
Kildetabel
Følgende tabel bruges til eksemplerne på denne side.
SELECT * FROM Pets; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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)
Eksempel
Her er et simpelt eksempel til at demonstrere OR operatør.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Vi kan se, at den faktisk returnerede rækkerne med PetName kolonne var enten Fluffy eller Tweet . Ingen andre rækker blev returneret.
Forskellige kolonner
I det foregående eksempel sammenlignede begge betingelser værdier med den samme kolonne, men dette er ikke et krav. Udtrykkene på hver side af OR operatør kan bruge forskellige kolonner til at sammenligne værdier med. OR operatør vil blot returnere TRUE når en af disse betingelser er TRUE .
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Kombineret med andre operatører
Dine filtreringskriterier kan kombinere udtryk, der bruger andre operatorer ud over OR operatør.
Her er et eksempel, der inkluderer AND operatør.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20'; Resultat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Bemærk, at jeg omgav OR tilstand med parentes. Grunden til at jeg gjorde det var fordi, som standard, OR operatører evalueres efter AND operatører. SQL har en defineret rækkefølge af operatørerne i et udtryk, og dette dikterer, at AND operatoren evalueres før OR operatør.
Du kan dog bruge parenteser til at tilsidesætte den definerede forrang for operatorerne i et udtryk. Alt inden for parentes evalueres for at returnere en enkelt værdi. Denne værdi kan bruges af enhver operatør uden for disse parenteser.
Med andre ord kan du bruge parenteser til at angive den rækkefølge, som du ønsker, at hver logisk operator skal evalueres i et udtryk.
Hvorfor er dette et problem?
Tag et kig på resultaterne, når vi fjerner parenteserne.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Vi får faktisk et andet resultat.
Dette skyldes, at forespørgslen nu tjekker PetName = 'Tweet' AND DOB >= '2020-11-20' først og derefter tjekker OR udtryk PetName = 'Fluffy' .
Det er, som om vi ville sætte parenteser omkring AND udtryk som dette:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20'); Men for at forvirre tingene endnu mere, kunne vi omarrangere vores forespørgsel, så vi ikke bruger parenteser, og alligevel får det samme resultat som vores første eksempel med parenteser.
Sådan:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet'; Resultat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
I dette tilfælde er AND udtryk blev evalueret først, som forventet. Rækkefølgen af udtrykkene kom lige på linje, så DOB >= '2020-11-20' AND PetName = 'Fluffy' blev evalueret først, så vi udelukkede det andet kæledyr kaldet Fluffy på grund af dets DOB falder uden for dette område. Først efter det var OR udtryk evalueret som en alternativ betingelse til vores eksisterende AND resultat.
Moralen i denne historie? Brug parenteser, når du bruger flere operatorer. På den måde kan du angive den nøjagtige rækkefølge, som du ønsker, at hvert udtryk skal evalueres i.