sql查询练习

sql查询练习:

表:

-- 2、查询“生物”课程比“体育”课程成绩高的所有学生的学号;
select A.student_id,sw,ty from
(select student_id,number as sw from score left join course on score.course_id = course.cid where course.cname = '生物') as A
left join
(select student_id,number  as ty from score left join course on score.course_id = course.cid where course.cname = '物理') as B
on A.student_id = B.student_id where sw > if(isnull(ty),0,ty);
3、查询平均成绩大于60分的同学的学号和平均成绩; 
select student_id,avg(number) as score_avg from score group by student_id having score_avg > 60
4.查询所有同学的学号、姓名、选课数、总成绩
select student_id, sname, course_count, score_sum from 
(select student_id, count(course_id) as course_count, sum(number) as score_sum
from score group by student_id) as A right join student on A.student_id = student.sid
5、查询姓“李”的老师的个数;
select count(1) from teacher where tname like '李%';

6、查询没学过“李平”老师课的同学的学号、姓名;
select sid,sname from student where sid not in 
(SELECT distinct student_id from score where score.course_id in (
select cid from course left join teacher on course.teacher_id=teacher.tid
where tname='李平')) -- 先查到李平老师教的所有课的ID,再取选过课的所有学生ID,再在学生表中筛选

7、查询学过“1”并且也学过编号“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 student.sid=B.student_id group by student_id having 
count(1)=2

8、查询学过“波多”老师所教的所有课的同学的学号、姓名;
select student_id,sname from
-- 1.查出学过波多老师课的同学
(select student_id,course_id from score where course_id in (
select cid from course left join teacher on course.teacher_id=teacher.tid where tname='波多')
) as B 
-- 3.查出所有学过波多老师课的同学
left join student on B.student_id = student.sid group by student_id HAVING count(1) = 
-- 2.查出波多老师所教的课程数量
(select count(1) as c from course LEFT JOIN teacher on course.teacher_id=teacher.tid group by tname having
tname='波多')

 9、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;
select * from student join (SELECT A.student_id as aid from 
(SELECT student_id,number from score where course_id=1) as A
LEFT JOIN
(SELECT student_id,number from score where course_id=2) as B
on A.student_id=B.student_id where A.number > B.number) as C
on aid = student.sid 

查询所有的课程的名称以及对应的任课老师姓名
 select cname,tname from course LEFT JOIN teacher on course.teacher_id = teacher.tid;
 
2、查询学生表中男女生各有多少人
select gender 性别, count(1) as 人数 from student GROUP BY gender

#3、查询体育成绩等于100的学生的姓名
select sname from student where sid in 
(select student_id from course join score on course.cid=score.course_id where cname='体育' and number=100)

10.查询有课程成绩小于60分的同学的学号、姓名;
SELECT  sid, sname from student where sid IN
(SELECT student_id from score where number<60)

SELECT distinct student_id, sname from student 
join score on student.sid = score.student_id where number<60


11、查询没有学全所有课的同学的学号、姓名;
先以学生分组计数课程,与总课程比较,再在student表中取出sname 
SELECT
    sid,sname
FROM
    student
WHERE
    sid IN (
SELECT student_id FROM score group by student_id
HAVING count(course_id) = (select count(cid) from course)
);

12查询波多老师教的课程的所有成绩记录
SELECT * from score 
where course_id in 
(select cid from course inner join teacher on course.teacher_id = teacher.tid 
where teacher.tname='波多');

13查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
select student_id,sname from student inner join score on student.sid=score.student_id where course_id in 
(select course_id from score where student_id=1) and student_id!=1

13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名;
先查询1号学过的所有课id,再找出至少学过一课的其他人,以这些人分组得到所学课程数,与1号所学课程数对比
select student_id,sname from student inner join score on student.sid=score.student_id
 where course_id 
in (select course_id from score where student_id=1) and student_id!=1 
GROUP BY student_id having count(course_id) = 
 (select count(course_id) from score where student_id = 1)

14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
个数相同
002学过的也学过

先过滤出和2号学的个数相同,且学的课2号也学过的student_id, 
再按学号分组再统计学的课程个数与2号相等的同学id
select 
        student_id, sname 
    from student inner join score on student.sid=score.student_id
where 
(select student_id from score where student_id!=2 group by student_id having count(1)
=(select count(course_id) from score where student_id=2))
and course_id in 
(select course_id from score where student_id = 2) 
GROUP BY  
        student_id 
    HAVING 
    count(course_id) = (select count(1) from score where student_id = 2)

15、删除学习“苍空”老师课的score表记录;
DELETE from score WHERE course_id in 
(SELECT cid from course INNER JOIN
 teacher on course.teacher_id=teacher.tid where tname='苍空') 

16.向SC表中插入一些记录,这些记录要求符合以下条件:
①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩;
由于insert 支持 
                inset into tb1(xx,xx) select x1,x2 from tb2;
        所有,获取所有没上过002课的所有人,获取002的平均成绩
insert into score select
0,sid,2,(select avg(number) FROM score where course_id=2) from student
where sid not in
(select student_id from score where course_id = 2)
 
update score  set sid=4 where sid=5
insert into score values(5,3,3,50)
delete from score where sid=4 or sid=5 or sid=6

