SQL IN vs SQL EXISTE
Este artículo analiza en detalle los operadores IN y EXISTS en SQL . Es una pregunta común entre los desarrolladores cuál es la diferencia entre estos dos operadores. Para conocer la diferencia, primero analicemos en detalle cada uno de estos operadores.
Operador IN
El operador IN se utiliza para obtener resultados cuando un valor especificado coincide con un valor en un conjunto de valores o lo devuelve una consulta interna. Este operador también se puede utilizar con WHERE cláusula para especificar más de un valor. El operador IN a menudo se conoce como el acrónimo del operador OR porque reduce el uso de múltiples condiciones OR en consultas SELECCIONAR, INSERTAR, ACTUALIZAR o ELIMINAR. .
En este operador, la subconsulta se resuelve primero y ese resultado luego se usa para resolver la consulta externa.
La siguiente es la sintaxis general del operador IN:
SELECT column_name FROM table_name WHERE column_name IN (value1, value2, …);
Ejemplo:
Consideremos la siguiente tabla de Clientes.
Cust_id | Nombre_del_cliente | Ciudad | Ocupación |
1 | Harry | Calcuta | Negocio |
2 | Ron | Mumbai | Médico |
3 | Albus | Delhi | Ingeniero |
4 | Dobby | Puno | Científico |
5 | Snape | Bangalore | Estudiante |
Consulta:
SELECT * FROM Customer WHERE Occupation IN ('Doctor', 'Scientist', 'Engineer');
La consulta anterior devolverá todos los clientes que sean médicos, científicos o ingenieros.
Salida:
Cust_id | Nombre_del_cliente | Ciudad | Ocupación |
2 | Ron | Mumbai | Médico |
3 | Albus | Delhi | Ingeniero |
4 | Dobby | Puno | Científico |
EXISTE Operador
El operador EXISTS, a diferencia del operador IN, devuelve un valor booleano. Este operador verifica el resultado de la consulta interna y devuelve un valor booleano, es decir, verdadero o falso. Si la consulta interna devuelve un registro único o múltiple, el operador devuelve verdadero; de lo contrario, devuelve falso cuando no se encuentran registros.
Este operador también es eficiente, ya que detiene el procesamiento posterior tan pronto como se detecta el primer evento verdadero.
La siguiente es la sintaxis del operador EXISTS:
SELECT column_names FROM table_name WHERE NOT EXISTS ( SELECT column_names FROM table_name WHERE condition );
Ejemplo:
Consideremos la siguiente tabla de Clientes.
Cust_id | Nombre | Ocupación | Edad |
101 | Harry | Ingeniero | 32 |
102 | Ron | Desarrollador | 30 |
103 | Dobby | Líder | 28 |
104 | Albus | Científico | 45 |
105 | Snape | Carpintero | 26 |
106 | Jengibre | Actriz | 25 |
107 | NULO | NULO | NULO |
Consideremos otra tabla Órdenes.
Order_id | ID_cliente | Nombre_del_producto | Fecha_pedido |
1 | 101 | Ordenador portátil | 2021-01-10 |
2 | 103 | Escritorio | 2021-02-12 |
3 | 106 | iPhone | 2021-02-15 |
4 | 104 | Móvil | 2021-03-05 |
5 | 102 | Televisión | 2021-03-20 |
Consulta:
SELECT Name, Occupation FROM Customer WHERE EXISTS ( SELECT * FROM Orders WHERE Customer.Cust_id = Orders.Cust_id );
La consulta anterior devolverá el nombre y la ocupación de todos los clientes que hayan realizado al menos un pedido.
Salida:
Nombre | Ocupación |
Harry | Ingeniero |
Ron | Desarrollador |
Dobby | Líder |
Albus | Científico |
Jengibre | Actriz |
Tabla de diferencias entre el operador IN y EXISTS
Las diferencias clave entre el operador IN y el operador EXISTS se enumeran a continuación de forma tabular:
Operador IN | EXISTE Operador |
Minimiza el uso de las condiciones OR. | Comprueba la existencia de un registro en la consulta interna. |
Compara los valores de la consulta interna con el valor de la consulta externa. | No compara los valores entre la consulta interna y la consulta secundaria. |
Comprueba todos los valores dentro del bloque de la cláusula IN. | Detiene cualquier ejecución posterior tan pronto como se cumple la primera condición verdadera. |
Puede devolver VERDADERO, FALSO o NULL. | Devuelve VERDADERO o FALSO. |
Se puede utilizar para comprobar valores NULL. | No se puede usar para comprobar valores NULL. |
Se utiliza tanto con subconsultas como con valores. | Se usa solo con subconsultas. |
La ejecución es más rápida cuando el resultado de la consulta interna es menor. | La ejecución es más rápida incluso cuando el resultado de la consulta interna es grande. Es más eficiente que el operador IN. |
Sintaxis :SELECCIONE column_names DESDE table_name WHERE column_name IN (subconsulta); | Sintaxis :SELECCIONE column_namesFROM table_name DONDE [NO] EXISTE (subconsulta); |
Conclusión:
En este tema se ha realizado una comparación entre el operador IN y los operadores EXISTS de SQL. Ambos operadores realizan la misma operación pero su funcionamiento interno es diferente. Tienen diferente funcionamiento lógico. Cualquiera de ellos se puede seleccionar según el requisito. Pero, si el conjunto de datos es grande, siempre se recomienda optar por el operador EXISTS.