13.2.10.11 将子查询重写为联接

有时,除了使用子查询之外,还有其他方法可以测试一组值中的成员资格。同样,在某些情况下,不仅可以在没有子查询的情况下重写查询,而且利用其中的某些技术而不是使用子查询可能更有效。其中之一是IN()构造:

例如,此查询:

SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);

可以重写为:

SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id;

The queries:

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);

可以重写为:

SELECT table1.*
  FROM table1 LEFT JOIN table2 ON table1.id=table2.id
  WHERE table2.id IS NULL;

LEFT [OUTER] JOIN的速度可能比同等子查询更快,因为服务器可能能够更好地对其进行优化-这不仅限于 MySQL Server。在 SQL-92 之前,外部联接不存在,因此子查询是执行某些操作的唯一方法。如今,MySQL Server 和许多其他现代数据库系统提供了广泛的外部联接类型。

MySQL Server 支持多 tableDELETE语句,这些语句可用于基于一个 table 甚至是多个 table 的信息有效地删除行。还支持多 tableUPDATE语句。参见第 13.2.2 节“删除声明”第 13.2.11 节“ UPDATE 语句”