17/按平均成绩从低到高 显示所有学生的“语文”、“数学”、“英语”三门的
课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
select sc.student_id as 学生ID,
(select number from score inner join course on score.course_id=course.cid where course.cname='生物' and score.student_id=sc.student_id)
as 生物,
(select number from score inner join course on score.course_id=course.cid where course.cname='体育' and score.student_id=sc.student_id)
as 体育,
(select number from score inner join course on score.course_id=course.cid where course.cname='物理' and score.student_id=sc.student_id)
as 物理,
count(sc.course_id) as 有效课程数,
avg(sc.number) as 有效平均分
from score as sc group by student_id desc        

18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
select course_id,max(number),min(number) from score GROUP BY course_id

19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
select course_id,avg(number) as avgnum,
SUM(case when score.number>60 then 1 else 0 END)/count(1)*100 as percent from score  
group by course_id ORDER BY avgnum asc,percent desc;

SELECT course_id, avg(number) as avgnum,
sum(case when score.number>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 score.course_id,course.cname, teacher.tname,avg(if(isnull(number),0,number)) as a from course
inner join score on course.cid = score.course_id
inner join teacher on course.teacher_id = teacher.tid
GROUP BY score.course_id order by a desc;

21、查询各科成绩前三名的记录:(不考虑成绩并列情况)
先查出第四名的成绩(分组去重),然后在成绩表中找出比第四名高的成绩的记录 
select * from 
(select
        student_id,
        course_id,
        number,
        1,
        (select number from score as s2 where s2.course_id=s1.course_id GROUP BY number ORDER BY number desc limit 3,1) as cc
from score as s1) as T 
where T.number>T.cc; 

22、查询每门课程被选修的学生数;
select course_id, count(1) from score group by course_id;

23、查询出只选修了一门课程的全部学生的学号和姓名;
select student_id, sname from student inner join 
score on student.sid = score.student_id group by 
student_id HAVING count(1)=1

24、查询男生、女生的人数;
select * from (select count(1) as man from student where gender='') as A,
(select count(1) as feman from student where gender='') as B

25、查询姓“张”的学生名单;
select sname from student where sname like '张%'

26、查询同名同姓学生名单,并统计同名人数;
SELECT sname,count(1) from student group by sname; 

27、查询每门课程的平均成绩,结果按平均成绩升序排列,
平均成绩相同时,按课程号降序排列;
SELECT course_id,avg(number) as a from score
GROUP BY course_id
ORDER BY  a asc, course_id desc;

28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
select student_id,sname,avg(number) as avg from  student inner join 
score on student.sid=score.student_id GROUP BY student_id
having avg > 50;

29、查询课程名称为“数学”,且分数低于60的学生姓名和分数;
SELECT student_id,score.number from student LEFT JOIN
score on student.sid=score.student_id
LEFT JOIN course on score.course_id=course.cid
where course.cname ='体育' and score.number < 60

30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
SELECT student_id,sname from student LEFT JOIN
score on student.sid=score.student_id
where course_id =3 and score.number >80

31、求选了课程的学生人数
SELECT count(distinct student_id) from score;

select count(c) from (
select count(1) as c from score group by student_id) as A

32、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
select sname,number from student LEFT JOIN score on student.sid=score.student_id
where score.course_id in (
SELECT cid from course INNER JOIN teacher on course.teacher_id=teacher.tid where tname='波多')
ORDER BY number desc LIMIT 1;

33、查询各个课程及相应的选修人数;
select course.cname,count(1) from course inner JOIN
score on course.cid = score.course_id group by course_id

34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;(笛卡尔积)
SELECT DISTINCT s1.sid,s2.student_id,s1.course_id,s1.number from 
score as s1,score as s2 where s1.number=s2.number and s1.course_id !=s2.course_id;

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

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

-- 40、检索“002”课程分数小于60,按分数降序排列的同学学号;
select student_id from score where course_id=2 and number<60 order by number desc

-- 41、删除“002”同学的“001”课程的成绩;
delete from score where course_id = 1 and student_id = 2

-- 42、查询每门课程成绩都高于57分的同学id
-- 一,查出每个同学高于57分的课程数,查出每个同学所学课程数,相等
select s1.student_id from 
(select student_id, count(1) as c from score where number>57 group by student_id) as s1,
(select student_id, count(1) as c from score group by student_id) as s2 
where s1.student_id=s2.student_id and s1.c = s2.c;
-- 二、查出每个同学的课程数,等于此同学大于57分的课程数,
select student_id from score GROUP BY student_id HAVING count(1) = sum(case when number>57 then 1 else 0 end);
-- 三、查出id不在有小于等于57分的id
select student_id from score group by student_id  having student_id not in (SELECT student_id from score where number<=57);
-- 四、以同学分组,最小成绩都大于57的同学
select student_id from score GROUP BY student_id having min(number)>57;

-- 43、查询1号课程成绩大于2号课程成绩的同学
select A.student_id from  
(select student_id,number from score where course_id=1) as A,
(select student_id,number from score where course_id=2) as B
where A.student_id = B.student_id and A.number>B.number

 

转载于:https://www.cnblogs.com/zwq-/p/10911852.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值