有时除了使用子查询之外,还有其他方法可以测试一组值中的成员资格。此外,在某些情况下,不仅可以在没有子查询的情况下重写查询,而且使用其中一些技术比使用子查询更有效。其中之一是
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 语句”。