El operador IN es un operador lógico que permite evaluar si una expresión está dentro de una lista de valores (o incluso una subconsulta). Regresa verdadero si la expresión buscada está al menos una vez en la lista que se utiliza.
En general, el uso del operador IN es como sigue
expresión-buscada IN (lista de valores)
Operador IN con una lista fija de elementos
En esta caso la lista de valores que se proporciona en la expresion es una enumeración de valores del tipo de la expresión buscada. Si la expresión buscada está al menos una vez (no importa la posición) en la lista de valores, entonces toda la expresión regresa un valor de TRUE o de verdadero.
Ejemplos de operador IN con una lista fija de elementos
10 IN (5,9,-9,10,40,87,-9)
Regresa verdadero ya que el valor de 10 está en la lista de valores a la derecha del IN.
edad IN (18,19,20,21,22,23)
Regresará verdadero si el valor -al momento de evaluar la expresión- del campo edad es uno de los valores listados.
Un ejemplo de su utilización en un SELECT sería el siguiente:
SELECT nombre, apellido, domicilio, nivel FROM alumnos
WHERE edad IN (6,7,8, 17,18,19);
El query anterior regresará los registros dentro de la tabla alumnos cuya edad sea cualquiera de las 6 listadas (6,7,8, 17,18,19). Otra forma de escribir el query anterior -sin usar el operador IN- sería:
SELECT nombre, apellido, domicilio, nivel FROM alumnos
WHERE edad=6 OR edad=7 OR edad=8 OR edad=17 OR edad=18 OR edad=19;
Operador IN con una subconsulta
La lista de valores que se utiliza en el IN puede ser una subconsulta y no una lista de valores fijos, de tal manera que se evalúa el query que estará dentro de los paréntesis y después se compara con el valor a buscar. En términos generales, el uso de IN con una subconsulta es similar a
valor-a-buscar IN (SELECT campo FROM tabla)
En este caso, se ejecuta el query dentro de los paréntesis (con la única restricción de que tiene que ser nu query que regrese solo una columna) y después se evalúa si el valor-a-buscar
está contenido al menos una vez en esa lista.
Ejemplo de operador IN utilizando subconsultas
SELECT id, nombre, domicilio, saldo FROM clientes
WHERE entidadFederativa IN
(SELECT entidad FROM entidades WHERE poblacion >= 1000000)
Este query obtiene los clientes que vivan en las entidades cuya población sea superior al millón de habitantes. Para ello se obtiene la lista de entidades con población por arriba del millón (con la subconsulta) y luego se compara la entidad de cada cliente para evaluar si está dentro de la lista obtenida.
Consideraciones de performance con el operador IN
Si bien el utilizar este operador es una forma cómoda y clara de escribir una consulta, se tiene que considerar que el cálculo y obtención del subquery se hace cada vez que se evalúa el query principal, es decir, una vez por cada registro.
En el ejemplo anterior, el query de obtener las entidades con población de más de 1 millón de habitantes, se ejecuta tantas veces como registros tiene la tabla clientes, por que cada vez que se evalúa el WHERE del query principal se tiene que evaluar nuevamente el subquery.
Esto, dependiendo del tamaño de las tablas involucradas, puede traer una sobrecarga del performance del query globalmente.
IN es solo uno de los operadores lógicos de SQL, pero es muy utilizado por los desarrolladores.