Saltar al contenido

Cómo utilizar el operador NOT IN de SQL

En el corazón del lenguaje de consulta estructurado (SQL) se encuentra una variedad de operadores que mejoran nuestra capacidad para manipular datos. Uno de estos operadores, esencial para el desarrollo de consultas SQL complejas, es el operador NOT IN. Para aquellos interesados en maximizar su eficacia en SQL, entender la función y la aplicación del operador es indispensable.

Índice

    ¿Qué es el Operador NOT IN?

    En SQL se utiliza para filtrar los resultados de una consulta. Este operador compara un valor con un conjunto de valores y devuelve filas donde el valor no se encuentra en ese conjunto.

    SELECT column_name
    FROM table_name
    WHERE column_name NOT IN (value1, value2, ...);

    Por ejemplo, si queremos seleccionar todos los empleados que no están en los departamentos de ‘Ventas’ o ‘Marketing’, la consulta SQL sería:

    SELECT employee_name
    FROM employees
    WHERE department NOT IN ('Ventas', 'Marketing');

    Uso del operador con Subconsultas

    Una de las formas más poderosas de utilizar el operador es en conjunto con subconsultas. Una subconsulta es una consulta que se encuentra dentro de otra consulta.

    Veamos un ejemplo:

    SELECT employee_name
    FROM employees
    WHERE employee_id NOT IN (SELECT manager_id FROM departments);

    En este caso, la subconsulta (SELECT manager_id FROM departments) devuelve una lista de todos los ID de los gerentes. Luego, la consulta principal selecciona los nombres de los empleados cuyo ID no está en esa lista, es decir, los empleados que no son gerentes.

    JOIN

    Por otro lado, la utilización de JOIN generalmente conduce a un mejor rendimiento, especialmente con conjuntos de datos grandes. Esto se debe a que SQL solo tiene que ejecutar la consulta JOIN una vez y luego puede usar los resultados para realizar la comparación.

    SELECT a.*
    FROM tabla1 a
    LEFT JOIN tabla2 b ON a.id = b.id
    WHERE b.id IS NULL;

    Legibilidad y Mantenimiento

    Otro factor importante a tener en cuenta es la legibilidad y el mantenimiento del código.

    Subconsultas con NOT IN

    Las subconsultas con pueden ser menos legibles, especialmente para aquellos no familiarizados con las subconsultas. Además, las subconsultas pueden ser más difíciles de mantener, ya que cualquier cambio en la lógica de la subconsulta requiere modificar la consulta principal.

    JOIN

    Las consultas con JOIN suelen ser más legibles, ya que el flujo de la consulta se puede seguir linealmente. Además, son más fáciles de mantener y modificar, ya que cualquier cambio en la lógica de la consulta se puede realizar en una sola ubicación.

    Rendimiento del Operador NOT IN

    Es importante entender que el operador NOT IN puede ser ineficiente en algunas bases de datos, especialmente cuando la subconsulta devuelve muchos valores. En estos casos, podría ser preferible utilizar el operador NOT EXISTS o un LEFT JOIN en su lugar.

    Ejemplos Prácticos del Uso

    El operador NOT IN es útil en muchas situaciones. A continuación, describiremos algunos escenarios comunes.

    Exclusión de Categorías Específicas

    Supongamos que queremos obtener una lista de productos que no pertenecen a ciertas categorías. En este caso, podemos usar el operador NOT IN para excluir estas categorías.

    SELECT product_name
    FROM products
    WHERE category NOT IN ('Electrónicos', 'Ropa');

    Filtrado de Registros Únicos

    Otro uso práctico es el filtrado de registros únicos. Si queremos seleccionar solo los registros que no tienen duplicados en una determinada columna, podemos usar NOT IN.

    SELECT first_name
    FROM customers
    WHERE customer_id NOT IN (SELECT customer_id FROM orders);
    

    Esta consulta seleccionará los nombres de los clientes que no han realizado ningún pedido.

    Eliminando Registros duplicados

    para esto te recomendamos ver nuestro articulo que explica ampliamente como utilizar este comando para para resolver este error de registros duplicados en sql.

    DELETE FROM productos  
    WHERE codigo  
    NOT IN (SELECT productid FROM orders);

    Comparar cadenas de texto

    El operador NOT IN tiene la capacidade de comparar cadenas de texto del tipo (char, nchar, varchar, nvarchar). El codigo sql a continuación muestra como comparar dos cadenas de texto utilizando sql IF que se utiliza para evaluar condiciones.

    --esto seria utilizando el operador <>
    IF @databasename<> 'prueba' 
    AND @databasename <>'databasetest'
    BEGIN
      
    END
     
    --utlizando not in
    IF @UserName NOT IN ('TrainingUser', 'TestUser')
    BEGIN
      
    END

    aunque el resultado es el mismo para el caso de not in la comparacion fue mas rapida ya que el motor no debia evaluar un segundo operador logico.

    Filtrar fechas

    El operador NOT IN se puede utilizar para buscar cualquier valor de fecha o de fecha y hora, excepto aquellos que coincidan con uno de una lista de valores de fecha o de fecha y hora. Es posible que necesitemos sacar las horas trabajadas de un conjunto pero antes necesitamos sacar los dias festivos. Esto difiere del uso de between para sacar fechas en un rango.

       SELECT empeladoid, fecharegistro , horaslaboradas 
       FROM rrhh.horas  
       WHERE fecharegistro NOT IN ('25-Dec-2023', 
                                   '1-ene-2023',
                                   '4-jul-2023')

    para este caso se excluyeron ciertos dias festivos de la hora de calculo. para sacar fecha tambien te recomiendo este link

    Descargar ejemplos practicos de sql

    Script de sql para usar dentro de la instancia del servidor de gestion de base de datos de tu prferencia con datos de prueba para trabajar con  sql server, mysql postgresql.

    Conclusión

    El operador NOT IN en SQL es una herramienta esencial para los desarrolladores. Sin embargo, el uso de JOIN puede ser más apropiado en ciertas circunstancias debido a su eficiencia y legibilidad superiores. Siempre debemos considerar el contexto y los requisitos de la tarea para decidir cuál método es el más adecuado.

    Esperamos que este artículo te haya sido de ayuda. Si tienes alguna duda o comentario, no dudes en ponerte en contacto con nosotros. ¡Hasta la próxima!

    Tambien te recomendamos ver lista de operadores logicos en sql que aplican para:

    Gracias, Bye :D!!