MySQL零基础教程16—表连接进阶

复习表别名

之前已经学习过,查询的时候可以使用as来对检索的列进行重命名,这样可以让sql更加简介,增强易读性(as可以省略)

此外,使用表别名还可以支持在一条select语句中,一个表是被多次使用

自连接

我们来构建一个需求:

我知道有一位教师名字叫做王小强,我想知道王小强是什么级别的教师,并且全校跟他一个级别的教师都有谁:

sql 复制代码
select
    t1.teacher_name,
    t1.title
from
    teachers as t1,
    teachers as t2
where
    t1.title = t2.title
    and t2.teacher_name = '王小强';

这里边引申一下, 我们如果把上边的sql改成这样子:

sql 复制代码
select
    t1.teacher_name,
    t1.title
from
    teachers as t1,
    teachers as t2
where
    t1.title = t2.title
    and t1.teacher_name = '王小强';

t1和t2不是都是同一个teachers的别名吗,为什么第二条sql执行的结果是这样的呢?

首先因为teachers表建立了自连接,所以就会形成教师表自身的笛卡尔积

对于第一条sql,where过滤条件执行:

  • t2.teacher_name = '王小强':只保留 t2 中姓名为"王小强"的记录
  • t1.title = t2.title:筛选 t1 中与 t2(即王小强)职称相同的记录

解释:找到所有职称与"王小强"相同的教师(包括王小强自己)

对于第二条sql执行逻辑:

  • t1.teacher_name = '王小强':只保留 t1 中姓名为"王小强"的记录
  • t1.title = t2.title:筛选 t2 中与 t1(即王小强)职称相同的记录

解释:

t1 中固定为"王小强"的记录(1行)。

t2 中所有职称与"王小强"相同的记录(共2行:王小强和张伟)。

最终结果会 重复显示"王小强",次数等于 t2 中满足条件的行数。

为什么第二条SQL出现重复?

其实本质是笛卡尔积的副作用:当 t1 固定为"王小强"时,t2 中每一条职称相同的记录都会与 t1 组合,导致重复。

结果行数公式:

结果行数 = t1 中匹配 teacher_name='王小强' 的行数 × t2 中匹配相同职称的行数。

外部连接

左连接:left join

假如我们要查询下边的数据:

找出来所有教师的工号,以及教师担任班主任的班级名称

这里边可能包含一种情况,就是有的教师可能不是班主任,没有关系,也要一起查询出来:

sql 复制代码
select
    teachers.teacher_id,
    classes.class_name
from
    teachers
    left join classes on teachers.teacher_id = classes.head_teacher_id;

这里边我们使用的是left join,左连接,这样会指向join左边表的所有记录,包括没有在右边表关联起来的行

右连接:right join

同样对应的,右连接就是righjt join,我们直接使用上一条sql举例:

sql 复制代码
select
    teachers.teacher_id,
    classes.class_name
from
    teachers
    right join classes on teachers.teacher_id = classes.head_teacher_id;

这样就是把右边表的所有记录查询出来

以上就是关于连接相关的内容了,下期不讲理论,直接找几个实际的例子,实战演练!

相关推荐
Dann Hiroaki44 分钟前
文献分享: ConstBERT固定数目向量编码文档
数据库·机器学习·自然语言处理·nlp
黑风风1 小时前
探索 Ubuntu 中的 Hostname 配置与管理
数据库·ubuntu·php
rkmhr_sef2 小时前
MyBatis-Plus 自定义 SQL 和复杂查询
数据库·sql·mybatis
Craaaayon2 小时前
Docker基础-自定义镜像与容器网络
java·运维·网络·数据库·后端·docker·容器
茂桑3 小时前
记录一次Spring事务失效导致的生产问题
数据库
天地风雷水火山泽3 小时前
二百八十五、华为云PostgreSQL——建分区表并设置主键
数据库·postgresql·华为云
IT程序媛-桃子3 小时前
Oracle连接满了,无法登录数据库,如何分析连接来源?
数据库·oracle
Watink Cpper4 小时前
[MySQL初阶]MySQL(3)表的约束
linux·运维·服务器·数据库·mysql·表的约束
然子而4 小时前
苍穹外卖学习笔记(跳过微信支付)
java·spring boot·git·学习·mysql·maven·mybatis
Craaaayon4 小时前
Docker基础-常见命令与数据卷
java·数据库·后端·mysql·docker·容器·eureka