1-11 让SQL飞起来-SQL进阶教程

使用高效的查询

参数是子查询时,使用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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值