sql >> Databasteknik >  >> RDS >> Database

SQL OCH Operator för nybörjare

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.


  1. Accelererad databasåterställning i SQL Server 2019

  2. Hur MONTHNAME() fungerar i MariaDB

  3. Hur tolkar du en frågas förklara plan?

  4. Hur kan jag kombinera flera rader till en kommaavgränsad lista i Oracle?