sql-50练习题11-15

前言

sql真的非常灵活,一个题目可能有很多很多种解法,我记录的只是我自己的一个解题思路,如果大家有更好的不同解法欢迎在评论区一起探讨
ps:有些题可能解法会重复,比如求大于,我们下一个题可能是求小于,大家如果第一遍没有做出来,看了我写的之后有了思路,可以试一下反面的解法。

数据库表结构介绍

学生表

在这里插入图片描述

课程表

在这里插入图片描述

成绩表

在这里插入图片描述

教师表

在这里插入图片描述

1-1 查询没有学全所有课程的同学的信息

需要的表结构:course,score,student
利用score中的成绩去裁剪表,score中有些同学只有两科成绩或者一科成绩这种,而学全所有课程的同学成绩有三科

SELECT
	b.*, count(a.s_id)
FROM
	score a
RIGHT JOIN student b ON a.s_id = b.s_id
GROUP BY
	a.s_id
HAVING
	count(a.s_id) < (
		SELECT
			count(c_id)
		FROM
			course
	)
ORDER BY
	b.s_id ASC;

结果如下:
在这里插入图片描述

1-2 查询至少有一门课与学号为’01’的同学所学相同的同学的信息

需要用到的表为:score和student

SELECT DISTINCT
	b.*
FROM
	score a,
	student b
WHERE
	a.s_id = b.s_id
AND a.c_id IN (
	SELECT
		c.c_id
	FROM
		score c
	WHERE
		c.s_id = '1'
)

结果如下:
在这里插入图片描述

1-3 查询和’1’号的同学学习的课程完全相同的其他同学的信息

select s2.s_id,student.s_name
from score as s1 
join score as s2 
on s1.c_id = s2.c_id
join student on student.s_id = s2.s_id
and s1.s_id = '01'
and s2.s_id != '01'
group by s2.s_id,student.s_id
having count(s2.c_id) = (select count(*) from score where s_id = '01')

结果如下:
在这里插入图片描述

1-4 查询没学过’张三’老师讲授的任一门课程的学生姓名

select a.s_name from student a where a.s_id not in (
    select s_id from score where c_id = 
                (select c_id from course where t_id =(
                    select t_id from teacher where t_name = '张三')) 
                group by s_id);

在这里插入图片描述

1-5 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT
	b.*, avg(a.s_score) agescore
FROM
	score a,
	student b
WHERE
	a.s_id = b.s_id
GROUP BY
	a.s_id
HAVING
	sum(
		CASE
		WHEN a.s_score >= 60 THEN
			0
		ELSE
			1
		END
	) >= 2

结果如下:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值