IN
Se utiliza cuando en una consulta queremos comparar que uno o muchos valores almacenados en una columna encuentren dentro de conjunto de valores.
-- Queremos que el valor en la columna nombre de la tabla roles sea:
-- Administrador o Visitante
SELECT nombre, creado FROM roles WHERE nombre IN ("administrador", "visitante");
-- Queremos que el valor de la columna usuario_id en publicaciones sea
-- 4 o sea 6
SELECT usuario_id, titulo FROM publicaciones WHERE usuario_id IN (1,4,6,7);
Si queremos que los valores almacenados NO sean parte de un conjunto de valores se utiliza NOT antes de IN.
-- Queremos que el valor en la columna nombre de la columna roles NO sea:
-- Administrador o Visitante
SELECT nombre, creado FROM roles WHERE nombre NOT IN ("administrador", "visitante");
-- Queremos que el valor de la columna usuario_id de la tabla publicaciones no sea:
-- 4 o 6.
SELECT usuario_id, titulo FROM publicaciones WHERE usuario_id NOT IN (1,4,6,7);
Nota:
Al utilizarse para comparar un texto, la comparación que se realiza es de igualdad, es decir, el valor almacenado en la columna tiene que ser exactamente igual al valor utilizado para la comparación. Con el operador IN no funcionan los porcentajes como en LIKE.
BETWEEN AND
Si buscamos que el valor almacenado en una columna se encuentre dentro de un rango – conjunto de valores – es posible utilizar IN e incluir cada uno de los valores con los que queremos comparar pero no es muy práctico. En este caso podemos utilizar BETWEEN AND.
BETWEEN AND acepta dos valores, uno después de BETWEEN – y antes de AND – y otro después de AND.
El primer valor tiene que ser el menor – y el segundo valor el mayor – para que funcione correctamente.
-- Queremos que el valor de la columna creado de la tabla publicaciones
-- se encuentre entre:
-- El primero de enero del 2011 - 01/01/2011
-- El once de agosto del 2015 - 11/08/2015
SELECT id, titulo, creado FROM publicaciones
WHERE creado BETWEEN '2011-01-01' AND NOW();
-- Queremos que el valor de la columna creado de la tabla publicaciones
-- se encuentre entre:
-- El primero de enero del 2010 - 01/01/2010
-- El primero de enero del 2011 - 01/01/2011
SELECT id, titulo, creado FROM publicaciones
WHERE creado BETWEEN '2010-01-01' AND '2011-01-01';
En la primer consulta utilizamos la función NOW() lo que nos permite que la consulta esté actualizada aún con el paso del tiempo. También podemos utilizar más funciones de hora y fecha para ajustar nuestras consultas.
-- Queremos encontrar que el valor del AÑO en la columna creado
-- se encuentre entre el 2014 y - hasta ahora - el 2015
-- Si llegamos al 2016 sería entre el 2014 y el 2016.
SELECT id, titulo, YEAR(creado) FROM publicaciones WHERE creado BETWEEN YEAR('2014') AND YEAR(NOW());
-- También podemos utilizar BETWEEN AND para filtrar por horas.
-- En el este caso de las horas no utilizo NOW para evitar que el primer valor sea
-- mayor al segundo y no funcione correctamente.
-- En el siguiente ejemplo buscamos que el valor - de la fecha - de la columna creado
-- sea el día de hoy.
-- Y * también que el valor - de la hora - de la columna creado se encuentre entre
-- las 10:00 y las 20:00hrs
SELECT id, titulo, DATE(creado), HOUR(creado) FROM publicaciones WHERE
DATE(creado) = DATE(NOW()) AND HOUR(creado) BETWEEN HOUR('10:00') AND HOUR("20:00");
-- * Más adelante vamos a ver AND
Aunque personalmente no lo utilizo de esta manera, el operador BETWEEN AND se puede utilizar para comparar otro tipo de valores – texto, números -.
-- Queremos que el valor de la columna título de las publicaciones se encuentre
-- entre la A y la D
SELECT id, titulo FROM publicaciones WHERE titulo BETWEEN "A" AND "D"
-- En este caso no aparecerían las publicaciones que comienzan con D por ejemplo:
-- "Definición" porque D - D sin contenido posterior - es menor a D_ - cualquier carácter.
-- Si queremos incluir las palabras que comienzan con ese carácter, tenemos que incluir un segundo carácter.
SELECT id, titulo FROM publicaciones WHERE titulo BETWEEN "A" AND "DZ"
-- Si queremos que el valor de la columna id de la tabla publicaciones se encuentre en un rango
-- también podemos utilizar BETWEEN AND
SELECT id, titulo FROM publicaciones WHERE id BETWEEN 17 AND 21
Si queremos que el valor NO se encuentre dentro de un rango determinado utilizamos NOT antes de BETWEEN.
-- Queremos que el valor de la columna creado de la tabla publicaciones
-- NO se encuentre entre:
-- El primero de enero del 2011 - 01/01/2011
-- El once de agosto del 2015 - 11/08/2015
SELECT id, titulo, creado FROM publicaciones
WHERE creado NOT BETWEEN '2011-01-01' AND NOW();
-- Queremos que el valor de la columna creado de la tabla publicaciones
-- NO se encuentre entre:
-- El primero de enero del 2010 - 01/01/2010
-- El primero de enero del 2011 - 01/01/2011
SELECT id, titulo, creado FROM publicaciones
WHERE creado NOT BETWEEN '2010-01-01' AND '2011-01-01';
Finalmente
Con los operadores IN y BETWEEN – además de retomar algunas funciones de hora y fecha – tenemos más flexibilidad para filtrar datos en las consultas.
También conocimos el operador NOT se utiliza para cambiar el valor de verdad al operador utilizado – lo vamos a utilizar más adelante.