sql >> Base de Datos >  >> RDS >> Database

Operador SQL OR para principiantes

En SQL, el OR operador le permite utilizar condiciones alternativas al filtrar sus consultas.

El OR El operador combina dos condiciones y devuelve TRUE cuando cualquiera de las condiciones es TRUE .

Tabla de origen

La siguiente tabla se utiliza para los ejemplos de esta página.

SELECT * FROM Pets;

Resultado:

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

Ejemplo

Aquí hay un ejemplo simple para demostrar el OR operador.

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

Resultado:

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

Podemos ver que de hecho devolvió las filas donde PetName la columna era Fluffy o Tweet . No se devolvieron otras filas.

Columnas diferentes

En el ejemplo anterior, ambas condiciones comparaban valores con la misma columna, pero esto no es un requisito. Las expresiones a ambos lados del OR El operador puede usar diferentes columnas para comparar valores. El OR el operador simplemente devolverá TRUE cuando cualquiera de esas condiciones es TRUE .

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

Resultado:

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

Combinado con otros operadores

Sus criterios de filtrado pueden combinar expresiones que usan otros operadores además del OR operador.

Aquí hay un ejemplo que incluye AND operador.

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

Resultado:

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

Observe que rodeé el OR condición entre paréntesis. La razón por la que lo hice fue porque, de forma predeterminada, OR los operadores se evalúan después de AND operadores. SQL tiene un orden definido de precedencia de los operadores en una expresión, y esto dicta que AND el operador se evalúa antes que el OR operador.

Sin embargo, puede usar paréntesis para anular la precedencia definida de los operadores en una expresión. Todo lo que está entre paréntesis se evalúa para devolver un solo valor. Ese valor puede ser utilizado por cualquier operador fuera de esos paréntesis.

En otras palabras, puede usar paréntesis para especificar el orden en el que desea que se evalúe cada operador lógico en una expresión.

¿Por qué es esto un problema?

Eche un vistazo a los resultados cuando eliminamos los paréntesis.

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

Resultado:

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

De hecho, obtenemos un resultado diferente.

Esto se debe a que la consulta ahora verifica PetName = 'Tweet' AND DOB >= '2020-11-20' primero, luego verifica el OR expresión PetName = 'Fluffy' .

Es como si pusiéramos entre paréntesis el AND expresión, así:

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

Sin embargo, para confundir aún más las cosas, podríamos reorganizar nuestra consulta para que no usemos paréntesis y aún así obtener el mismo resultado que nuestro primer ejemplo con paréntesis.

Así:

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

Resultado:

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

En este caso, el AND expresión se evaluó primero, como se esperaba. El orden de las expresiones simplemente se alineó para que DOB >= '2020-11-20' AND PetName = 'Fluffy' se evaluó primero, por lo que excluimos a la otra mascota llamada Fluffy debido a su DOB cayendo fuera de ese rango. Solo después de eso, fue el OR expresión evaluada como una condición alternativa a nuestro AND existente resultado.

La moraleja de esta historia? Utilice paréntesis cuando utilice varios operadores. De esa manera, puede especificar el orden exacto en el que desea que se evalúe cada expresión.