Habrá ocasiones en las que al filtrar registros necesitemos que cumplan con más de una condición. Para estas ocasiones podemos utilizar AND / OR.
AND
AND se utiliza cuando se quiere que ambas condiciones se cumplan.
Si un registro únicamente cumple alguna de las dos condiciones no es tomado en cuenta.
-- Referencia del uso de AND
-- SELECT * FROM tabla WHERE condicion1 AND condicion2;
-- cada condición está dada por una columna un operador y un valor
-- Seleccionar todos los datos
-- de la tabla usuarios
-- donde el valor en la columna email
-- contenga el término reichel
-- y que el valor en la columna rol_id
-- no sea NULL
SELECT * FROM usuarios
WHERE email LIKE "%reichel%"
AND rol_id IS NOT NULL;
OR
OR se utiliza cuando se quiere que cualquiera de las condiciones utilizadas se cumpla.
Los registros que cumplan con alguna de las dos condiciones – o con las dos condiciones – son tomados en cuenta.
-- Referencia del uso de OR
-- SELECT * FROM tabla WHERE condicion1 OR condicion2;
-- cada condición está dada por una columna un operador y un valor
-- Seleccionar todos los datos
-- de la tabla usuarios
-- donde el valor en la columna email
-- contenga el término reichel
-- o que el valor en la columna rol_id
-- no sea NULL.
--
-- En este caso prefiero plantearla
-- como dos consultas independientes.
--
-- Seleccionar todos los datos
-- de la tabla usuarios
-- donde el valor en la columna email
-- contenga el término reichel
-- o
-- Seleccionar todos los datos
-- de la tabla usuarios
-- donde el valor en la columna rol_id
-- no sea NULL.
SELECT *
FROM usuarios
WHERE email LIKE "%reichel%"
OR rol_id IS NOT NULL;
Paréntesis – ()
En caso de requerir más de dos condiciones o que el comportamiento sea distinto podemos utilizar paréntesis para agrupar diferentes expresiones.
Hay que prestar atención en las condiciones que agrupa cada uno de los paréntesis porque si influye en la manera en que se filtran los registros.
-- Selecciona todos los datos
-- de la tabla usuarios
-- donde la columna email contenga el término
-- co.uk o selecciona todos los datos
-- de la tabla usuarios donde
-- el valor en la columna rol_id no sea NULL.
-- De los registros obtenidos únicamente
-- queremos seleccionar los registros que
-- el valor del mes en la columna creado es marzo - 03 -.
SELECT *
FROM usuarios
WHERE (email LIKE "%.co.uk%" OR rol_id IS NOT NULL)
AND MONTH(creado) = 03;
-- Selecciona todos los datos
-- de la tabla usuarios
-- donde la columna email contenga el término
-- co.uk o selecciona todos los datos
-- de la tabla usuarios
-- donde el valor en la columna rol_id no sea NULL
-- y que además tengan el valor del mes
-- en la columna creado es marzo - 03 -.
SELECT *
FROM usuarios
WHERE email LIKE "%.co.uk%" OR (rol_id IS NOT NULL
AND MONTH(creado) = 03);
Nota:
Al utilizar AND / OR podemos ordenar los resultados de la consulta, limitar / desplazar el número de resultados – en caso de paginar – y utilizar los diferentes operadores que hemos visto hasta ahora.
-- Selecciona todos los datos
-- de la tabla usuarios
-- donde la columna email contenga el término
-- co.uk o selecciona todos los datos
-- de la tabla usuarios donde
-- el valor en la columna rol_id no sea NULL.
-- De los registros obtenidos únicamente
-- queremos seleccionar los registros que
-- el valor del mes en la columna creado es marzo - 03 -.
-- De los registros obtenidos
-- los vamos a ordenar por
-- la columna email de manera
-- ascendente y
-- queremos visualizar
-- únicamente los cinco primeros.
SELECT *
FROM usuarios
WHERE email LIKE "%.co.uk%" OR (rol_id IS NOT NULL
AND MONTH(creado) = 03)
ORDER BY email ASC
LIMIT 5;