V SQL, AND
Operátor umožňuje kontrolovat více podmínek při filtrování vašich dotazů.
AND
operátor kombinuje dva booleovské výrazy a vrací TRUE
když jsou oba výrazy 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 demonstrující AND
operátor.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' AND DOB > '2020-11-01';
Výsledek:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | +---------+-------------+-----------+-----------+------------+
Podle očekávání vrátil pouze ty řádky, kde je PetName
sloupec byl Fluffy
a DOB
sloupec byl větší než 2020-11-01
.
V tomto případě tomuto kritériu odpovídal pouze jeden řádek, a proto byl vrácen pouze jeden řádek.
V kombinaci s jinými operátory
Vaše kritéria filtrování mohou kombinovat výrazy, které kromě AND
používají další operátory operátor.
Zde je příklad, který obsahuje OR
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. Udělal jsem to, abych určil pořadí, ve kterém by měl být každý výraz vyhodnocen.,
Ve výchozím nastavení AND
operátory se vyhodnocují před OR
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.
Chcete-li tento problém demonstrovat, 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 | +---------+-------------+-----------+-----------+------------+
Nyní 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.
Proto se při použití více operátorů důrazně doporučuje používat závorky. Tím zajistíte, že dotaz bude vyhodnocen přesně tak, jak jste zamýšleli.