1. 使用原则
小表驱动达标,即小的数据集驱动大的数据集
select * from A where id in (select id from B)
等价于
for select id from B
for select * from A where A.id = B.id
当 B 表的数据集小于 A 表的数据集时,用 IN 优于 Exists
select * from A where exists (select 1 from B where B.id = A.id)
等价于
for select * from A
for select * from B where B.id = A.id
当 A 表的数据集小于 B 表的数据集时,用 Exists 优于 IN。
PS: A 表与 B 表的 ID 应建立索引。
- EXISTS
SELECT ... FROM table WHERE EXISTS (subquery)
语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。
- 提示
- EXISTS (subquery) 只返回 TRUE 或 FALSE,因此子查询中的 SELECT * 也可以是 SELECT 1 或其它。
- EXISTS 子查询的实际执行过程可能进过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。
- EXISTS 子查询往往也可以用条件表达式、其它子查询或者 JOIN 来替代,何种最优需要具体问题具体分析。
网友评论