首页 > 代码库 > mysql篇---mysql习题

mysql篇---mysql习题

2.查询’生物‘课程比’物理‘课程成绩高的所有学生的学号
	思路:
		获取所有有生物课程的人(学号,成绩)-临时表
		获取所有有物理课程的人(学号,成绩)-临时表
		根据【学号】连接两个临时表:
			学号 物理成绩 生物成绩
			
		生物---》	SELECT score.sid,score.student_id,course.cname,score.num FROM score
		LEFT JOIN course ON score.course_id=course.cid WHERE course.cname=‘生物‘;
			
			
			
	select A.student_id from 
			(select score.sid,score.student_id,course.cname,score.num from score 
				LEFT JOIN course on score.course_id=course.cid where course.cname="生物") as A

	INNER JOIN

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





3.查询平均成绩大于60分的同学的学号和平均成绩;
	 思路:
        根据学生分组,使用avg获取平均值,通过having对avg进行筛选
 
        select student_id,avg(num) from score group by student_id having avg(num) > 60
	
	
	进行连表操作:
	SELECT B.student_id,student.sname,B.mean FROM 
		(SELECT student_id,avg(num) as mean FROM score GROUP BY student_id HAVING avg(num) > 60) as B
	LEFT JOIN student 
	ON  B.student_id=student.sid 



	
4.查询所有同学的学号,姓名,选课数,总成绩;
	SELECT score.student_id,student.sname,count(student_id),sum(num) FROM score 
	LEFT JOIN student on score.student_id=student.sid
	GROUP BY score.student_id

	
5.查询姓’李‘的老师的个数
	SELECT count(1) FROM teacher WHERE tname like ‘李%‘;



6.查询没学过’李平老师‘课的同学的学号,姓名;
	思路:
		先查到’李平老师‘老师教的所有课的 ID
		获取选过课的所有学生ID
		学生表中筛选
		
		
		
		SELECT student.sid,student.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 course.teacher_id=teacher.tid 
					WHERE teacher.tname = ‘李平老师‘)
		GROUP BY student_id
			)







7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
		思路:
			先查到既选择001又选择002课程的所用同学
			根据学生进行分组,如果学生数量等于2 表示 两门均已选择

		
	SELECT student_id,sname FROM
	(SELECT student_id,course_id FROM score WHERE course_id=1 OR course_id=2 ) as B
	LEFT JOIN student on B.student_id = student.sid GROUP BY student_id 
	HAVING count(student_id) > 1


8.查询学过’李平‘老师课的同学的学号,姓名;
	同上,只不过001和002 变成 in 
	SELECT student.sid,student.sname FROM student 
WHERE sid in 
	(SELECT student_id FROM score WHERE course_id in (SELECT course.cid FROM course 
		LEFT JOIN teacher ON course.teacher_id=teacher.tid WHERE teacher.tname = ‘李平老师‘)
GROUP BY student_id
)



10.查询有课程成绩小于60分的同学的学号,姓名;
	SELECT sid,sname FROM student WHERE sid in (
		SELECT DISTINCT student_id FROM score WHERE num < 60)
		
		
11.查询没有学全所有课的同学的学号,姓名;
	思路:
		在分数表中根据学生进行分组,获取每一个学生选课数量
		如果 数量== 总课程数量,表示已经选择了所有课程
	
	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)
	
	

12.查询至少一门课程与学号为’001‘的同学所学相同的同学的学号和姓名;
	思路:
		获取 001 同学 选择的所有课程
		获取课程在其中的所有人以及所有课程
		根据学生筛选,获取所有学生信息
		再与学生表 连接,获取姓名
		
	SELECT student_id,sname,count(course_id) 
	FROM score LEFT JOIN student on score.student_id=student.sid
	WHERE student_id != 1 AND course_id in (SELECT course_id FROM score WHERE student_id=1)
	GROUP BY student_id



13.查询至少学过学号为 ’001‘同学所有课的其他同学学号和姓名;
	先找到和001的学过所有人
	然后个数 = 001所有学科  ==》 其他人可能选择的更多
	
	SELECT student_id,sname,count(course_id) FROM score
	LEFT JOIN student on score.student_id=student.sid
	WHERE student_id != 1 AND course_id in (SELECT course_id FROM score WHERE student_id = 1)
	GROUP BY student_id 
	HAVING count(course_id) = (SELECT count(course_id) FROM score WHERE student_id=1) 


14.查询和’002‘号的同学学习的课程完全相同的其他同学学号和姓名;(!!!)
	个数相同
	002学过的也学过

		select student_id from score where  student_id in (
		select student_id from score where student_id !=1 
			GROUP BY student_id HAVING count(1) = (select count(1) from score where student_id = 1)
		 ) and course_id in (select course_id from score where student_id = 1) 
			GROUP BY student_id HAVING count(1) = (select count(1) from score where student_id = 1)
		


		
		
		
15.删除





16.向sc表中插入一些记录,这些记录要求符合以下条件:
		1.没有上过编号’002‘课程的同学学号
		2.插入’002‘号课程的平均成绩
	思路;
		由于insert支持
				insert into tb1(xx,xx) select x1,x2 from tb2;
		所有,获取所有没上过002课 的所有人,获取002的平均成绩
		
		

		
17.




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

	SELECT course_id,max(num) AS max_num,min(num) AS min_num FROM score GROUP BY course_id;
	
	
	
