两表联查分组_join多表连接和group by分组

本文介绍了如何优化多表连接和GROUP BY分组操作,包括双表等值JOIN和多表JOIN的处理方法,以及利用字符串拼接进行分组的技巧。通过实例展示了优化后的查询效率提升。
摘要由CSDN通过智能技术生成

上一篇里面我们实现了单表查询和top N查询,这一篇我们来讲述如何实现多表连接和group by分组。

一、多表连接

多表连接的时间是数据库一个非常耗时的操作,因为连接的时间复杂度是M*N(M,N是要连接的表的记录数),如果不对进行优化,连接的产生的临时表可能非常大,需要写入磁盘,分多趟进行处理。

1、双表等值join

我们看这样一个连接sql:

selectPS_AVAILQTY,PS_SUPPLYCOST,S_NAMEfromSUPPLIER,PARTSUPPwhere PS_SUPPKEY =S_SUPPKEYand PS_AVAILQTY > 2000and S_NATIONKEY = 1;

可以把这个sql理解为在SUPPLIER表的S_SUPPKEY属性和PARTSUPP表的PS_SUPPKEY属性上作等值连接,并塞选出满足PS_AVAILQTY > 2000和 S_NATIONKEY = 1的记录,输入满足条件记录的PS_AVAILQTY,PS_SUPPLYCOST,S_NAME属性。这样的理解对我们人来说是很明了的,但数据库不能照这样的方式执行,上面的PS_SUPPKEY其实是PARTSUPP的外键,两个表进行等值连接,得到的连接结果是很大的。所以我们应该先从单表查询条件入手,在单表查询过滤之后再进行等值连接,这样需要连接的记录数会少很多。

首先根据PS_AVAILQTY > 2000找出满足条件的PARTSUPP表的记录行号集A,然后根据S_NATIONKEY = 1找出SUPPLIER表找出相应的记录行号集B,在记录集A、B上进行等值连接,看图很简单:

b2b2631cf06ded4e92e341e3117d60ec.png

依次扫描的时间复杂度为max(m,n),加上折半查找,总的时间复杂度为max(m,n)*(log(m1)+log(n1)),其中m1、n1表示where条件塞选出的记录数。

来看一下执行的结果:

48304ba5e6f9fe08f3fa1abda7d326ab.png

Input SQL:selectPS_AVAILQTY,PS_SUPPLYCOST,S_NAMEfromSUPPLIER,PARTSUPPwhere PS_SUPPKEY =S_SUPPKEYand PS_AVAILQTY > 2000

and S_NATIONKEY = 1;

{'FROM': ['SUPPLIER', 'PARTSUPP'],'GROUP': None,'ORDER': None,'SELECT': [['PARTSUPP.PS_AVAILQTY', None, None],['PARTSUPP.PS_SUPPLYCOST', None, None],['SUPPLIER.S_NAME', None, None]],'WHERE': [['PARTSUPP.PS_AVAILQTY&

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值