一、表的加法union 子句:将两个表格的数据整理到一个表格内coursecourse1
在这里我们看到有两个表,表的结构是相同的,数据仅有第一行是相同的。在这里,我们给他整合到一个表格内。
在这里我们可以看到,上表内的数据为表course与表course1表内数据整合,无重复数据。但是之前两表内第一行重复,如果保留重复行的话怎么办呢?
上图表内保留了重复行,我们只需在union子句后加入all即可。
二、表的联结
联结:通过表和表之间的关系将两个表合并在一起的操作(join子句)学生表student成绩表score
1.交叉联结(笛卡尔积)cross
将A表中的每一行与B表中的每一行都合并在一起。交叉联结后表格的行数是两个表格行数的乘积。交叉联结是所有联结的基础。
2.内联结 inner join
查找出同时存在于两张表的数据。
3.左联结 left join
查找左侧表格所有数据及与右侧相联结的数据。
在这里可以看到在表格b中没有学号为‘0002’学生的数据,如果在这基础上仅显示没有的数据,应该怎么进行呢?
4.右联结 right join
查找右侧表格所有数据及与左侧相联结的数据。
如果在这基础上仅显示没有的数据,应该怎么进行呢?
5.全联结 full join
两个表格的数据全部联结在同一表格中,返回结果为所有行,若没有对应的数据,则会出现空值行来补充。
但MYSQL不支持全联结,此处只做定义了解。
在这里,给大家展示一张示意图,便于理解。
三、联结应用案例
Q1:查询所有学生的学号、姓名、选课数、总成绩
分析思路:学号、姓名(学生表student)
选课数(每个学生的选课数目:成绩表score,按学号分组,对课程号进行计数count)
总成绩(每个学生的总成绩:成绩表score,按学号分组,对成绩求和sum)
sql子句:select查询结果[学号,姓名,选课数,总成绩]
from 从啊张表中查找数据[学生表student,成绩表score。两个表如何进行联结?通过学号。 on a.学号=b.学号 用哪种联结:左联结]
where 查询条件[无]
group by 分组[每个学生的选课数目:按学号分组,对课程号计数count;每个学生的总成绩:按学号分组,对成绩求和sum]
having 对分组结果指定条件[无]
order by 对查询结果排序[无]
limit 从查询结果中取出指定行[无]
Q2:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
分析思路:查询出所有学生的学号,姓名和平均成绩[学号、姓名(学生表student);平均成绩(每个学生的平均成绩:在成绩表score;按学号分组,平均成绩avg(成绩))]
平均成绩>85
sql子句:select查询结果[学号,姓名,平均成绩]
from 从啊张表中查找数据[学生表student,成绩表score。两个表如何进行联结?通过学号。 on a.学号=b.学号 用哪种联结:左联结]
where 查询条件[无]
group by 分组[每个学生的平均成绩:按学号分组,对成绩求平均avg]
having 对分组结果指定条件[avg(成绩)>85]
order by 对查询结果排序[无]
limit 从查询结果中取出指定行[无]
Q3:查询学生的选课情况:学号、姓名、课程号、课程名称
分析思路:学号、姓名(学生表student)
课程号、课程名称(课程表course)
sql子句:select查询结果[学号,姓名,选课数,总成绩]
from 从啊张表中查找数据[学生表student,课程表course。两个表如何进行联结?通过成绩表中间联结。 on a.学号=b.学号 on b.课程号=c.课程号 用哪种联结:内联结]
where 查询条件[无]
group by 分组[无]
having 对分组结果指定条件[无]
order by 对查询结果排序[无]
limit 从查询结果中取出指定行[无]
四、case表达式
作用:用于判断每行数据是否满足某个条件
判断表达式:最终只返回一个结果case when xxx then xxx
when xxx then xxx
else xxx
end
注意事项:else子句可不写,此时默认为当else时为空值,但为了更好的书写习惯,建议不要省略
end不可省略
case子句可写在sql子句中的任意句段中
何时使用case表达式:当有多种情况需要条件判断时