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.