以上表为练习需要的数据表
PART1 表的加法练习(union语句)
1.union语句
此处先创建一张新的表,命名为course1并且插入数据如下:
将course表和course1表用union语句进行两表相加,sql语句为:
SELECT 课程号,课程名称 FROM course UNION SELECT 课程号,课程名称 FROM course1;
执行以上语句得到
注意到course1表中课程号为0001的这一行数据因为在course表有一行完全一样的数据,所以合并为一条数据了.
2.union all
如果想保留course1中课程号为0001的哪一行,那么在上述sql语句的union后加一个单词'all'
SELECT 课程号,课程名称,教师号 FROM course UNION ALL SELECT 课程号,课程名称,教师号 FROM course1;
执行该语句得到结果如下
如果想要表的加法不合并相同数据的话,就使用union all语句
PART2 表的联结练习(join语句)
1.内联结(inner join)
SELECT a.学号,a.姓名,b.课程号,b.成绩 FROM student AS a INNER JOIN score AS b ON a.学号=b.学号;
2.左联接(left join)
SELECT a.学号,a.姓名,b.课程号 FROM student AS a LEFT JOIN score AS b ON a.学号=b.学号;
3.右联结(right join)
SELECT a.学号,a.姓名,b.课程号 FROM student AS a right JOIN score AS b ON a.学号=b.学号;
4.联结章节练习
问题一:查询所有学生的学号、姓名、选课数、总成绩
SELECT a.学号,a.姓名,count(b.课程号)AS 选课数,SUM(b.成绩)AS 总成绩 FROM student as a LEFT JOIN score AS b on a.学号=b.学号 GROUP BY a.学号;
问题二:查询平均成绩大于85的所有学生的学号、姓名和平均成绩
SELECT a.学号,a.姓名,avg(b.成绩) AS 平均成绩 FROM student AS a LEFT JOIN score as b ON a.学号=b.学号 GROUP BY a.学号 HAVING avg(b.成绩)>85;
问题三:查询学生的选课情况:学号,姓名,课程号,课程名称
SELECT a.学号,a.姓名,c.课程号,c.课程名称 FROM student AS a LEFT JOIN score AS b ON a.学号=b.学号 LEFT JOIN course AS c ON b.课程号=c.课程号 ORDER BY a.学号;
PART3 case表达式练习
问题一:查询出每门课程的及格人数和不及格人数
SELECT 课程号,SUM(CASE WHEN 成绩>=60 THEN 1 ELSE 0 END)AS 及格人数,SUM(CASE WHEN 成绩<60 THEN 1 ELSE 0 END)AS 不及格人数 FROM score GROUP BY 课程号;
问题二:使用分段【100-85】,【85-70】,【70-60】,【<60】来统计各科成绩,分别统计各分段人数:课程ID和课程名称
SELECT a.课程号,课程名称,
SUM(CASE WHEN a.成绩 BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS '85-100分段分数',
SUM(CASE WHEN a.成绩<85 AND a.成绩>=70 THEN 1 ELSE 0 END) AS '70-85分段分数',
SUM(CASE WHEN a.成绩<70 AND a.成绩>=60 THEN 1 ELSE 0 END) AS '60-70分段分数',
SUM(CASE WHEN a.成绩<60 THEN 1 ELSE 0 END) AS '<60分段分数'
FROM score AS a INNER JOIN course AS b ON a.课程号=b.课程号
GROUP BY 课程号,课程名称;
part4 sqlzoo的练习
登录sqlzoo的网址
SQLZOOsqlzoo.net选择左侧导航栏里面的JOIN练习章节进行练习
如下: