进阶8 子查询-----作业讲解

(1)查询每个专业的学生人数

SELECT COUNT(*), majorid
FROM student
GROUP BY majorid;

(2)查询参加考试的学生中,每个学生的平均分、最高分

SELECT AVG(score), MAX(score), studentno
FROM result
GROUP BY studentno;

(3)查询姓张的每个学生的最低分大于60的学号、姓名

注意:left join,以因为有可能有学生没有成绩。stuent表为主表

SELECT studentno, studentname, MIN(score)
FROM student s
LEFT JOIN result r
ON s.studentno = r.studentno
WHERE studentname LIKE ‘张%’
GROUP BY studentno
HAVING MIN(score) > 60;

(4)查询生日在’1988-1-1’后的学生姓名、专业名称

注意:borndate > ‘1988-1-1’。例如:borndate为’1989-1-1’

SELECT studentname, majorname
FROM student s
INNER JOIN major m
ON m.majorid = s.majorid
WHERE DATEDIFF(borndate, ‘1988-1-1’)>0;

(5)查询每个专业的男生人数和女生人数分别是多少

方法1

SELECT COUNT() 个数, majorid, sex
FROM student
GROUP BY majorid, sex;
/

输出结果:
个数 sex majorid
3 女 1
1 女 2
2 女 3
5 男 1
2 男 2
2 男 3
*/

方法2【效果更好】

SELECT majorid, # step3
(SELECT COUNT() FROM student WHERE sex=‘男’ AND majorid=s.majorid) 男,
(SELECT COUNT(
) FROM student WHERE sex=‘女’ AND majorid=s.majorid) 女
FROM student # step1
GROUP BY majorid; # step2
/*
输出结果:
majorid 男 女
1 5 3
2 2 1
3 2 2
*/

(6)查询专业和张翠山一样的学生的最低分

step1:查询张翠山的专业编号

SELECT majorid
FROM student
WHERE studentname=‘张翠山’;
/*
输出结果:
majorid
1
*/

step2:查询编号=step1的所有学生编号

SELECT studentno
FROM student
WHERE majorid = (
SELECT majorid
FROM student
WHERE studentname=‘张翠山’
);
/*
输出结果:
studentno
s001
s002
s004
s012
s014
*/

step2:查询最低分

SELECT MIN(score)
FROM result
WHERE studentno IN (
SELECT studentno
FROM student
WHERE majorid = (
SELECT majorid
FROM student
WHERE studentname=‘张翠山’
)
);
/*
输出结果:
min(score)
70
*/

(7)查询大于60分的学生的姓名、密码、专业名

注意:有些学生没有分数(null),故用左连接

SELECT studentname, loginpwd, majorname
FROM student s
INNER JOIN major m ON s.majorid = m.majorid
LEFT JOIN result r ON s.studentno = r.studentno
WHERE r.score > 60;

(8)按邮箱位数分组,查询每组的学生个数

SELECT COUNT(*)
FROM student
GROUP BY LENGTH(email);

(9)查询学生名、专业名、分数【三表连接】

注意:有些学生没有分数(null),故用左连接

SELECT studentname, majorname, score
FROM student s
INNER JOIN major m ON s.majorid = m.majorid
LEFT JOIN result r ON s.studentno = r.studentno;
/*
输出结果:
studentname score majorname
张翠山 70 javaee
赵敏 null android
杨不悔 null htmls
*/

(10)查询哪个专业没有学生,分别用左连接和右连接实现

方法1:左连接【在major表中,id为主键】【主键列没有null值】【主键列不能重复】

SELECT majorname, studentno
FROM major m
LEFT JOIN student s
ON m.majorid = s.majorid
WHERE s.studentno IS NULL;

方法2:右连接

SELECT majorname, studentno
FROM student s
RIGHT JOIN major m ON m.majorid = s.majorid
WHERE s.studentno IS NULL;

(11)查询没有成绩的学生人数

step1:没有成绩的学生【左连接】【在result表中,id为主键】

SELECT s.*, r.id
FROM student s
LEFT FROM result r ON s.studentno = r.studentno
WHERE r.id IS NULL;

step2

SELECT COUNT(*)
FROM student s
LEFT JOIN result r ON s.studentno = r.studentno
WHERE r.id IS NULL;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值