Database
 sql >> Base de données >  >> RDS >> Database

Opérateur SQL OR pour les débutants

En SQL, le OR vous permet d'utiliser des conditions alternatives lors du filtrage de vos requêtes.

Le OR l'opérateur combine deux conditions et renvoie TRUE lorsque l'une des conditions est TRUE .

Tableau des sources

Le tableau suivant est utilisé pour les exemples sur cette page.

SELECT * FROM Pets;

Résultat :

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

Exemple

Voici un exemple simple pour démontrer le OR opérateur.

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

Résultat :

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

Nous pouvons voir qu'il a bien renvoyé les lignes où le PetName la colonne était soit Fluffy ou Tweet . Aucune autre ligne n'a été renvoyée.

Différentes colonnes

Dans l'exemple précédent, les deux conditions comparaient des valeurs à la même colonne, mais ce n'est pas obligatoire. Les expressions de part et d'autre du OR L'opérateur peut utiliser différentes colonnes pour comparer les valeurs. Le OR l'opérateur renverra simplement TRUE lorsque l'une de ces conditions est TRUE .

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

Résultat :

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

Combiné avec d'autres opérateurs

Vos critères de filtrage peuvent combiner des expressions qui utilisent d'autres opérateurs en plus du OR opérateur.

Voici un exemple qui inclut le AND opérateur.

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

Résultat :

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

Remarquez que j'ai entouré le OR condition entre parenthèses. La raison pour laquelle je l'ai fait est que, par défaut, OR les opérateurs sont évalués après AND les opérateurs. SQL a un ordre de priorité défini des opérateurs dans une expression, et cela dicte que le AND l'opérateur est évalué avant le OR opérateur.

Cependant, vous pouvez utiliser des parenthèses pour remplacer la priorité définie des opérateurs dans une expression. Tout ce qui se trouve entre parenthèses est évalué pour renvoyer une valeur unique. Cette valeur peut être utilisée par n'importe quel opérateur en dehors de ces parenthèses.

En d'autres termes, vous pouvez utiliser des parenthèses pour spécifier l'ordre dans lequel vous souhaitez que chaque opérateur logique soit évalué dans une expression.

Pourquoi est-ce un problème ?

Jetez un œil aux résultats lorsque nous supprimons les parenthèses.

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

Résultat :

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

Nous obtenons en fait un résultat différent.

En effet, la requête vérifie maintenant PetName = 'Tweet' AND DOB >= '2020-11-20' d'abord, puis vérifie le OR expression PetName = 'Fluffy' .

C'est comme si on mettait des parenthèses autour du AND expression, comme ceci :

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

Cependant, pour confondre encore plus les choses, nous pourrions réorganiser notre requête afin de ne pas utiliser de parenthèses, tout en obtenant toujours le même résultat que notre premier exemple avec des parenthèses.

Comme ceci :

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

Résultat :

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

Dans ce cas, le AND l'expression a été évaluée en premier, comme prévu. L'ordre des expressions s'est simplement aligné de sorte que DOB >= '2020-11-20' AND PetName = 'Fluffy' a été évalué en premier, nous avons donc exclu l'autre animal appelé Fluffy en raison de sa DOB tombant en dehors de cette plage. Ce n'est qu'après cela que le OR expression évaluée comme une condition alternative à notre AND existant résultat.

La morale de cette histoire? Utilisez des parenthèses lorsque vous utilisez plusieurs opérateurs. De cette façon, vous pouvez spécifier l'ordre exact dans lequel vous souhaitez que chaque expression soit évaluée.