mysql 经典数据库每日练习题之二

11、查询和”01”号的同学学习的课程完全相同的其他同学的信息
select a.* from student a
where s_id in
(SELECT s_id from score where s_id!=‘01’ and c_id in (SELECT c_id from score where s_id = ‘01’));
在这里插入图片描述

12、查询没学过”张三”老师讲授的任一门课程的学生姓名
SELECT a.s_name from student a
where a.s_id not in (SELECT s_id from score where c_id in
(SELECT c_id from course inner join teacher on course.t_id =teacher.t_id and teacher.t_name=‘张三’));
在这里插入图片描述

13、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
join过滤条件放在on和where后区别:
内连接时无区别,外连接时不同
join过程:on是对笛卡尔积进行过滤,where是对以上过滤结果再次进行过滤

SELECT a.s_id,a.s_name,round(avg(b.s_score),1) avg_score FROM student a,score b
where a.s_id =b.s_id and a.s_id in
(SELECT s_id from score where s_score < 60 GROUP BY s_id having count(1)>=2)
group by a.s_id;
在这里插入图片描述

group by 是聚合函数,意思是将查询出来之后的数据按照s_id进行分组。having 分组之后在按照having里面的条件进行筛选。
第二种方法
SELECT a.s_id,a.s_name,round(AVG(b.s_score),2) AVGS FROM student a
join score b on a.s_id =b.s_id and b.s_id IN
(SELECT s_id FROM score WHERE s_score < 60 GROUP BY s_id HAVING COUNT(1) >=2)
GROUP BY a.s_id;
在这里插入图片描述

14、检索”01”课程分数小于60,按分数降序排列的学生信息
SELECT a.* ,b.s_score,b.c_id FROM student a
join score b on a.s_id=b.s_id and c_id ='01’and s_score < 60
order by b.s_score desc;
在这里插入图片描述

注意:order by 关键字,对结果集按照一个列或者多个列进行排序(默认为升序。降序用desc
ORDER BY 多列的时候,eg:
order by A,B 这个时候都是默认按升序排列
order by A desc,B 这个时候 A 降序,B 升序排列
order by A ,B desc 这个时候 A 升序,B 降序排列
即 desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。

15、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT a., b.01score, b.02score, b.03score, b.avg from student a
JOIN (
SELECT c.s_id,
( SELECT s_score FROM score WHERE c.s_id=s_id and c_id = ‘01’ ) AS 01score,
( SELECT s_score FROM score WHERE c.s_id=s_id and c_id = ‘02’ ) AS 02score,
( SELECT s_score FROM score WHERE c.s_id=s_id and c_id = ‘03’ ) AS 03score,
AVG( s_score ) AS avg
FROM
score c
GROUP BY
c.s_id
) AS b ON a.s_id = b.s_id
ORDER BY b.avg desc;
在这里插入图片描述
select a.
,b.avg from
(select a.,b.s_score 01_score,c.s_score 02_score,d.s_score 03_score
from student a
left join score b on a.s_id = b.s_id and b.c_id = ‘01’
left join score c on a.s_id = c.s_id and c.c_id = ‘02’
left join score d on a.s_id = d.s_id and d.c_id = ‘03’
group by a.s_id)as a left join
(select s_id ,round(avg(s_score),2)as avg from score group by s_id)as b
on a.s_id = b.s_id
order by b.avg desc
16、查询每门课程被选修的学生数
SELECT count(
),c_id
from score
GROUP BY c_id
在这里插入图片描述
17、查询出只有两门课程的全部学生的学号和姓名
SELECT a.s_id,a.s_name
from student a
where a.s_id in
(SELECT s_id from score GROUP BY s_id having count()=2);
在这里插入图片描述
18、查询男生、女生人数
SELECT s_sex,count(
) from student
GROUP BY s_sex
在这里插入图片描述

select s_sex,count(1)
from student
where s_sex = ‘男’
union
select s_sex,count(1)
from student
where s_sex = ‘女’

注意:union合并两个或多个select语句的结果集,两个结果集必须拥有相同的数量的列。列要有相同的数据类型,列的顺序必须相同。

19、查询同名同性学生名单,并统计同名人数
SELECT a.s_name,a.s_sex,count(1)
from student a
GROUP BY a.s_sex,a.s_name
having COUNT(1)>1;
在这里插入图片描述

select a.s_name,a.s_sex,count(1)
from student a
join student b
on a.s_name = b.s_name and a.s_sex = b.s_sex and a.s_id != b.s_id

20、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
SELECT c_id,round(avg(s_score),2) avg
from score
GROUP BY c_id
ORDER BY avg desc,c_id asc;
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SYSZ520/article/details/97146522