表的加法:将多张表的同列数据整合到一张表上
关键词:union 删除重复行 union all 保留重复行
表的联结:将多张表的不同列数据整合到一张表上(join)
- 交叉联结(笛卡尔积):两张表的各行和各列两两组合,是所有联结的基础
- 内联结:取出同时存在于两张表中的数据(交集)后进行交叉联结
关键词:inner join;from中有两张表;用on来进行联结
select a.学号,b.姓名,b.课程号
from student as a inner join score as b
on a.学号=b.学号
从两张表中取数据时需要注意字段分别属于哪张表
3. 左/右联结:取出左/右表中的所有数据与右/左表相同行进行交叉联结,没有对应行时显示为空值
关键词:left/right join;from中有两张表;用on来进行联结
select a.学号,b.姓名,b.课程号
from student as a left/right join score as b
on a.学号=b.学号
当添加子句where b.学号 is null时取出去掉两表公共部分的数据
右联结:在course中添加一条数据:
右联结取出右表中所有的数据,左表中无对应的数据就显示null
取出只在右表中的数据:
当有多张表做联结时,一般采用left join,先将学生表和成绩表通过学号做联结,生成一张大表,再用left join,将大表与课程表通过课程号做联结,同理与教师表再进行联结。
生成表以后还是可以用查询条件以及排序条件进行排序
4. 全联结:取出两表的所有行,有相同的行进行合并,不相同的行用空值表示
关键词:full join;mySQL不支持
练习
- 查询所有学生的学号(左联结student表),姓名,选课数(课程计数),总成绩(成绩汇总)
两表联结时必须指明列从哪张表中来,否则会报错
当学号从成绩表中选择时,0004号的学号就不会显示
如果采用右联结,即会显示在成绩表中所有学生的成绩,但是不一定有姓名显示,因为学生表中没有0005号学生的记录。
如果采用内联结,只会显示在2张表中同时存在的学生信息,而要查询这两张表中所有学生的成绩只有在学生表中补上所有学生的信息才能显示,即要查询所有学生的信息需要确保学生表中的信息是完整的。如果有数据缺失,那就需要分别用左右联结找出缺失的部分进行补足。
2. 查询平均成绩大于85的所有学生的学号,姓名和平均成绩
聚合函数不能在where子句中使用,只能用于having子句中筛选
3. 查询学生的选课情况:学号,姓名,课程号,课程名称
case表达式:用于对相关条件的判断
case when<判断1> then<表达式1>
when<判断2> then<表达式2>
...
else Null
end
关键词:case、end不能省略;else 可以省略
用多种条件进行判断时,可以用group by进行分组,前提是这几列的数据全部相同才能进行合并
练习:
- 查询出每门课的及格和不及格人数
查询出分段成绩的人数:
与 excel中的if函数不同,每个查询条件不会剔除上一个条件的值,因此,条件不能有相互交叉
SQLZOO