编程一五八俱乐部SQL学习笔记-5-查询练习11-20

接着上一篇:
《编程一五八俱乐部SQL学习笔记-4-查询练习1-10》

11、查询每门课的平均成绩

avg函数算平均值,group by表示分组

mysql> select c_no,avg(sc_degree) from score group by c_no; //先按照c_no进行分组,再进行计算平均值
+-------+----------------+
| c_no  | avg(sc_degree) |
+-------+----------------+
| 3-105 |        85.3333 |  //各个班的各自的平均成绩
| 3-245 |        76.3333 |
| 6-166 |        81.6667 |
+-------+----------------+

某一班的平均成绩select c_no,avg(sc_degree) from score where c_no='3-105';

12、查询score表中至少有2名学生选修的,并且以3开头的课程的平均分

groupby后面加条件,不用where用having

//select c_no from score group by cno //到这里输出只有三行,只是分好组
mysql> select c_no,avg(sc_degree),count(*) from score 
	-> group by c_no //先是分组
    -> having count(c_no)>=2 and c_no like '3%'; //分组后面带条件,不用where而是having
+-------+----------------+----------+
| c_no  | avg(sc_degree) | count(*) |
+-------+----------------+----------+
| 3-105 |        85.3333 |        3 |
| 3-245 |        76.3333 |        3 |
+-------+----------------+----------+
13、查询分数大于70小于90的s_no列
mysql> select s_no,sc_degree from score
    -> where sc_degree between 70 and 90;  //其实这么写70和90包含在里面
//mysql> select s_no,sc_degree from score   
    //-> where sc_degree>70 and sc_degree<90;  //这么写也可以
+------+-----------+
| s_no | sc_degree |
+------+-----------+
| 103  |        86 |
| 103  |        85 |
| 105  |        88 |
| 105  |        75 |
| 105  |        79 |
| 109  |        76 |
| 109  |        81 |
+------+-----------+
//显示对应的人
mysql> select s_name,c_name,sc_degree from score,student,course
    -> where score.s_no = student.s_no AND score.c_no = course.c_no //关联表的连接,多表联合查询
    -> AND sc_degree between 71 and 89;
+-----------+-----------------+-----------+
| s_name    | c_name          | sc_degree |
+-----------+-----------------+-----------+
| 王丽      | 操作系统        |        86 |
| 王丽      | 数字电路        |        85 |
| 王芳      | 计算机导论      |        88 |
| 王芳      | 操作系统        |        75 |
| 王芳      | 数字电路        |        79 |
| 赵铁柱    | 计算机导论      |        76 |
| 赵铁柱    | 数字电路        |        81 |
+-----------+-----------------+-----------+
14、查询所有学生的s_name,c_no,sc_degree列

多表查询

mysql> select s_name,c_no,sc_degree from student,score 
	-> where student.s_no = score.s_no;
+-----------+-------+-----------+
| s_name    | c_no  | sc_degree |
+-----------+-------+-----------+
| 王丽      | 3-105 |        92 |
| 王丽      | 3-245 |        86 |
| 王丽      | 6-166 |        85 |
| 王芳      | 3-105 |        88 |
| 王芳      | 3-245 |        75 |
| 王芳      | 6-166 |        79 |
| 赵铁柱    | 3-105 |        76 |
| 赵铁柱    | 3-245 |        68 |
| 赵铁柱    | 6-166 |        81 |
+-----------+-------+-----------+
15、查询所有学生的s_no,c_name,sc_degree列

多表查询

mysql> select s_no,c_name,sc_degree from course,score //多表关联,c_name字段来自于course表
    -> where course.c_no = score.c_no;
+------+-----------------+-----------+
| s_no | c_name          | sc_degree |
+------+-----------------+-----------+
| 103  | 计算机导论      |        92 |
| 105  | 计算机导论      |        88 |
| 109  | 计算机导论      |        76 |
| 103  | 操作系统        |        86 |
| 105  | 操作系统        |        75 |
| 109  | 操作系统        |        68 |
| 103  | 数字电路        |        85 |
| 105  | 数字电路        |        79 |
| 109  | 数字电路        |        81 |
+------+-----------------+-----------+
16、查询所有学生s_name,c_name,sc_degree列

