练习1:表的加法:如何合并两个表
练习2:表的联结
2.1交叉联结 cross join
2.2 内联结 inner join
将student表与score表关联,关联的要素为学号,两表无主次之分。若学号没有在两表中同时对应起来,则不返回。
2.3 左联结 left join
将student表与score表关联,关联的要素为学号,以左表为主,右表为次。若学号在左表中出现而右表中没有,则返回左表信息+右表空值信息。
若想只返回没有对应起来的部分,可以加WHERE语句将NULL值筛选出来
2.4 右联结 right join
将score表与student表关联,关联的要素为学号,以右表为主,左表为次。若学号在右表中出现而左表中没有,则返回左表空值信息+右表信息。
若想只返回没有对应起来的部分,可以加WHERE语句将NULL值筛选出来
2.5全联结 full join
将student表与score表关联,关联的要素为学号,两表无主次之分。若学号没有在两表中同时对应起来,则没有对应部分均返回空值。
当前SQL没有full join 语句
小结:(VENN图)
练习3:联结的应用案例
3.1查询所有学生的学号、姓名、选课数、总成绩
3.2 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
3.3查询学生的选课情况:学号、姓名、课程号、课程名称
练习4:case表达式
4.1查询出每门课程的及格人数和不及格人数
4.2使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分段人数:课程ID和课程名称
练习5:案例
数据来源:https://sqlzoo.net/wiki/The_JOIN_operation/zh,这部分题目使用的是‘2012年欧洲足球锦标赛’数据库里的表。
1.比赛信息表game
id比赛编号,mdate比赛日期, stadium比赛地点, team1对战双方(球队编号1), team2对战双方(球队编号2)
2.进球信息表goal
matchid比赛编号,teamid球队编号, player进球球员的姓名,gtime多长时间进的球(从开始比赛到进球多长时间,单位:分钟)
3.球队信息表eteam
id球队编号(联结2) teamname 球队名称 coach教练
联结节点:
- 比赛信息表game(id比赛编号)和进球信息表goal(matchid比赛编号)通过‘比赛编号’联结
- 进球信息表goal(teamid球队编号)球队信息表eteam(球队编号id)通过‘球队编号’联结