用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月 忘记密码?

发表随想


还能输入:200字
云代码 - sql代码库

学生表、课程表、 成绩表 、教师表sql练习

2017-04-01 作者:知行合一心 举报

[sql]代码库

<!--http://www.cnblogs.com/qixuejia/p/3637735.html-->
1、查询“1”课程比“2”课程成绩高的所有学生的学号;
SELECT t1.student_id 
FROM
	(SELECT score, student_id FROM student_score WHERE course_id = 1 ) t1,
	(SELECT score, student_id FROM student_score WHERE course_id = 2 ) t2
WHERE t1.score > t2.score AND t1.student_id = t2.student_id

2、查询平均成绩大于60分的同学的学号和平均成绩:
select student_id, avg(score) from student_score group by student_id HAVING avg(score)>=60 ;

3、查询所有同学的学号、姓名、选课数、总成绩; 
select ss.student_id, st.student_name, count(course_id), sum(score) from student_score ss 
left join student st on ss.student_id=st.student_id
group by ss.student_id, st.student_name
order by ss.student_id

4、查询姓“李”的老师的个数;
select count(teacher_name) from teacher where teacher_name like '李%'

5、查询没学过“叶平”老师课的同学的学号、姓名; 
select student_id,student_name from student where student_id not in (
	select ss.student_id from 
	student_score ss 
	left join course co on ss.course_id=co.course_id
	left join teacher te on te.teacher_id= co.teacher_id
	where te.teacher_name='叶平'
	group by ss.student_id
)

6、查询学过“1”并且也学过编号“2”课程的同学的学号、姓名; 
select st.student_id,st.student_name from student st 
inner join (select student_id from student_score where course_id=1) t1 on st.student_id=t1.student_id
inner join (select student_id from student_score where course_id=2) t2 on t1.student_id=t2.student_id

7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
SELECT
	st.student_id,st.student_name
FROM student_score ss
inner join student st on ss.student_id=st.student_id
inner join course co on ss.course_id=co.course_id
inner join teacher te on te.teacher_id=co.teacher_id
where te.teacher_name='叶平'

8、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名; 
select st.student_id,st.student_name from student st 
inner join (select student_id, score from student_score where course_id=1) t1 on st.student_id=t1.student_id
inner join (select student_id, score from student_score where course_id=2) t2 on t1.student_id=t2.student_id
where t1.score<t2.score

9、查询所有课程成绩小于60分的同学的学号、姓名;
select st.student_id,st.student_name from student_score ss
inner join student st on ss.student_id=st.student_id
where ss.score<60
group by st.student_id,st.student_name

10、查询没有学全所有课的同学的学号、姓名;
select st.student_id, st.student_name from student_score ss
inner join student st on st.student_id=ss.student_id
group by st.student_id,st.student_name
having count(ss.course_id)<(select count(course_id) from course)

11、查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名;
select st.student_id,st.student_name from 
student st inner join student_score ss on st.student_id=ss.student_id
where course_id in(select course_id from student_score where student_id=1)
group by st.student_id,st.student_name

14、查询和“1”号的同学学习的课程完全相同的其他同学学号和姓名; 
select ss.student_id from student_score ss 
inner join student st on ss.student_id=st.student_id
where ss.course_id in (select course_id from student_score where student_id=1)
group by ss.student_id
having count(ss.course_id)=(select count(course_id) from course)

17、按平均成绩从高到低显示所有学生的“语文”、“数学”、“英语”三门课程成绩
select st.student_id as 学号, 
(select ss.score from student_score ss where st.student_id=ss.student_id and course_id=1) as 语文,
(select ss.score from student_score ss where st.student_id=ss.student_id and course_id=2) as 数学,
(select ss.score from student_score ss where st.student_id=ss.student_id and course_id=3) as 英语,
avg(ss2.score) as 平均成绩
from student st inner join student_score ss2 on st.student_id=ss2.student_id
group by st.student_id
order by st.student_id

18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT course_id AS 课程id, MAX (score) AS 最高分, MIN (score) AS 最低分
FROM student_score
GROUP BY course_id

19、按各科平均成绩从低到高和及格率的百分数从高到低顺序 
SELECT
	co.course_name AS 科目名称,
	avg (ss.score) as 平均成绩,
	CAST (CAST (SUM(case WHEN COALESCE(ss.score,0)>=60 THEN 1 ELSE 0 END) AS FLOAT)/
	(SELECT COUNT(*) FROM course) AS DECIMAL (10, 2))
FROM
	student_score ss
INNER JOIN course co ON ss.course_id = co.course_id
GROUP BY
	co.course_name

或者

SELECT
	student_id,
	CAST (AVG(score) AS DECIMAL(10, 2)) AS 平均成绩,
	CAST (CAST (COUNT(*) AS FLOAT) / (SELECT COUNT(*) FROM course) AS DECIMAL (10, 2)) AS 及格率
