SQL | 多表连接 | 找出最小的N个数

student表: 姓名name,学号stu_id,班级class,入学时间date1,年龄age,专业major
score1表:学号stu_id,课程course_id,分数score
筛选出2017年入学的“计算机”专业年龄最小的3位同学名单(姓名、年龄)
统计每个班同学各科成绩平均分大于80分的人数和人数占比
1、创建表

CREATE TABLE IF NOT EXISTS student(
name VARCHAR(10),
stu_id VARCHAR(10),
class VARCHAR(10),
date1 DATE,
age INT,
major VARCHAR(50)
);

CREATE TABLE IF NOT EXISTS score1(
stu_id VARCHAR(10),
course_id VARCHAR(10),
score INT
);

2、插入数据

INSERT INTO student VALUES('小红','00001','01班','2020-9-1',20,'计算机'),
						  ('小兰','00002','01班','2019-9-1',18,'计算机'),
						  ('小明','00003','01班','2019-9-1',19,'金融'),
						  ('小芳','00004','02班','2018-9-1',18,'金融'),
						  ('小花','00005','02班','2020-9-1',21,'计算机'),
						  ('小果','00006','02班','2019-9-1',17,'计算机'),
						  ('小天','00007','03班','2018-9-1',18,'计算机'),
						  ('小云','00008','03班','2019-9-1',19,'计算机'),
						  ('小笑','00009','03班','2020-9-1',20,'计算机');

INSERT INTO score1 VALUES('00001','001',97),
						  ('00002','001',80),
						  ('00002','002',81),
						  ('00003','001',83),
						  ('00003','002',76),
						  ('00003','003',58),
						  ('00004','003',91),
						  ('00005','002',76),
						  ('00005','003',78),
						  ('00006','001',89),
						  ('00006','002',63),
						  ('00006','003',74),
						  ('00007','002',83),
						  ('00007','003',59),
						  ('00008','001',69),
						  ('00009','003',95);

3、逻辑SQL
(1)筛选出2019年入学的“计算机”专业年龄最小的2位同学名单(姓名、年龄)
取date中的年份
year(date)
date_format(date,’%Y’)

mysql> SELECT name,age
    -> FROM student
    -> WHERE YEAR(date1)=2019 AND major='计算机'
    -> ORDER BY age
    -> limit 3;
+--------+------+
| name   | age  |
+--------+------+
| 小果   |   17 |
| 小兰   |   18 |
| 小云   |   19 |
+--------+------+
3 rows in set (0.00 sec)

(2)统计每个班同学各科成绩平均分大于80分的人数和人数占比
思路:
a)每个班同学各科成绩平均分大于80分的人

SELECT stu_id,AVG(score) AS avg
FROM score1
GROUP BY stu_id
HAVING AVG(score)>80;

b)利用左连接
student表与大于80分的临时表合成一张表,没有匹配上的会留空,正好count()空值不计数,从而求出大于80分的人数
round(数,N)保留N位小数
concat()连接%转为为百分数

mysql> SELECT s1.class,count(s2.stu_id) AS '大于80分人数',CONCAT(ROUND(count(s2.stu_id)/count(s1.stu_id),2)*100,'%') AS '人数占比'
    -> FROM student s1 LEFT JOIN
    -> (SELECT stu_id,AVG(score) AS avg
    -> FROM score1
    -> GROUP BY stu_id
    -> HAVING AVG(score)>80) s2
    -> ON  s1.stu_id=s2.stu_id
    -> GROUP BY s1.class;
+-------+-------------------+--------------+
| class | 大于80分人数      | 人数占比     |
+-------+-------------------+--------------+
| 01|                 2 | 67.00%       |
| 02|                 1 | 33.00%       |
| 03|                 1 | 33.00%       |
+-------+-------------------+--------------+
3 rows in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值