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

SQL OG Operator for begyndere

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.


  1. Vil du slette flere rækker ved hjælp af id'er?

  2. Brug sammensat primærnøgle som fremmednøgle

  3. Hvordan får man en liste over måneder mellem 2 givne datoer ved hjælp af en forespørgsel?

  4. SQL SERVER – Et trick til at håndtere dynamisk SQL for at undgå SQL-injektionsangreb?