三表关联查询

mysql> SELECT s_name, c_name, sc_degree FROM student, course, score 
	-> WHERE student.s_no = score.s_no AND score.c_no = course.c_no;
+-----------+-----------------+-----------+
| s_name    | c_name          | sc_degree |
+-----------+-----------------+-----------+
| 王丽      | 计算机导论      |        92 |
| 王丽      | 操作系统        |        86 |
| 王丽      | 数字电路        |        85 |
| 王芳      | 计算机导论      |        88 |
| 王芳      | 操作系统        |        75 |
| 王芳      | 数字电路        |        79 |
| 赵铁柱    | 计算机导论      |        76 |
| 赵铁柱    | 操作系统        |        68 |
| 赵铁柱    | 数字电路        |        81 |
+-----------+-----------------+-----------+
17、查询95031班学生每门课的平均分

子查询 + 分组求平均分

mysql> select c_no,avg(sc_degree) 
	-> from score 
	-> where s_no in (select s_no from student where s_class = '95031')
	-> group by c_no;
+-------+----------------+
| c_no  | avg(sc_degree) |
+-------+----------------+
| 3-105 |        82.0000 |
| 3-245 |        71.5000 |
| 6-166 |        80.0000 |
+-------+----------------+
//将95031班的学生选出来,按照每个学生的课程分组,展示平均值
18、查询选修3-105课程的成绩高于109号学生3-105成绩 的所有同学记录

即查询所有选修3-105的学生中,分数比学号为109号学生还要高的学生信息

mysql> select * from student as s,score as sc  //新列名称as
    -> where sc.c_no='3-105' 
    -> and sc.sc_degree > (select sc_degree from score where s_no = '109' and c_no = '3-105')
    -> and s.s_no = sc.s_no;  //连接学生信息表和成绩表
+------+--------+-------+---------------------+---------+------+-------+-----------+
| s_no | s_name | s_sex | s_birthday          | s_class | s_no | c_no  | sc_degree |
+------+--------+-------+---------------------+---------+------+-------+-----------+
| 103  | 王丽   || 1976-01-23 00:00:00 | 95033   | 103  | 3-105 |        92 |
| 105  | 王芳   || 1975-02-10 00:00:00 | 95031   | 105  | 3-105 |        88 |
+------+--------+-------+---------------------+---------+------+-------+-----------+
19、查询成绩高于学号为109,课程号为3-105的成绩的所有记录

这里先找到这个109号的3-105同学的成绩,再检索出比之大的即可。

mysql> select * from score 
    -> where sc_degree > (select sc_degree from score where s_no='109' and c_no='3-105');
+------+-------+-----------+
| s_no | c_no  | sc_degree |
+------+-------+-----------+
| 103  | 3-105 |        92 |
| 103  | 3-245 |        86 |
| 103  | 6-166 |        85 |
| 105  | 3-105 |        88 |
| 105  | 6-166 |        79 |
| 109  | 6-166 |        81 |
+------+-------+-----------+
20、查询学号为108.101的同学同年出生的所有学生的s_no,s_name和s_birthday

year()函数提取年份
in和or功能类似,但是in可以包含其他select语句

mysql> select * from student 
    -> where year(s_birthday) in (select year(s_birthday) from student where s_no in('108','101'));
+------+-----------+-------+---------------------+---------+
| s_no | s_name    | s_sex | s_birthday          | s_class |
+------+-----------+-------+---------------------+---------+
| 101  | 曾华      || 1977-09-01 00:00:00 | 95033   |
| 102  | 匡明      || 1975-10-02 00:00:00 | 95031   |
| 105  | 王芳      || 1975-02-10 00:00:00 | 95031   |
| 108  | 张全蛋    || 1975-02-10 00:00:00 | 95031   |

不积跬步无以至千里,不积小流无以成江海。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值