Documentation Home
MySQL 8.0 参考手册  / 第 13 章 SQL 语句  / 13.2 数据操作语句  / 13.2.11 子查询  /  13.2.10.11 将子查询重写为连接

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;

查询:

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;

ALEFT [OUTER] JOIN可以比等效子查询更快,因为服务器可能能够更好地优化它——这一事实并非仅针对 MySQL 服务器。在 SQL-92 之前,外部连接不存在,因此子查询是做某些事情的唯一方法。今天,MySQL 服务器和许多其他现代数据库系统提供了广泛的外部连接类型。

MySQL Server 支持多表 DELETE语句,可用于根据一张表甚至同时多张表的信息高效地删除行。UPDATE还支持多表 语句。请参阅第 13.2.2 节,“DELETE 语句”第 13.2.11 节,“UPDATE 语句”