复习表别名
之前已经学习过,查询的时候可以使用as
来对检索的列进行重命名,这样可以让sql更加简介,增强易读性(as可以省略)
此外,使用表别名还可以支持在一条select语句中,一个表是被多次使用
自连接
我们来构建一个需求:
我知道有一位教师名字叫做王小强,我想知道王小强是什么级别的教师,并且全校跟他一个级别的教师都有谁:
selectt1.teacher_name,t1.title
fromteachers as t1,teachers as t2
wheret1.title = t2.titleand t2.teacher_name = '王小强';
这里边引申一下, 我们如果把上边的sql改成这样子:
selectt1.teacher_name,t1.title
fromteachers as t1,teachers as t2
wheret1.title = t2.titleand 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
假如我们要查询下边的数据:
找出来所有教师的工号,以及教师担任班主任的班级名称
这里边可能包含一种情况,就是有的教师可能不是班主任,没有关系,也要一起查询出来:
selectteachers.teacher_id,classes.class_name
fromteachersleft join classes on teachers.teacher_id = classes.head_teacher_id;
这里边我们使用的是left join
,左连接,这样会指向join左边表的所有记录,包括没有在右边表关联起来的行
右连接:right join
同样对应的,右连接就是righjt join
,我们直接使用上一条sql举例:
selectteachers.teacher_id,classes.class_name
fromteachersright join classes on teachers.teacher_id = classes.head_teacher_id;
这样就是把右边表的所有记录查询出来
以上就是关于连接相关的内容了,下期不讲理论,直接找几个实际的例子,实战演练!