I SQL er AND
operatør giver dig mulighed for at kontrollere for flere betingelser, når du filtrerer dine forespørgsler.
AND
operatoren kombinerer to booleske udtryk og returnerer TRUE
når begge udtryk 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 AND
operatør.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' AND DOB > '2020-11-01';
Resultat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | +---------+-------------+-----------+-----------+------------+
Som forventet returnerede den kun de rækker, hvor både PetName
kolonnen var Fluffy
og DOB
kolonne var større end 2020-11-01
.
I dette tilfælde matchede kun én række dette kriterium, og derfor blev der kun returneret én række.
Kombineret med andre operatører
Dine filtreringskriterier kan kombinere udtryk, der bruger andre operatorer ud over AND
operatør.
Her er et eksempel, der inkluderer OR
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. Jeg gjorde det for at specificere den rækkefølge, som hvert udtryk skulle evalueres i.,
Som standard er AND
operatører evalueres før OR
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.
For at demonstrere dette 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 | +---------+-------------+-----------+-----------+------------+
Nu får vi 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.
Derfor anbefales det stærkt at bruge parenteser, når du bruger flere operatorer. Ved at gøre dette sikrer du, at forespørgslen bliver evalueret på præcis den måde, du havde tænkt dig at være.