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;

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

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

相关推荐
苏瞳儿4 小时前
java对数据库的增删改查
java·数据库·oracle
Greyson17 小时前
Layui表格如何使用第三方插件实现树形展示.txt
jvm·数据库·python
2401_871696527 小时前
mysql行级锁失效的原因排查_检查查询条件与执行计划
jvm·数据库·python
Elastic 中国社区官方博客8 小时前
Elasticsearch:快速近似 ES|QL - 第一部分
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
Dontla8 小时前
高基数(High Cardinality)问题介绍(Prometheus、高基数字段、低基数字段)
前端·数据库·prometheus
a9511416428 小时前
CSS如何实现元素隐藏不占位_使用display-none完全移除
jvm·数据库·python
SelectDB技术团队9 小时前
SelectDB Enterprise 4.0.5:强化安全与治理,构建企业级实时分析与 AI 数据底座
数据库·人工智能·apache doris
一 乐9 小时前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
ego.iblacat10 小时前
Redis 核心概念与部署
数据库·redis·缓存
m0_4939345310 小时前
如何监控AWR数据收集Job_DBA_SCHEDULER_JOBS中的BSLN_MAINTAIN_STATS
jvm·数据库·python