mysql全外连接和笛卡尔积_「笛卡尔积」mysql 内连接、左连接会出现笛卡尔积? - seo实验室...

笛卡尔积

这周的部门周会,分享的同事说的是数据库优化相关,过程中,一个同事跟我讨论左连接查询,是不是笛卡尔积。我第一反应,左连接肯定不是笛卡尔积啊,左连接是以左表为准,左表有m条记录,则结果集是m条记录(哈哈,如果是你,你是不是也是这样的反映),同事听了,说内连接会是笛卡尔积。听到这句话的我的表情是这样的

b8d600e0d280ebd4a080674741c98a3c.png

散会后,在数据库里试验了一下,发现,事实比想象中要复杂。首先说下结论:链接查询,如果on条件是非唯一字段,会出现笛卡尔积(局部笛卡尔积);如果on条件是表的唯一字段,则不会出现笛卡尔积。

下面是具体的试验:

文中会有两张表,user表和job表,表数据如下

93a520bbba80e0126a88bcec23854a6f.png

cf5116810a4aae4da5e8df6bfa3df388.png

交叉连接

SELECT

*

FROM

`user` CROSS JOIN job;

这种等同于(交叉查询等于不加on的内连接)

SELECT

*

FROM

`user` , job;

sql执行结果:

a08aa4d1b2b460bde10dae48b6f0f88c.png

结论:交叉连接,会产生笛卡尔积。

内连接

内连接唯一字段

SELECT

*

FROM

`user` u JOIN job j ON u.JOB_ID=j.ID;

5ae4246062e43d8d0d7adf7badd8f3a7.png

结论:假如,内连接查询,on条件是A表或者B表的唯一字段,则结果集是两表的交集,不是笛卡尔积。

内连接非唯一字段

如果A表有m条记录,m1条符合on条件,B表有n条记录,有n1条符合on条件,则结果集是m1*n1

SELECT

*

FROM

`user` u JOIN job j ON u.valid=j.valid;

c948c1d51e525c5e384a393b455c710e.png

结论:假如,on条件是表中非唯一字段,则结果集是两表匹配到的结果集的笛卡尔积(局部笛卡尔积) 。

外连接

左连接

左连接唯一字段

假如A表有m条记录,B表有n条记录,则结果集是m条

SELECT

*

FROM

user u left join job j ON u.JOB_ID=j.id;

2aa7e810e9f60aa133f1973655cc9454.png

结论:on条件是唯一字段,则结果集是左表记录的数量。

左连接非唯一字段

如果A表有m条记录,m1条符合on条件,B表有n条记录,有n1条符合on条件,则结果集是 (m-m1) + m1*n1

SELECT

*

FROM

`user` u LEFT JOIN job j ON u.VALID=j.VALID;

828db594f8ede30b04f1b7a150bf48c5.png

结论:左连接非唯一字段,是局部笛卡尔积。

右连接

同左连接,这里就不赘述了

全外连接

相关阅读

卷积神经网络(Convolutional Neural Network)是一个专门针对图像识别问题设计的神经网络。它模仿人类识别图像的多层过程:瞳孔摄入像

支付宝运动里最近又出现一个新的活动了,用蚂蚁积分可以参加一个行走的积分赛,完成挑战会有一定的积分奖励还有额外奖励。那么支付宝

资本公积<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />目录概述资本公积的内容资本公积的核算

触发器是由MySQL的基本命令事件来触发某种特定操作,这些基本的命令由INSERT、UPDATE、DELETE等事件来触发某些特定操作。满足触发

TIMESTAMPDIFF用法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 返回日期或日期时间表达式datetime_expr2- datet

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值