En versiones prévias de MySQL (anteriores a la MySQL 4.1),
sólo se soportaban consultas anidadas de la forma
INSERT ... SELECT ...
y REPLACE
... SELECT ...
. Este no es el caso en MySQL 5.0,
pero es cierto que hay a veces otras formas de testear la
pertenencia a un grupo de valores. También es cierto que en
algunas ocasiones, no es sólo posible reescribir una consulta
sin una subconsulta, sino que puede ser más eficiente hacerlo
que usar subconsultas. Una de las técnicas disponibles es
usar el constructor IN()
:
Por ejemplo, esta consulta:
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
Puede reescribirse como:
SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id;
Las consultas:
SELECT * FROM t1 WHERE id NOT IN (SELECT id FROM t2); SELECT * FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE t1.id=t2.id);
Pueden reescribirse usando IN()
:
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
Un LEFT [OUTER] JOIN
puede ser más rápido
que la subconsulta equivalente ya que el servidor puede ser
capaz de optimizarlo mejor — este es un hecho no
específico de MySQL Server . Antes de SQL-92, los outer joins
no existían, así que las subconsultas eran el único modo de
hacer ciertas cosas. Hoy, MySQL Server y otros sistemas de
bases de datos ofrecen un ámplio rango de tipos de outer
join.
MySQL Server soporta comandos DELETE
para
múltiples tablas que pueden usarse para borrar registros
basándose en la información de una tabla o de varias al
mismo tiempo. Los comandos UPDATE
para
múltiples tablas también se soportan en MySQL 5.0.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.