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

Operatore SQL OR per principianti

In SQL, il OR operatore consente di utilizzare condizioni alternative durante il filtraggio delle query.

Il OR l'operatore combina due condizioni e restituisce TRUE quando una delle condizioni è 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 OR operatore.

SELECT * FROM Pets 
WHERE 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 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
+---------+-------------+-----------+-----------+------------+

Possiamo vedere che ha effettivamente restituito le righe in cui PetName la colonna era Fluffy o Tweet . Non sono state restituite altre righe.

Diverse colonne

Nell'esempio precedente, entrambe le condizioni stavano confrontando i valori con la stessa colonna, ma questo non è un requisito. Le espressioni su entrambi i lati di OR l'operatore può utilizzare colonne diverse per confrontare i valori. Il OR l'operatore restituirà semplicemente TRUE quando una di queste condizioni è TRUE .

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

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 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
+---------+-------------+-----------+-----------+------------+

Combinato con altri operatori

I tuoi criteri di filtro possono combinare espressioni che utilizzano altri operatori oltre a OR operatore.

Ecco un esempio che include AND 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. Il motivo per cui l'ho fatto è perché, per impostazione predefinita, OR gli operatori vengono valutati dopo AND 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.

Perché è un 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 |
+---------+-------------+-----------+-----------+------------+

In realtà 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.

la morale di questa storia? Utilizzare le parentesi quando si utilizzano più operatori. In questo modo puoi specificare l'ordine esatto in cui desideri che ogni espressione venga valutata.