19.按各科平均成绩从低到高和及格率的百分数从高到低顺序;
	方法一:
	SELECT course_id,avg(num),sum(CASE WHEN num<60 THEN 0 ELSE 1 END),
	sum(1),sum(CASE WHEN num<60 THEN 0 ELSE 1 END)/sum(1) *100
	AS percent FROM score
	GROUP BY course_id
	ORDER BY avg(num) ASC,percent desc;

	
	方法二:
	select course_id, avg(num) as avgnum,
	sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent 
	from score 
	group by course_id 
	order by avgnum asc,percent desc;
	


20.课程平均分从高到低显示(任课老师)
	SELECT avg(if(isnull(score.num),0,score.num)),teacher.tname FROM course
	LEFT JOIN score ON course.cid=score.course_id
	LEFT JOIN teacher ON course.teacher_id=teacher.tid
	GROUP BY score.course_id

	

21.查询各科成绩前三名的记录:(不考虑成绩并列情况)
		SELECT score.sid,score.course_id,score.num,T.first_num,T.second_num FROM score
	LEFT JOIN (SELECT sid,
							(SELECT num FROM score AS s2 WHERE s2.course_id=s1.course_id 
								ORDER BY num DESC LIMIT 0,1) AS first_num,
							
							(SELECT num FROM score AS s2 WHERE s2.course_id=s1.course_id 
								ORDER BY num DESC LIMIT 3,1) AS second_num
						FROM score as s1
						) AS T
	ON score.sid = T.sid
	WHERE score.num <= T.first_num AND score.num >= T.second_num
		
	
22.查询每门课程被选修的学生数;
	SELECT course_id,count(1) FROM score GROUP BY course_id
	
	
	
	
23查询出只选修了一门课程的全部学生的学号和姓名;(!!!)
	SELECT student.sid,student.sname,count(1) FROM score
	LEFT JOIN student ON score.student_id=student.sid
	GROUP BY course_id HAVING count(1) = 1

	
	
24.查询男生,女生的人数
	SELECT * FROM
		(SELECT count(1) AS man FROM student WHERE gender=‘男‘) AS A,
		(SELECT count(1) AS woman FROM student WHERE gender=‘女‘) AS B;
		
		
		
25.查询姓’张‘的学生名单
		SELECT sname FROM student WHERE sname LIKE ‘张%‘
		
		

26.查询同名同姓学生名单,并统计同名人数

	SELECT sname,count(1) AS count FROM student GROUP BY sname

	
	
27.查询每门课的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程降序排列
	SELECT course_id,avg(if(isnull(num),0,num)) AS avg FROM score
	GROUP BY course_id ORDER BY avg 
	ASC,course_id desc
	
	
28.查询平均成绩大于85的所有学生的学号,姓名和平均成绩(!!!!未取出 >85)


	SELECT student_id,sname,avg(if(isnull(num),0,num)) FROM score 
	LEFT JOIN student on score.student_id=student.sid 
	GROUP BY student_id 


	
29.查询课程名称为’生物‘,且分数低于60的学生姓名和分数
	SELECT student.sname,score.num FROM score
	LEFT JOIN course ON score.course_id=course.cid
	LEFT JOIN student ON score.student_id=student.sid
WHERE score.num < 60 AND course.cname=‘生物‘
	


30.查询课程编号为003且课程成绩在80分以上的学生的学号和姓名
	SELECT * FROM score WHERE score.student_id = 3 and score.num > 80

	
31.求选了课程的学生人数
	select count(c) from (
			select count(student_id) as c from score group by student_id) as A;
			
			
			
32.查询选修’张磊‘老师所授课程的学生中,成绩最高的学生姓名及其成绩
	SELECT sname,num FROM score
	LEFT JOIN student ON score.student_id=student.sid
	WHERE score.course_id in (SELECT course.cid FROM course LEFT JOIN teacher ON
													course.teacher_id=teacher.tid WHERE tname=‘张磊老师‘) ORDER BY num DESC LIMIT 1

		
	
33.查询各个课程及相应的选修人数;
    select course.cname,count(1) from score
    left join course on score.course_id = course.cid
    group by course_id;
	
	
34.查询不同课程但成绩相同的学生的学号,课程号,学生成绩(!!!)
SELECT DISTINCT s1.course_id,s2.course_id,s1.num,s2.num
FROM score AS s1,score AS s2 
WHERE s1.num=s2.num AND s1.course_id != s2.course_id




36.检索至少选修两门课程的学生学号
SELECT student_id FROM score 
GROUP BY student_id 
HAVING count(student_id) > 1;


37.查询全部学生都选修的课程号和课程名(!!!)
SELECT course_id,count(1) FROM  score
GROUP BY course_id HAVING count(1) = (SELECT count(1) FROM student);



38.查询没学过‘李平‘老师讲授的任意一门课程的学生姓名
SELECT student_id,student.sname FROM score
LEFT JOIN student on score.student_id=student.sid
WHERE score.course_id NOT in (
SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid 
WHERE tname=‘李平老师‘
)
GROUP BY student_id


加 课程名
SELECT student_id,student.sname,course.cname FROM score
LEFT JOIN student on score.student_id=student.sid
LEFT JOIN course on course_id=course.cid
WHERE score.course_id NOT in (
SELECT cid FROM course LEFT JOIN teacher ON course.teacher_id=teacher.tid 
WHERE tname=‘李平老师‘
)
GROUP BY student_id



39.查询两门以上不及格课程的同学的学号及其平均成绩(!!!)
SELECT student_id,count(1) FROM score 
WHERE num < 60 
GROUP BY student_id HAVING count(1) > 2 


40.检索’004‘课程分数小于60,按分数 降序 排列的同学学号
SELECT student_id FROM score 
WHERE num<60 and course_id=4 
ORDER BY num DESC;

 

mysql篇---mysql习题