sql >> Databáze >  >> RDS >> Database

SQL OR operátor pro začátečníky

V SQL, OR operátor vám umožňuje používat alternativní podmínky při filtrování vašich dotazů.

OR operátor kombinuje dvě podmínky a vrací TRUE když je některá z podmínek TRUE .

Tabulka zdrojů

Následující tabulka je použita pro příklady na této stránce.

SELECT * FROM Pets;

Výsledek:

+---------+-------------+-----------+-----------+------------+
| 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)

Příklad

Zde je jednoduchý příklad pro demonstraci OR operátor.

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';

Výsledek:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

Vidíme, že skutečně vrátila řádky s PetName sloupec byl buď Fluffy nebo Tweet . Nebyly vráceny žádné další řádky.

Různé sloupce

V předchozím příkladu obě podmínky porovnávaly hodnoty se stejným sloupcem, ale není to podmínkou. Výrazy na obou stranách OR operátor může použít různé sloupce k porovnání hodnot. OR operátor jednoduše vrátí TRUE když je některá z těchto podmínek TRUE .

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';

Výsledek:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

V kombinaci s jinými operátory

Vaše kritéria filtrování mohou kombinovat výrazy, které kromě OR používají další operátory operátor.

Zde je příklad, který obsahuje AND operátor.

SELECT * FROM Pets 
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';

Výsledek:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
+---------+-------------+-----------+-----------+------------+

Všimněte si, že jsem obklopil OR podmínka se závorkami. Důvod, proč jsem to udělal, byl, že ve výchozím nastavení OR operátory se vyhodnocují po AND operátory. SQL má definované pořadí priority operátorů ve výrazu a to určuje, že AND operátor je vyhodnocen před OR operátor.

Můžete však použít závorky k přepsání definované priority operátorů ve výrazu. Vše v závorkách je vyhodnoceno tak, aby vrátilo jedinou hodnotu. Tuto hodnotu může použít jakýkoli operátor mimo tyto závorky.

Jinými slovy, pomocí závorek můžete určit pořadí, ve kterém chcete, aby byly jednotlivé logické operátory ve výrazu vyhodnoceny.

Proč je to problém?

Podívejte se na výsledky, když odstraníme závorky.

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';

Výsledek:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

Ve skutečnosti dostáváme jiný výsledek.

Důvodem je, že dotaz nyní kontroluje PetName = 'Tweet' AND DOB >= '2020-11-20' nejprve a poté zkontroluje OR výraz PetName = 'Fluffy' .

Je to, jako bychom kolem AND umístili závorky výraz, jako je tento:

SELECT * FROM Pets 
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');

Abychom však věci ještě více zmátli, mohli bychom změnit uspořádání našeho dotazu tak, abychom nepoužívali závorky, a přesto jsme získali stejný výsledek jako náš první příklad se závorkami.

Takhle:

SELECT * FROM Pets 
WHERE DOB >= '2020-11-20' 
AND PetName = 'Fluffy' OR PetName = 'Tweet';

Výsledek:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
+---------+-------------+-----------+-----------+------------+

V tomto případě AND výraz byl podle očekávání vyhodnocen jako první. Pořadí výrazů se právě seřadilo tak, že DOB >= '2020-11-20' AND PetName = 'Fluffy' byl hodnocen jako první, takže jsme vyloučili druhého mazlíčka jménem Fluffy kvůli jeho DOB spadající mimo tento rozsah. Teprve poté byl OR výraz vyhodnocen jako alternativní podmínka k našemu stávajícímu AND výsledek.

Morálka tohoto příběhu? Při použití více operátorů použijte závorky. Tímto způsobem můžete určit přesné pořadí, ve kterém chcete, aby byl každý výraz vyhodnocen.


  1. Jak získat záznamy z posledních 24 hodin v MySQL

  2. SQLite - Vytvořte vztah

  3. Udělit výběr u všech stolů vlastněných konkrétním uživatelem

  4. Vytvoření virtuálního počítače pomocí virtuálního boxu Oracle VM