In SQL, il AND
operatore ti consente di verificare la presenza di più condizioni durante il filtraggio delle query.
Il AND
combina due espressioni booleane e restituisce TRUE
quando entrambe le espressioni sono TRUE
.
Tabella delle sorgenti
La tabella seguente viene utilizzata per gli esempi in questa pagina.
SELECT * FROM Pets;
Risultato:
+---------+-------------+-----------+-----------+------------+ | 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)
Esempio
Ecco un semplice esempio per dimostrare il AND
operatore.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' AND DOB > '2020-11-01';
Risultato:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | +---------+-------------+-----------+-----------+------------+
Come previsto, ha restituito solo quelle righe in cui è presente sia il PetName
la colonna era Fluffy
e il DOB
la colonna era maggiore di 2020-11-01
.
In questo caso, solo una riga corrispondeva a quel criterio e, pertanto, è stata restituita solo una riga.
Combinato con altri operatori
I tuoi criteri di filtro possono combinare espressioni che utilizzano altri operatori oltre a AND
operatore.
Ecco un esempio che include OR
operatore.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
Risultato:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Nota che ho circondato OR
condizione tra parentesi. L'ho fatto per specificare l'ordine in cui ogni espressione dovrebbe essere valutata.,
Per impostazione predefinita, AND
gli operatori vengono valutati prima di OR
operatori. SQL ha un ordine di precedenza definito degli operatori in un'espressione, e questo impone che il AND
l'operatore viene valutato prima di OR
operatore.
Tuttavia, puoi utilizzare le parentesi per ignorare la precedenza definita degli operatori in un'espressione. Tutto ciò che è racchiuso tra parentesi viene valutato per restituire un singolo valore. Tale valore può essere utilizzato da qualsiasi operatore al di fuori di tali parentesi.
In altre parole, puoi utilizzare le parentesi per specificare l'ordine in cui desideri che ogni operatore logico venga valutato in un'espressione.
Per dimostrare questo problema, dai un'occhiata ai risultati quando rimuoviamo le parentesi.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
Risultato:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Ora otteniamo un risultato diverso.
Questo perché la query ora controlla PetName = 'Tweet' AND DOB >= '2020-11-20'
prima, quindi controlla OR
espressione PetName = 'Fluffy'
.
È come se inserissimo le parentesi attorno a AND
espressione, come questa:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Tuttavia, per confondere ulteriormente le cose, potremmo riorganizzare la nostra query in modo da non usare parentesi e ottenere comunque lo stesso risultato del nostro primo esempio con parentesi.
In questo modo:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
Risultato:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
In questo caso, il AND
l'espressione è stata valutata per prima, come previsto. L'ordine delle espressioni si è appena allineato in modo che DOB >= '2020-11-20' AND PetName = 'Fluffy'
è stato valutato per primo, quindi abbiamo escluso l'altro animale domestico chiamato Fluffy a causa del suo DOB
cadendo al di fuori di tale intervallo. Solo dopo è stato il OR
espressione valutata come condizione alternativa al nostro AND
esistente risultato.
Pertanto, si consiglia vivamente di utilizzare le parentesi quando si utilizzano più operatori. In questo modo si garantisce che la query venga valutata esattamente nel modo previsto.