sql >> Database teknologi >  >> RDS >> Database

SQL OR Operator for begyndere

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.


  1. Komplet brugerregistreringssystem ved hjælp af PHP og MySQL database

  2. Eksempler på konvertering af 'tid' til 'datetime' i SQL Server (T-SQL)

  3. Hvordan opretter man en ny database efter den første installation af oracle database 11g Express Edition?

  4. Hvordan forespørger man efter XML-værdier og attributter fra tabel i SQL Server?