- 表的加法
- 表的联结
- 联结应用案例
- case应用案例
一、表的加法
加法:union
表的加法是把两个表的数据,按行合并在一起。
表的加法,会把两个表里重复的数据删除,只保留一个。
如果想保留重复数据,可以使用 union all
这样就保留了全部的重复数据
二、表的联结
- 交叉联结
- 内联结
- 左联结
- 右联结
- 全联结
(1)交叉联结-cross join
交叉联结也叫作 笛卡尔积
(2) 内联结 - inner join
内联结 是同时查找出存在于两张表中的数据
内联结步骤:根据条件,从两张表中找出符合条件的行,再通过交叉联结合并
写法:
结果:
(3) 左联结 - left join
左联结是把左边表中的数据,全部取出来
左联结步骤:将左侧的表作为主表,主表中的数据全部读取出来。再根据条件,取出右边表中符合条件的行,通过交叉联结合并。
写法:
结果:
下面我们来看个问题,下图中,红色的部份如何用SQL表示出来,
写法:
结果:
(4) 右联结 - right join
右联结是把右边表中的数据,全部取出来
右联结步骤:将右侧的表作为主表,主表中的数据全部读取出来。再根据条件,取出左边表中符合条件的行,通过交叉联结合并。
写法:
结果:
下面我们来看个问题,下图中,红色的部份如何用SQL表示出来,
写法:
结果:
本次结果,因为右边score表中,所有数据在左表中都存在,所以结果为空。
(5) 全联结 - full join
全联结步骤:返回左边和右表所有的行。当条件匹配时,两个行进行合并,如果不匹配,另一个表中对应的值用空值来填充。
需要注意下,mysql是不支持全联结的,这里理解下概念即可。
三、总结-一张表记住所有联结
四、联结应用案例
- 问题1:查询所有学生的学号、姓名、选课数、总成绩
写法:
结果:
- 问题2:查询平均成绩大于85分的所有学生的学号、姓名和平均成绩
写法:
结果:
- 问题3:查询学生的选课情况: 学号, 姓名, 课程号, 课程名称
这里涉及到3张表的联结了
写法:
结果:
五、case表达式
案例:
下面我们要来看一下,查询每门课程的及格和不及格人数。我们按照课程号分组,但是每门课程对应的不是一个值,而是两个值:及格和不及格。相当于两种情况,这样的问题就可以用case表达式来实现。
写法:
使用case表达式注意事项:
(1)else子句可以省略,会默认为空值但为了更好的书写习惯,最好还是保留
(2)end不能省略不写
(3) case表达式可以写在sql语句的任意子句里
case表达式的作用:当有多种情况需要条件判断时,就可以使用case表达式
下面我们再来看一个案例
- 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称。
分析:这里要用到两个表,课程表和成绩表
写法:
这里为什么要使用两个列来分组呢。因为使用group by时,select子句里面的列名,只能是group by 里面的列名,或者使用聚合函数的。