使用高效的查询
参数是子查询时,使用exists代替in
-- 从Class_A表中查出同时存在于Class_B表中的员工
select * from Class_A
where id in(select id from Class_B);
select * from Class_A A
where exists (select * from Class_B B where A.id=B.id);
使用exists时更快的原因有以下两个:
- 如果连接列(id)上建立了索引,那么查询Class_B时不用查实际的表,只需查索引就可以了
- 如果使用exists,那么只要查到一行数据满足条件就会终止查询,不用像使用in时一样扫描全表。在这一点上not exists也一样
参数是子查询时,使用连接代替in
-- 使用连接代替in
select A.id,A.name
from Class_A A
join Class_B B
on A.id=B.id;
避免排序
会进行排序的代表性的运算有下面这些:
- group by子句
- order by子句
- 聚合函数(sum / count / avg / max / min)
- distinct
- 集合运算符(union / intersect / except)
- 窗口函数(rank / row_number等)
灵活使用集合运算符的all可选项
select * from Class_A
union
select * from Class_B;
select * from Class_A
union all
select * from Class_B;
使用exists代替distinct
-- 从商品表Items中找出同时存在于销售记录表SalesHistory中的商品
select