前言
今天下雨了,天气依旧炎热,心情有点低落。
昨天我们学习了连结表,我们今天学习表的高级联结
使用表别名
别名除了用于列名和计算字段外, SQL还允许给表名起别名。我们之前学习过对列取别名,实际上表也可以,用法类似,同样是借助关键字AS来实现。
比如这样我们就可以对表取别名,然后再使用完全限定的列名。
应该注意,表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机。
在之后的学习中,我们会经常用到表的别名,这个大家要熟悉。
使用不同类型的联结
针对表的联结方式,我们今天介绍以下三种:
自联结
通俗的来说,就是自己和自己联结。
比如说上面的例子就是自联结,注意自联结的时候要使用别名,不然会出现二义性,因为会有两个相同名字的列(两个表是一样的)
自然联结
自然联结排除多次出现,使每个列只返回一次。自然联结是这样一种联结,其中你只能选择那些唯一的列。这一般是通过对表使用通配符(SELECT *),对所有其他表的列使用明确的子集来完成的。
简单的说,什么意思呢?比如说我现在想联结A表和B表,A表中有一列ID列,B表中也有一列ID列,那么联结后的C表也只有一列ID列,而不会出现两列ID列。
迄今为止我们建立的每个内部联结都是自然联结,很可能我们永远都不会用到不是自然联结的内部联结
外部联结
这是最重要的联结方式,也是使用最广泛的联结方式之一
联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结
我们以A表和B表的外部联结为例,主要有一下两种情况:
- LEFT OUTER JOIN,左外联结,也可简写成LEFT JOIN(左联结),它返回左表中的所有记录,左表中的每一行去匹配右表,没有关联的值用NULL填充,;
- 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子句,如果有的话。
就到这里啦~