MySQL_DAY3、4_练习题

练习题

题目

班级表:class

cid caption
1 三年二班
2 一年三班
3 三年一班

学生表:student

sid sname gender class_id
1 zyx 1
2 zx 1
3 top 2

老师表:teacher

tid tname
1 bobo
2 haha
3 zhilong

课程表:course

cid cname teacher_id
1 生物 1
2 体育 3
3 物理 2

成绩表:score

cid student_id course_id number
1 1 1 60
2 1 2 59
3 2 2 100
4 3 1 89

题目与代码

1.查询平均成绩大于60分的同学的学号和平均成绩;
select student_id,avg(number) from score group by student_id having avg(number)>60
在这里插入图片描述

对1进行连表操作:显示出学生名字

select * from (select student_id,avg(number) from score group by student_id having avg(number)>60) as B left join student on B.student_id=student.sid;
在这里插入图片描述
2.查询所有同学的学号、姓名、选课数、总成绩
SELECT student.sid, student.sname, count( course_id ) AS '选课数', SUM( number ) FROM score LEFT JOIN student ON student.sid = score.student_id GROUP BY score.student_id;
在这里插入图片描述
3.查询名称前缀为“b”的老师的个数
select * from teacher where tname like "b%"

4.查询没学过“bobo”老师课的同学的学号、姓名;

select
	sid,sname
from
	student 
