33
1.表的加法(union)
表的加法是将两个表的数据,按照行合并到一起。合并时会把重复的数据删除。
如果想保留重复的行,应在union后加all
练习一:如何合并两个表?
方法一:新建course1表后合并
方法二:course-复制表-数据与结构-重命名-打开表-修改数据-写下两表合并的sql语句
2.表的联结
使用as关键字方便使用,列名前要加表的别名,innerjoin 选出同时存在两个表中的数据。
内联结的sql语句:
select a.学号,a.姓名,b.课程号
from student as a inner join score as b
on a.学号=b.学号
左联结的sql语句:
select.a.学号,a.姓名,b.课程号
from student as a inner join score as b
on a.学号=b.学号
SELECT a.学号,a.姓名,b.课程号
from student as a LEFT JOIN score as b
on a.学号=b.学号
WHERE b.学号=NULL
右联结的aql语句:
SELECT a.学号,a.姓名,b.课程号
from student as a RIGHT JOIN score as b
on a.学号=b.学号
WHERE a.学号=NULL、
全联结
联结应用案例:
练习二:查询所有学生的学号,姓名,选课数,总成绩
分析思路:因为涉及到两张表所以要用到联结-如何联结?-通过学号-用哪种联结?因为查找每个学生的信息,要保留学生表里的所有学号-左联结-where 查询条件无-group by分组,每个学生的选课数-按学号分组对课程数计数count-按学号分组,对学生成绩进行求和sum-having无-order by 对结果排序无-limit无
练习三:查询平均成绩大于85分的所有学生的学号,姓名,平均成绩。
仍然涉及学生表student与score成绩表;因为是联结查询,要在select子句中的各个列名加上表的别名。
因为平均成绩是分组后得到的。分组结果加上条件—。用Having子句。
练习四:查询学生的选课情况:学号,姓名,课程号,课程名称(此题涉及三表联结)
CASE 表达式
练习五:查询成绩是否及格
select 学号,成绩,课程号,
(case when 成绩>=60 then’及格’
when 成绩<60 then’不及格’
else null
end)as 是否及格
from score;
查询出每门课程的及格人数和不及格人数
当有多种情况需要条件判断时候,使用case 表达式
使用分段【100-85】,【85-70】,【70-60】,【<60】来统计各科成绩,来统计各科成绩,分别统计各分数段人数,课程号和课程名称。
这道题遇到了很多问题,在社群会员的帮助下,终于得到了正确答案。
错误答案:错误原因是第一行select b.课程名称后面要加逗号,
from行中 a.课程号应该等于b.课程名称
正确答案
SQLZOO 练习:Join Operation
分析思路:
首先分析问题,求对德国的比赛中得分的球员姓名。
要用到哪张表?球员姓名在goal表,对战德国的比赛,说明主场team1或者客场team2有一方应是德国,用到game表。
两表关系:两表内联结,但有重复值,用distinct去掉
条件:用teamid!='GER'防止列出德国球员;主客场有一方是德国,所以a.team1='GER' or a.team2='GER
code:
SELECT distinct(b.player)
FROM game as a inner join goal as b ON a.id = b.matchid
WHERE b.teamid!='GER'and (a.team1='GER' or a.team2='GER')
错误答案;
正确答案,其中order by改为group by;from条件中,ON处matchid=teamid
查询结果要求有比赛日期