数据库学习之MySQL (十六)—— SQL99 外连接 左外连接 右外连接 全外连接 交叉连接

外连接 之 左外连接 与 右外连接

我们先来看个之前的 女神男朋友的案例
传送:数据库学习之MySQL (十三)——多表查询 SQL92 SQL99 连接种类划分
在这里插入图片描述
在这里插入图片描述
我们先考虑一一映射的情况 也就是男女不会脚踏多条船 而是一对一的
那么 之前说了 我们以女神为主
以女生的信息为主表 会有12行 因为有12个女生实例 匹配不到男生的就空着
在这里插入图片描述
以男生为主 以男生的信息为主表 则明显 只会有4个男生对象实例
在这里插入图片描述
这里,因为没有一一映射 (张有三个女朋友) 导致多了两行 但实际上是以男生为主表

那么 以······为主 代码上怎么实现呢?
我这里放第一个 女神为主表的实现代码:

USE data1;
SELECT 
  a.`id` AS 女神id,
  a.`name` AS 女神名字,
  a.`phone` AS 女神电话,
  a.`boyfriend_id` AS 男朋友id,
  b.`boyName` AS 男朋友名字 
FROM beauty AS a
LEFT JOIN boys AS b

ON a.`boyfriend_id` = b.`id`;

LEFT 关键字尤为重要 全称为LEFT OUTER 左外连接 可以省略outer

或者我这么写

FROM beauty AS a LEFT JOIN boys AS b

懂了吧?left 左边为主表 所以是左外连接

那么 我这么写呢?

USE data1;
SELECT 
  a.`id` AS 女神id,
  a.`name` AS 女神名字,
  a.`phone` AS 女神电话,
  a.`boyfriend_id` AS 男朋友id,
  b.`boyName` AS 男朋友名字 
FROM  boys AS b
RIGHT JOIN beauty AS a

ON a.`boyfriend_id` = b.`id`;

答案是一样的

所以用的时候 左右连接 选一个就OK 一个道理而已

为啥要用外连接

我们看过十三节 其实用内连接的 等值连接 人家很智能的会把匹配不到的给去掉
现在我们把匹配不到的给弄出来的岂不是画蛇添足?

其实不然
比如我还看到别的信息呢?也就是女神我一定要看 有没有男朋友我不是很在意 那就需要全表

基于全表 我们再怎么筛选也不会漏数据(漏女神)

全外连接

所谓全外 就是左外+右外
啥意思?两个表都是主表
那么 两个表的所有实例都会表现出来 无论是否匹配得到
那么按照之前

名称关键词主表实例
左外LEFT女神为主表12个实例女神
右外RIGHT男神为主表4个实例男神
全外FULL两个都是主表16个实例神
USE data2;
SELECT 
  b.`id` AS 男神id,
  b.`boyName` AS 男神名字,
  b.`userCP` AS 男神指数,
  a.`id` AS 女神id,
  a.`name` AS 女朋友名字 
FROM beauty AS a
FULL JOIN boys AS b
ON a.`boyfriend_id` = b.`id`;

在这里插入图片描述
不过 MySQL 支持 全连接 其他的都OK 这里就不测试了 代码可以在支持的SQL引擎中实现:

总结 内连接 外连接

我拿男神女神匹配这个案例来说
男神是女神的真子集 也就是匹配完 女生还有圣女 男生全都抱得美人归了

名称关键词结果数学表达实例
内连接INNER互相都能匹配得到的交集4个实例CP神
左外连接RIGHT左边的女神实例保留 其他尽量匹配 匹配不到为NULL女神集4个实例男神
右外连接FULL右边的男神实例保留 其他尽量匹配 匹配不到为NULL男神集16个实例神
全外连接FULL左右神的实例都保留 匹配不到就为NULL全集16个实例神

这个是结合代码的示意图 看看能否理解:
在这里插入图片描述

交叉连接

还记得我们之前的那个 笛卡尔乘积 问题嘛
传送:数据库学习之MySQL (十三)——多表查询 SQL92 SQL99 连接种类划分

其实就好像数学考试的握手游戏
这里 每个人(男神或者女神)都必须要和其他所有异性匹配 成一行实例输出

我们当时没用多表查询 瞎搞出来的代码,出来了这样的效果
在这里插入图片描述
其实 交叉连接就是得到这样的结果
这两段代码是等效
意思 不用INNER OUTER限定 默认就是交叉连接

#1  错误写法
SELECT * FROM `beauty`,`boys`  


#2  SQL99 交叉连接写法
SELECT 
  a.*,
  b.* 
FROM
  `beauty` AS a,
  `boys` AS b 
CROSS JOIN `boys` ;

下一站:数据库学习之MySQL (十七)—— SQL99 主查询与子查询 子查询分类之WHERE的子查询

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值