sql 相加_从零学会SQL-多表查询

5900349d5e93e29bf6222104102e82f9.png

f6a81082b921042a84c8534e08d9f4e0.png

以上表为练习需要的数据表

PART1 表的加法练习(union语句)

1.union语句

此处先创建一张新的表,命名为course1并且插入数据如下:

16b8b3ab9ab69e6141a6e0795ce8cf23.png

将course表和course1表用union语句进行两表相加,sql语句为:

SELECT 课程号,课程名称 FROM course UNION SELECT 课程号,课程名称 FROM course1;

执行以上语句得到

b4b85163b74959bd9dbd8225274ed1de.png

注意到course1表中课程号为0001的这一行数据因为在course表有一行完全一样的数据,所以合并为一条数据了.

2.union all

如果想保留course1中课程号为0001的哪一行,那么在上述sql语句的union后加一个单词'all'

SELECT 课程号,课程名称,教师号 FROM course UNION ALL SELECT 课程号,课程名称,教师号 FROM course1;

执行该语句得到结果如下

96374953c10027ecd081410f55e13436.png

如果想要表的加法不合并相同数据的话,就使用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的网址

SQLZOO​sqlzoo.net

选择左侧导航栏里面的JOIN练习章节进行练习

e8de1b52b9cf698859e58a3bfa435b45.png

如下:

02eddd5bd00988cefbce87e4e4078b0d.png

60d89848abbf088a0d7046612e53e9de.png

a53592e567559bf707f80a3c742ea632.png

0cd033f8be640c32f15e8551bcd85761.png

b0b7da3fdfa116fea3c4979a80cd06d9.png

46100c780f5142255cc603b80286eca3.png

f50275c0a55977a1119d175291093e38.png

b77500302567164d36610f3793d83d21.png

41d8e303eb45118903354dd6ae787732.png

6263f985f947083a076922f7c24f9e75.png

1df331d3ddaa760a81b7cc549c204360.png

1a8ca8370f5f934c0398cdf632c4d0a2.png

0cb6cc24362392d5299ab7fb0cfe3898.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值