python怎样实现多表连接_python实现简易数据库之三——join多表连接和group by分组...

本文介绍了如何使用Python实现多表连接,包括双表等值连接和多表join,通过优化查询顺序降低时间复杂度。此外,还探讨了group by分组操作,通过属性拼接实现分组,利用map进行聚集函数运算。
摘要由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上进行等值连接,看图很简单:

A113249177-4367.jpg_small.jpg

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

来看一下执行的结果:

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_AV

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值