HOWTO · MySQL
Comprobar si una fila existe en MySQL con EXISTS e IF()
Comprueba si una fila cumple una condición en MySQL con EXISTS y luego usa IF() para devolver un resultado legible.
En esta página
Para comprobar si una fila existe en MySQL, usa el predicado EXISTS con una subconsulta. Es verdadero cuando la subconsulta devuelve al menos una fila. Colócalo dentro de la función IF() de MySQL para elegir un valor como Yes, exists o No, does not exist. Esta guía cubre el predicado EXISTS y la función IF(); IF EXISTS en una sentencia DDL es una sintaxis distinta.
Los ejemplos de MySQL usan una pequeña tabla student_details. Ejecuta estas sentencias de preparación en una sesión de MySQL antes de probar las consultas:
CREATE TABLE student_details (stu_id INT PRIMARY KEY, stu_firstName VARCHAR(255), stu_lastName VARCHAR(255));
INSERT INTO student_details (stu_id, stu_firstName, stu_lastName) VALUES (1, 'Preet', 'Sanghavi'), (2, 'Rich', 'John'), (3, 'Veron', 'Brow'), (4, 'Geo', 'Jos'), (5, 'Hash', 'Shah'), (6, 'Sachin', 'Parker'), (7, 'David', 'Miller');
Este ejemplo de Python autónomo usa la biblioteca integrada de SQLite para comprobar el ID 4. La salida observada se muestra a continuación; las consultas de MySQL de esta guía deben ejecutarse en MySQL.
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute("CREATE TABLE student_details (stu_id INTEGER PRIMARY KEY)")
connection.executemany(
"INSERT INTO student_details (stu_id) VALUES (?)",
[(1,), (2,), (3,), (4,)],
)
result = connection.execute(
"SELECT EXISTS (SELECT 1 FROM student_details WHERE stu_id = ?)", (4,)
).fetchone()[0]
print(result)
connection.close()
1
Uso básico del operador EXISTS en MySQL
EXISTS comprueba si su subconsulta devuelve una fila. Los valores seleccionados dentro de la subconsulta no se convierten en el resultado; SELECT 1 deja claro ese propósito. En MySQL, comprueba el ID 4 con:
SELECT EXISTS (SELECT 1 FROM student_details WHERE stu_id = 4) AS RESULT;
El resultado es 1 porque la tabla de ejemplo contiene stu_id = 4. Cambia la condición a stu_id = 11 y devuelve 0. Estos resultados esperados de MySQL se derivan de los datos de preparación; el ejemplo de Python anterior demuestra el predicado en SQLite, no en MySQL.
La condición comprueba stu_id, independientemente del valor del nombre. El mismo predicado puede usarse en una sentencia SELECT, UPDATE, DELETE o INSERT más grande cuando una prueba de existencia encaje con la operación. Para un resultado de consulta de sí o no, SELECT EXISTS (...) devuelve el valor numérico verdadero o falso de MySQL.
SELECT EXISTS (...) devuelve una fila que contiene 1 o 0, lo cual es útil cuando la aplicación necesita un único valor de sí o no. Para devolver solo filas de otra tabla que tengan una coincidencia relacionada, coloca EXISTS en la cláusula WHERE de la consulta externa. Por ejemplo, SELECT c.customer_id FROM customers AS c WHERE EXISTS (SELECT 1 FROM orders AS o WHERE o.customer_id = c.customer_id); devuelve los clientes con al menos un pedido coincidente. La referencia a c.customer_id hace que la subconsulta esté correlacionada con cada fila de cliente candidata. Usa los nombres de tablas y claves de tu propio esquema.
Uso de IF() con EXISTS en MySQL
IF(condition, value_if_true, value_if_false) de MySQL elige uno de dos valores. Usa EXISTS como su condición para devolver un resultado legible para el ID 4: IF() es útil cuando una consulta debe devolver directamente una etiqueta u otro valor; no cambia qué filas se seleccionan a menos que su resultado se use en una condición de filtrado. Los dos argumentos de resultado pueden ser cadenas, números u otras expresiones compatibles.
SELECT IF(EXISTS (SELECT 1 FROM student_details WHERE stu_id = 4), 'Yes, exists', 'No, does not exist') AS RESULT;
Con la fila de ejemplo para el ID 4, RESULT es Yes, exists. Para un ID ausente como el 11, cambia la condición a stu_id = 11; RESULT es No, does not exist. Estos valores esperados se derivan de las filas de ejemplo y de la semántica de expresiones de MySQL; la demostración con SQLite no ejecuta la función IF() de MySQL.
RESULT es un alias de columna que etiqueta el valor devuelto. Cambia la condición WHERE de la subconsulta para comprobar otro ID o criterio, y usa nombres de columna que coincidan con tu tabla. Para una consulta más grande, inspecciona su plan y mídelo con tus datos e índices. El costo depende de la consulta y del esquema, por lo que no existe una regla general de que EXISTS sea siempre lento o deba volver a ejecutarse de una forma fija para cada fila externa.