left join左表百万数据查询慢_SQL基础----(五)多表查询

(一)关键知识点

1.1 纵向拼接(union,union all)

43cf733d5878e82a1c3c8ec9f5567970.png

c111acaadb9bc3b0cbb8ae7d7b29cde5.png
union 过滤重复记录行,次序上表,下表中过滤重复记录行

e4b6bda512f18a57a7db16cc75a3643b.png

1.2 横向拼接(关系拼接,不使用select过滤字段,则临时表关键字段在左表及右表中均显示)

3a367661d9303fb4043f62ad5724ee2a.png

a423a8139e789d5e71f6751e68dfa0ca.png
null值的巧用,可以协助过滤数据;

1.2.1 交叉联结(cross join)

  • 案例

73a34ec24aa76d9ed0fa07155600a394.png
  • 注意事项

(1) 数据未筛选,总数量等于两表数量的乘积;

(2) 交叉联结实际使用较少,其余各联结的基础(对应第二步) ;

1.2.2 内联结(inner join,默认联结,等价于join)

  • 案例

577b13ae6eb28866a43c3bff39291ade.png

c231aaa011aa7451d151a59c4b975844.png

160147d1951099ec65f94b608aab79a5.png
  • 注意事项

(1) 第一步 选择,选中与右表中关键字相同的左表记录,与左表中关键字相同的右表记录;

(2) 第二步 基于关键字段完成交叉连接

1.2.3 左联结(left join)

  • 案例

620fe39758a43ce3610eac1e6cbbdca1.png

ea2c826e8ac8128a78c7d8548e3171ea.png

eea1ccb8c64399e3c5cefddff67e58be.png
  • 注意事项

(1) 第一步选择,选中与左表全部记录,与左表中关键字相同的右表记录;

(2) 第二步 基于关键字段完成交叉连接;

(3) 注意,关键字不匹配时,会用Null行填充;

1.2.4 右联结(right join)

  • 案例

f964050742260114b2be8f5df1e449bc.png

31c1c3e396fabc8ddb979a494e8771ed.png

89cc0a4c755b2eee322a47abce71aedc.png
  • 注意事项

(1) 第一步选择,选中与右表全部记录,与右表中关键字相同的左表记录;

(2) 第二步 基于关键字段完成交叉连接

(3) 注意,关键字不匹配时,会用Null行填充;

1.2.5 全联结(full join)

  • 案例

defaffdf5f920c8dce34623001c926a2.png

803120ba5f3ff9514264e0e109189d11.png
  • 注意事项

(1) 第一步选择,选中与左表全部记录,选中右表中全部记录;

(2) 第二步 基于关键字段同时完成inner联结,left 联结,right 联结;

(3) mysql 不支持full join;

1.3 case 语句(多条件判断)

47d436d41736b80a13542236657995cf.png
case when then else end完整的结构
  • 运行顺序

7fe59b1441440d97d3c621048ff81a7e.png
第一判断,满足条件,退出后续条件的比较

d74159296b4847552eb4440473a1e65d.png
第一条件,不满足,继续第二条件判断,满足,退出;
  • 案例

1d2ab3a0a70025167e0f8544baa39496.png
  • 注意事项

(1) 多条件,依次判断,第一条满足,直接退出后续判断,第一条不满足,继续第二条判断;

(2) case 语句可以位于多个子句,形如:select等等

(二)联结分析演示

1164a152dd246a37d9b09e5ad62f47c0.png

eaae4e1ea9817936d2b858c953ec54fa.png

d350c93205d5eeb89a4cdf2280cdc4e1.png

8f561ab4260efb939f7defd5a8f6ba98.png

(三)联结实操

use 

(四)SQL ZOO实操

1ced89623ae754447e41e2255ec6e6e3.png

ef94ac27f9e796e901090936376d94f9.png

3474ce8d446bd3168955b0c664f3c815.png

b5b9e4c333580bf20b207deb66b3a04a.png

96c36dac5b68b692f9beab622c21ceba.png

a42bcf3b884dce81d7034daa76557255.png

注意事项:

  • 多表left join是会生成一张临时表,并返回给用户
  • on条件是对left join的右表追加条件过滤,目的缩小右表选择出来的有效数据,比原右表的默认选择行数要少
  • on条件中如果有对左表的限制条件,无论条件真假,依然返回左表的所有行,但是会影响右表的匹配值。也就是说on中左表的限制条件只影响右表的匹配内容,不影响返回行数。
  • where条件是针对宽临时表进行过滤
  • 在where子句,或者联结方式时,仔细考虑临时表中Null记录行的取舍情况

8d08f65a09ff6eecd7e9b3cfc4d311d7.png

70fc5a3b8d85ea3ea46500eb212c59ce.png

35cfcfc985a3de07fcb168c9e037c869.png
注意对于左表,德国队可以是team1,也可以是team2,对于右表,德国队的球门一定是其他球队踢进的,不是自己队的球员踢进去的;球员可能重复进球,需要排除重复;

8b9fe995c12d275a3352d956a57cb6e8.png

1bddaba054d1d2fb4cba67ace675ddfb.png

880f190e5d3ac094888cb9e05b6698a2.png
POL作为参赛方之一,全场两个球门的进球数

147cc400052a7a5b5518a9b57812579b.png
GER作为参赛方之一,仅计算GER的进球数

ba871fe1d595fd4e83af4249114073e1.png
方法一:计数条件a.team2=b.teamid,表示team2进球

f5d4acd3ad47e5906ace0e9ea87d7dbd.png
方法二:分别计算team1,team2,基于mdate,id将两表联结,count(列名),其中空值不参加计数;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值