MySQL知识学习——第十六天:创建高级联结

前言

今天下雨了,天气依旧炎热,心情有点低落。

昨天我们学习了连结表,我们今天学习表的高级联结

使用表别名

别名除了用于列名和计算字段外, SQL还允许给表名起别名。我们之前学习过对列取别名,实际上表也可以,用法类似,同样是借助关键字AS来实现。
在这里插入图片描述
比如这样我们就可以对表取别名,然后再使用完全限定的列名。

应该注意,表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机。

在之后的学习中,我们会经常用到表的别名,这个大家要熟悉。

使用不同类型的联结

针对表的联结方式,我们今天介绍以下三种:

自联结

通俗的来说,就是自己和自己联结。
在这里插入图片描述

比如说上面的例子就是自联结,注意自联结的时候要使用别名,不然会出现二义性,因为会有两个相同名字的列(两个表是一样的)

在这里插入图片描述

自然联结

自然联结排除多次出现,使每个列只返回一次。自然联结是这样一种联结,其中你只能选择那些唯一的列。这一般是通过对表使用通配符(SELECT *),对所有其他表的列使用明确的子集来完成的。

简单的说,什么意思呢?比如说我现在想联结A表和B表,A表中有一列ID列,B表中也有一列ID列,那么联结后的C表也只有一列ID列,而不会出现两列ID列。

迄今为止我们建立的每个内部联结都是自然联结,很可能我们永远都不会用到不是自然联结的内部联结

外部联结

这是最重要的联结方式,也是使用最广泛的联结方式之一

联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结

我们以A表和B表的外部联结为例,主要有一下两种情况:

  1. LEFT OUTER JOIN,左外联结,也可简写成LEFT JOIN(左联结),它返回左表中的所有记录,左表中的每一行去匹配右表,没有关联的值用NULL填充,;
  2. RIGHT OUTER JOIN,右外联结,也可简写成RIGHT JOIN(右联结),它返回右表中的所有记录,右表中的每一行去匹配左表,没有关联的值用NULL填充;

A LEFT OUTER JOIN B,返回的记录条数与表A 的记录数一致,比如

看下面的表student
在这里插入图片描述
和表teacher
在这里插入图片描述
看下面左联结的例子
在这里插入图片描述
左表是表s(因为取了别名),右表是表t,所以最后会返回7条记录(和表s相等),我们在看联结条件,class相等,但是我们发现,表s中的第七条记录在表t中无法匹配,所以就用NULL填充。

上面的例子,我们同样可以用右联结实现
在这里插入图片描述
运行结果是一样的,因为上面的左表是表t,右表是表s,右联结返回的记录等于右表的记录。

我们发现其实左联结和右联结是可以相互转换的。

使用带聚集函数的联结

聚集函数可以和联结一起使用,看下面的例子

在这里插入图片描述

我们要搞清楚程序执行的流程,首先执行From子句,在进行右联结,得到下面的表
在这里插入图片描述
然后执行WHERE子句(如果有的话),然后再执行GROUP BY子句
得到下面的表,只看class列,分成了四组,

在这里插入图片描述
再执行HAVING子句,如果有的话,对分组进行过滤,然后再执行SELECT子句,最后在执行聚集函数,
在这里插入图片描述

再执行ORDER BY 子句,最后执行LIMIT子句,如果有的话。

在这里插入图片描述

就到这里啦~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值