Diferencias entre las cláusulas IN y EXISTS en SQL: Cuál utilizar

Comprendiendo las diferencias entre las cláusulas IN y EXISTS en SQL

En un primer vistazo, puede parecer que las cláusulas IN y EXISTS en SQL son intercambiables. Sin embargo, son bastante diferentes en cómo manejan los valores NULL y pueden dar resultados distintos. El problema surge porque, en una base de datos Oracle, un valor NULL significa desconocido, por lo que cualquier comparación u operación contra un valor NULL también es NULL y cualquier prueba que devuelva NULL siempre se ignora. Por ejemplo, ninguna de estas consultas devuelve filas:

select 'true' from dual where 1 = null;
select 'true' from dual where 1 != null;

El valor 1 no es igual ni diferente de NULL. Solo IS NULL retornaría verdadero en un valor NULL y devolvería una fila.

Cómo utilizar roles de seguridad en SQL Server para proteger tus bases de datos
select 'true' from dual where 1 is null;
select 'true' from dual where null is null;

Cuando usas IN, le estás diciendo a SQL que tome un valor y lo compare con cada valor o conjunto de valores en una lista usando el operador =. Si existen valores NULL, no se devolverá ninguna fila, incluso si ambos valores son NULL.

select 'true' from dual where null in (null);
select 'true' from dual where (null, null) in ((null, null));
select 'true' from dual where (1, null) in ((1, null));

La cláusula IN es funcionalmente equivalente a la cláusula = ANY:

Cómo optimizar los registros de transacciones en Microsoft SQL Server
select 'true' from dual where null = ANY (null);
select 'true' from dual where (null, null) = ANY ((null, null));
select 'true' from dual where (1, null) = ANY ((1, null));

Cuando utilizas una forma equivalente de EXISTS, SQL cuenta las filas e ignora el valor(es) en la subconsulta, incluso si se devuelve un valor NULL.

select 'true' from dual where exists (select null from dual);
select 'true' from dual where exists (select 0 from dual where null is null);

Las cláusulas IN y EXISTS son lógicamente iguales. La cláusula IN compara los valores devueltos por la subconsulta y filtra las filas en la consulta principal; la cláusula EXISTS compara los valores y filtra las filas dentro de la subconsulta. En el caso de los valores NULL, el conjunto resultante de filas es el mismo.

Cómo utilizar la recursión en T-SQL para calcular el factorial - TechRepublic
select ename from emp where empno in (select mgr from emp);
select ename from emp e where exists (select 0 from emp where mgr = e.empno);

Pero surgen problemas cuando la lógica se invierte para usar NOT IN y NOT EXISTS, que retornan diferentes conjuntos de filas (la primera consulta devuelve 0 filas, la segunda devuelve los datos previstos, no son la misma consulta).

select ename from emp where empno not in (select mgr from emp);
select ename from emp e where not exists (select 0 from emp where mgr = e.empno);

La cláusula NOT IN es prácticamente equivalente a comparar cada valor con = y fallar si alguna prueba es FALSA o NULL. Por ejemplo:

Cómo crear un formulario de entrada de datos en Microsoft Access
select 'true' from dual where 1 not in (null, 2);
select 'true' from dual where 1 != null and 1 != 2;
select 'true' from dual where (1, 2) not in ((2, 3), (2, null));
select 'true' from dual where (1, null) not in ((1, 2), (2, 3));

Estas consultas no devuelven ninguna fila. La segunda es más obvia, 1 != NULL es NULL, por lo que toda la condición WHERE es falsa para esa fila. Mientras que estas funcionarían:

select 'true' from dual where 1 not in (2, 3);
select 'true' from dual where 1 != 2 and 1 != 3;

Aún puedes usar la consulta NOT IN anterior, siempre y cuando evites que se devuelva NULL en los resultados (nuevamente, ambas funcionan, pero estoy asumiendo que empno no es nulo, lo cual es una buena suposición en este caso):

Decide con inteligencia: Stored procedures vs. SQL en tu código
select ename from emp where empno not in (select mgr from emp where mgr is not null);
select ename from emp where empno not in (select nvl(mgr, 0) from emp);

Al comprender la diferencia entre IN, EXISTS, NOT IN y NOT EXISTS, puedes evitar un problema muy común cuando los valores NULL aparecen en los datos de una subconsulta.

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Gestión de datos, allí encontraras muchos artículos similares a Diferencias entre las cláusulas IN y EXISTS en SQL: Cuál utilizar , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.