¿Cuál es la condición ‘EXISTE’ en MySQL?

Tenga en cuenta que EXISTS es SQL estándar y no es una sintaxis exclusiva de MySQL

EXISTS se evalúa como VERDADERO si su subconsulta devuelve algún resultado, FALSO de lo contrario. Como no le “importan” los resultados reales, es mejor por razones de rendimiento utilizar una lista SELECT “no-op” si es posible, como “SELECT 1 FROM WHERE ” en la subconsulta EXISTS , ya que todo lo que realmente “importa” son las cláusulas WHERE / HAVING de la subconsulta.

Mi uso favorito de EXISTS es para NO-existencia, ya que de lo contrario es muy difícil tener una consulta de negación bien planificada en MySQL.

Por ejemplo, encuentre todas las recs en la tabla1 que no tienen una propiedad en la tabla2 …

seleccione * de la tabla1 donde no existe (seleccione 1 de la tabla2 donde table2.property = table1.property);

Lo bueno de este enfoque es que es una consulta “positiva”, por lo que se puede usar un índice en table2.property. En MySQL, también es mucho más rápido que usar IN o NOT IN.

EXISTE puede parecer esotérico, pero es muy útil

EXISTS se usa en una condición WHERE y acepta una subconsulta como argumento. Si la subconsulta no devuelve filas, EXISTS devuelve FALSE, de lo contrario, TRUE.

SELECCIONE man.name
del hombre gerente
donde EXISTE
SELECCIONE 1
DE empleado emp
donde emp.manager_id = man.id
y emp.salario> 5000
)

Esto devuelve los nombres de todos los gerentes que tienen empleados que les reportan que ganan más de 5000 unidades de dinero. Tenga en cuenta que no importa lo que contengan las filas devueltas en la subconsulta, por lo que siempre pongo 1 allí; otros suelen escribir *, no importa.

A menudo puede reemplazar esa construcción por una unión (que es aconsejable para MySQL, pero no tanto para Oracle), pero debe asegurarse de no obtener varias filas de gerentes para gerentes con más empleados con altos ingresos:

SELECCIONE man.name distinto
del hombre gerente
unirse empleado emp
en emp.manager_id = man.id
donde emp.salary> 5000