sql >> Databasteknik >  >> RDS >> Database

SQL ELLER Operator för nybörjare

I SQL, OR operatorn låter dig använda alternativa villkor när du filtrerar dina frågor.

OR operatorn kombinerar två villkor och returnerar TRUE när något av villkoren ä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 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 att det verkligen returnerade raderna där PetName kolumnen var antingen Fluffy eller Tweet . Inga andra rader returnerades.

Olika kolumner

I det föregående exemplet jämförde båda villkoren värden mot samma kolumn, men detta är inte ett krav. Uttrycken på vardera sidan av OR operatör kan använda olika kolumner för att jämföra värden mot. OR operatören returnerar helt enkelt TRUE när något av dessa villkor är 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 |
+---------+-------------+-----------+-----------+------------+

Kombinerat med andra operatörer

Dina filtreringskriterier kan kombinera uttryck som använder andra operatorer utöver OR operatör.

Här är ett exempel som inkluderar 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 |
+---------+-------------+-----------+-----------+------------+

Lägg märke till att jag omgav OR skick med parentes. Anledningen till att jag gjorde det var för att, som standard, OR operatorer utvärderas efter AND 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.

Varför är detta ett problem?

Ta en titt på resultatet när vi tar bort parenteserna.

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 faktiskt 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.

Moralen i denna berättelse? Använd parenteser när du använder flera operatorer. På så sätt kan du ange den exakta ordningen i vilken du vill att varje uttryck ska utvärderas.


  1. Övervakning av tillgänglighet Grupprepliksynkronisering

  2. Mysql-behörighetsfel med "ladda data"

  3. hur man kommer åt kommandoraden för xampp på Windows

  4. Motsvarighet till varchar(max) i MySQL?