where
	sid not in (
	SELECT
		student_id 
	from
		score 
	where
		course_id in ( select course.cid from course 
		left join teacher 
		on teacher.tid = course.teacher_id 
		where tname = "bobo" ) 
group by

5.查询“生物”课程比“物理”课程成绩高的所有学生的学号;

select
	A.student_id 
from( 
    select sid, student_id, cname, number from score 
	LEFT JOIN course 
	on score.course_id = course.cid 
	where cname = "生物" 
	) as A
inner JOIN ( 
	            SELECT sid, student_id, cname, number from score 
	            LEFT JOIN course 
	            on score.course_id = course.cid 
	            where cname = "物理" 
	            ) as B 
on A.student_id = B.student_id

6.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名

select
		student.sid,
		student.sname 
from
		student
inner join ( 
        select student_id 
				from score 
				where ( course_id = 2 OR course_id = 1 ) 
				group by student_id 
				having count( course_id )= 2 
				) as B 
on student.sid = B.student_id

7.查询学过“bobo”老师所教的所有课的同学的学号、姓名

select
	score.student_id,
	student.sname 
from
	score
	LEFT JOIN student on score.student_id = student.sid 
where
	score.course_id in (
	select
		cid 
	from
		course
		LEFT JOIN teacher on course.teacher_id = teacher.tid 
	where
		teacher.tname = "bobo")

8.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名

SELECT
	sid,
	sname 
from
	student
	inner JOIN (
	select
		A.student_id,
		A.`002成绩`,
		B.`001成绩` 
	from
		(select student_id, number as "002成绩" from score where course_id = 2 ) as A
	inner JOIN 
		(select student_id, number as "001成绩" from score where course_id = 1 ) as B 
	on A.student_id = B.student_id 
	having A.`002成绩` < B.`001成绩` 
	  ) 
as C on student.sid = C.student_id

9.查询有课程成绩小于60分的同学的学号、姓名

SELECT
	sid,
	sname 
from
	student
INNER JOIN ( 
			select student_id, number 
			from score 
			where number < 60
			) as A 
			on student.sid = A.student_id

10.查询没有学全所有课的同学的学号、姓名

select
	student_id,
	sname 
from
	score
	left join student on score.student_id = student.sid 
group by
	student_id 
HAVING
	count( course_id ) !=
	 (
	select
		count( 1 ) 
	from
		course
	)

11.查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名

-- select course_id from score where student_id=1 查找学号为1 的学生所学的课程
select
	sid,
	sname 
from
	student
INNER JOIN (
	select
		student_id 
	from
		score 
	where
	student_id !=1 and course_id in ( select course_id from score where student_id = 1 )) as A on student.sid = A.student_id 
GROUP BY
	sid

12.删除学习“叶平”老师课的SC表记录;

    select sc.student_id,
        (select number from score left join course on score.course_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy,
        (select number from score left join course on score.course_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl,
        (select number from score left join course on score.course_id = course.cid where course.cname = "体育" and score.student_id=sc.student_id) as ty,
        count(sc.course_id),
        avg(sc.number)as avg
    from score as sc
    group by student_id 
    order by avg desc   

13.查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

SELECT course_id,max(number)as "最高分",min(number)as "最低分" from score GROUP BY course_id

14.按各科及格率的百分数从高到低顺序;

SELECT course_id,sum(case when number>=60 then 1 else 0 end )/COUNT(number)*100 as percent from score GROUP BY course_id

15.课程平均分从高到低显示(显示任课老师)

SELECT
	course_id,
	AVG( number ) as "平均值",
	teacher.tname 
from
	score
	LEFT JOIN course on score.course_id = course.cid
	LEFT JOIN teacher on course.teacher_id = teacher.tid 
GROUP BY
	course_id

16.查询各科成绩前三名的记录:(不考虑成绩并列情况)

SELECT T.course_id,T.first,T.second,T.third from
	(SELECT 
		sc.sid,
		sc.course_id,
		sc.number,
		(SELECT number from score as s1  where s1.course_id=sc.course_id GROUP BY number ORDER BY number desc limit 0,1)as first,
		(SELECT number from score as s1  where s1.course_id=sc.course_id GROUP BY number ORDER BY number desc limit 1,1)as second,
		(SELECT number from score as s1  where s1.course_id=sc.course_id GROUP BY number ORDER BY number desc limit 2,1)as third
from score as sc)as T
where T.number>=T.third
ORDER BY T.course_id asc

17.查询每门课程被选修的学生数

SELECT course.cid,A.`选课人数`,course.cname 
from
	(select course_id,count(student_id)as "选课人数" 
	 from score 
	 GROUP BY course_id)as A
LEFT JOIN course
on A.course_id=course.cid

18.查询出只选修了一门课程的全部学生的学号和姓名

SELECT
	student.sid,
	student.sname 
from
	( SELECT student_id, count( course_id ) as "选课数" from score GROUP BY student_id ) as A
	LEFT JOIN student on student.sid = A.student_id 
where
	A.`选课数` =1

19.查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列

SELECT course.cname,A.avg 
from 
	(SELECT course_id,AVG(number) as avg from score GROUP BY course_id)as A
LEFT JOIN course
on course.cid=A.course_id
ORDER BY
avg asc,course_id desc

20.查询平均成绩大于85的所有学生的学号、姓名和平均成绩

SELECT A.student_id,student.sname,A.avg 
from
	(SELECT student_id,avg(number)as avg from score GROUP BY student_id)as A
LEFT JOIN student
on student.sid=A.student_id

21.查询课程名称为“物理”,且分数低于60的学生姓名和分数

SELECT
	student.sname,
	score.number 
from
	score
	LEFT JOIN course ON score.course_id = course.cid
	LEFT JOIN student on score.student_id = student.sid 
where
	score.number < 60 
	and course.cname = "物理"

22.查询课程编号为003且课程成绩在80分以上的学生的学号和姓名

select
	student_id,
	student.sname 
from
	score
	LEFT JOIN student on student.sid = score.student_id 
where
	course_id = 3 
	and score.number > 80

23.查询选修“bobo”老师所授课程的学生中,成绩最高的学生姓名及其成绩

SELECT
	B.course_id,
	max( number ) 
from
	(
	SELECT
		* 
	from
		score
		LEFT JOIN course on course.cid = score.course_id
		LEFT JOIN teacher on teacher.tid = course.teacher_id 
	where
		teacher.tname = "bobo" 
	) as B 
GROUP BY
	B.course_id

24.查询不同课程但成绩相同的学生的学号、课程号、学生成绩
DISTINCT去重

 select DISTINCT 
		s1.course_id,
		s2.course_id,
		s1.number,
		s2.number 
from score as s1, score as s2 
where 
        s1.number = s2.number 
        and s1.course_id != s2.course_id;

25.检索至少选修两门课程的学生学号

SELECT
	* 
from
	( SELECT student_id, count( course_id ) as "选课数" from score GROUP BY student_id ) as A 
where
	A.`选课数` >=2

26.查询两门以上不及格课程的同学的学号及其平均成绩

SELECT
	B.student_id,
	avg( score.number ) 
from
	(
	SELECT
		student_id,
		count( course_id ) as shu 
	from
		( SELECT student_id, course_id, number from score where number < 60 ) as A 
	GROUP BY
		student_id 
	) as B
	LEFT JOIN score on score.student_id = B.student_id 
where
	B.shu > 1 
GROUP BY
	B.student_id

27.删除“002”同学的“001”课程的成绩

DELETE from score where student_id=2 and course_id=1

猜你喜欢

转载自blog.csdn.net/TOPic666/article/details/107507624