I SQL, AND
operatorn låter dig söka efter flera villkor när du filtrerar dina frågor.
AND
operatorn kombinerar två booleska uttryck och returnerar TRUE
när båda uttrycken är TRUE
.
Källtabell
Följande tabell används för exemplen på den här sidan.
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)
Exempel
Här är ett enkelt exempel för att demonstrera 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 förväntat returnerade den bara de rader där både PetName
kolumnen var Fluffy
och DOB
kolumnen var större än 2020-11-01
.
I det här fallet matchade bara en rad det kriteriet, och därför returnerades endast en rad.
Kombinerat med andra operatörer
Dina filtreringskriterier kan kombinera uttryck som använder andra operatorer utöver AND
operatör.
Här är ett exempel som inkluderar 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 | +---------+-------------+-----------+-----------+------------+
Lägg märke till att jag omgav OR
skick med parentes. Jag gjorde det för att ange i vilken ordning varje uttryck skulle utvärderas.,
Som standard är AND
operatorer utvärderas före OR
operatörer. SQL har en definierad prioritetsordning för operatorerna i ett uttryck, och detta dikterar att AND
operatorn utvärderas före OR
operatör.
Du kan dock använda parenteser för att åsidosätta den definierade prioriteringen av operatorerna i ett uttryck. Allt inom parentes utvärderas för att returnera ett enda värde. Det värdet kan användas av alla operatorer utanför dessa parenteser.
Med andra ord kan du använda parenteser för att ange i vilken ordning du vill att varje logisk operator ska utvärderas i ett uttryck.
Ta en titt på resultaten när vi tar bort parenteserna för att visa problemet.
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 ett annat resultat.
Detta beror på att frågan nu kontrollerar PetName = 'Tweet' AND DOB >= '2020-11-20'
först, kontrollerar sedan OR
uttryck PetName = 'Fluffy'
.
Det är som om vi skulle sätta parenteser runt AND
uttryck, så här:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Men för att förvirra saker ännu mer kan vi ordna om vår fråga så att vi inte använder parenteser och ändå får samma resultat som vårt första exempel med parenteser.
Så här:
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 det här fallet, AND
uttrycket utvärderades först, som förväntat. Ordningen på uttrycken råkade just hamna så att DOB >= '2020-11-20' AND PetName = 'Fluffy'
utvärderades först, så vi uteslöt det andra husdjuret som heter Fluffy på grund av dess DOB
faller utanför det intervallet. Först efter det var OR
uttryck som utvärderas som ett alternativt villkor till vår befintliga AND
resultat.
Därför rekommenderas det starkt att använda parenteser när du använder flera operatorer. Genom att göra detta säkerställer du att frågan utvärderas på exakt det sätt du tänkt dig.