FROM student_score
WHERE 	score >= 60
GROUP BY student_id
ORDER BY AVG (score),CAST (CAST (COUNT(*) AS FLOAT) / (SELECT COUNT(*) FROM course) AS DECIMAL (10, 2)) desc

24、查询学生平均成绩及其名次 
SELECT 1 + (
		SELECT COUNT (DISTINCT 平均成绩)
		FROM
			( SELECT student_id, AVG (score) AS 平均成绩 FROM student_score GROUP BY student_id ) AS T1
		WHERE 平均成绩 > T2.平均成绩
	) AS 名次,
	student_id AS 学生学号,
	平均成绩
FROM
	( SELECT student_id, AVG (score) 平均成绩 FROM student_score GROUP BY 	student_id ) AS T2
ORDER BY
	平均成绩 DESC;

25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT ss.student_id, ss.course_id, ss.score
FROM student_score ss
GROUP BY ss.student_id, 	ss.course_id, ss.score
HAVING student_id in (select student_id from student_score where ss.course_id=course_id LIMIT  3)
ORDER BY ss.course_id, ss.score

26、查询每门课程被选修的学生数 
SELECT course_id, COUNT (course_id)
FROM student_score
GROUP BY 	course_id
ORDER BY 	course_id

27、查询出只选修了一门课程的全部学生的学号和姓名
SELECT ss.student_id,st.student_name, COUNT (ss.course_id)
FROM student_score ss
inner join student st on st.student_id=ss.student_id
GROUP BY 	ss.student_id,st.student_name
having COUNT (ss.course_id)=1
ORDER BY 	ss.student_id

28、查询男生、女生人数 
SELECT student_sex, COUNT (student_id)
FROM student
GROUP BY student_sex

29、查询姓“张”的学生名单 
SELECT * FROM	student WHERE student_name LIKE '张%'

30、查询同名同性学生名单,并统计同名人数 
SELECT student_name,count(*) FROM	student group by student_name having count(*)>1

32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列 
select course_id,avg(score) from student_score group by course_id order by avg(score) asc,course_id

33、查询平均成绩大于70的所有学生的学号、姓名和平均成绩 
SELECT ss.student_id,st.student_name, AVG (ss.score)
FROM student_score ss
inner join student st on ss.student_id=st.student_id
GROUP BY ss.student_id,st.student_name
ORDER BY AVG (ss.score) ASC, ss.student_id

34、查询课程名称为“语文”,且分数低于60的学生姓名和分数 
select st.student_name,ss.score 
from student_score ss 
inner join student st on ss.student_id=st.student_id
inner join course co on ss.course_id=co.course_id
where co.course_name='语文' and ss.score<60

35、查询所有学生的选课情况;
select st.student_name,co.course_name,ss.score 
from student_score ss 
inner join student st on ss.student_id=st.student_id
inner join course co on ss.course_id=co.course_id

36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
select st.student_name,co.course_name,ss.score 
from student_score ss 
inner join student st on ss.student_id=st.student_id
inner join course co on ss.course_id=co.course_id
where ss.score>70

40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩 
select st.student_name,co.course_name,te.teacher_name,ss.score 
from student_score ss 
inner join student st on ss.student_id=st.student_id
inner join course co on ss.course_id=co.course_id
inner join teacher te on co.teacher_id=te.teacher_id
where te.teacher_name='叶平'
order by ss.score desc
limit 1

41、查询各个课程及相应的选修人数
select course_id,count(course_id) from student_score group by course_id order by course_id

43、查询每门功成绩最好的前两名 
SELECT
	t0.student_id, t0.course_id, t0.score
FROM student_score t0
WHERE
	t0.student_score_id IN (
		SELECT student_score_id
		FROM student_score
		WHERE t0.course_id = course_id
		ORDER BY 	score DESC
		limit 2
	)

44、统计每门课程的学生选修人数,要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人	数相同,按课程号升序排列 
select course_id,count(student_id) from student_score group by course_id order by count(student_id) desc, course_id

45、检索至少选修两门课程的学生学号
select student_id,count(*) 
from student_score 
group by student_id 
having count(*)>=2
order by count(*) desc, student_id

46、查询全部学生都选修的课程的课程号和课程名 
SELECT co.course_id, co.course_name
FROM student_score ss
INNER JOIN course co ON co.course_id = ss.course_id
GROUP BY co.course_id, co.course_name
HAVING COUNT(co.course_id) = (SELECT COUNT (student_id) FROM student)

48、查询两门以上不及格课程的同学的学号及其平均成绩 
select student_id,avg(score) from student_score where score<60 group by student_id having count(1)>=2





分享到:
更多

网友评论    (发表评论)

共3 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。