文章目录 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数(偏难)2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数3、查询平均成绩大于等于60分的每个同学的学生编号和学生姓名和平均成绩4、查询平均成绩小于
SELECTst.*,sc1.s_score 01_score,sc2.s_score 02_scoreFROMstudent st,score sc1,score sc2WHEREst.s_id = sc1.s_idAND sc1.s_id = sc2.s_idAND sc1.c_id = '01'AND sc2.c_id = '02'AND sc1.s_score > sc2.s_score 通过score表自连接后,过滤出每位学生 “01”课程分数和 “02”课程分数的一条记录,最后将01”课程分数大于 “02”课程分数记录筛选出来
与第1题思路一样
SELECTst.s_id,s_name,avg(sc.s_score)FROMstudent st,score scWHEREst.s_id = sc.s_idGROUP BYst.s_id,st.s_nameHAVINGavg(sc.s_score) >= 60 SELECTst.s_id,s_name,ROUND(avg(sc.s_score),2) avgscFROMstudent st LEFT JOINscore sconst.s_id = sc.s_idGROUP BYst.s_id,st.s_nameHAVINGavg(sc.s_score) < 60 or avgsc is null SELECTst.s_id,st.s_name,count(sc.c_id) AS sum_course,sum(sc.s_score) AS sum_scoreFROMstudent stLEFT JOIN score sc ON st.s_id = sc.s_idGROUP BYst.s_id,st.s_name 此题比较简单,使用分组即可。需要注意下在Mysql中使用group by后,select后出现的字段要么是
分组的字段要么是聚集函数不然会报错
SELECTcount(*)FROMteacherWHEREt_name LIKE '李%' 这一题就是考察 mysql中like关键字的使用

SELECTst.*FROMstudent stWHEREst.s_id IN (SELECTs_idFROMscoreWHEREc_id = (SELECTc_idFROMcourseWHEREt_id = (SELECTt_idFROMteacherWHEREt_name = '张三'))) 这题我使用的是where型子查询需要使用到in关键字,使用连接查询也可以.根据表之间的连接关系:
类似这种子查询都可以用连接查询替代
此题只需要把上一题中的in关键改成not in关键字即可
SELECT*FROMstudentWHEREs_id IN (SELECT sc1.s_idFROMscore sc1JOIN score sc2 ON sc1.s_id = sc2.s_idWHEREsc1.c_id = '01'AND sc2.c_id = '02') 这一题的方法与第一题类似,第一题搞懂了,这一题就很简单了。直接通过score表进行自连结运算然后筛选出即选修了’01’号课程又选修了’02’号课程的s_id
SELECTst.* FROMstudent st WHEREst.s_id IN ( SELECT s_id FROM score WHERE c_id = '01' ) AND st.s_id NOT IN ( SELECT s_id FROM score WHERE c_id = '02' ) SELECT*FROMstudentWHEREs_id NOT IN (SELECTs_idFROMscoreGROUP BYs_idHAVINGcount(c_id) = (SELECTcount(c_id)FROMcourse)) SELECT DISTINCTst.*FROMstudent stLEFT JOIN score sc ON st.s_id = sc.s_idGROUP BYs_id,c_idHAVINGc_id IN (SELECTc_idFROMscoreWHEREs_id = '01') SELECT DISTINCT st.* FROM student st LEFT JOIN score sc ON st.s_id=sc.s_id WHERE c_id IN (SELECT c_id FROM score WHERE s_id='01') select * from Student where s_id in (SELECT DISTINCT s_id from Score where c_id in (select c_id from Score where s_id='01')) 这题关键在于用其他每个学生所学课程号与"01"学生所学课程的课程号作对比
SELECTst.*FROMstudent stJOIN score sc ON st.s_id = sc.s_idWHEREsc.c_id IN (SELECTc_idFROMscoreWHEREs_id = '01')AND st.s_id != '01'GROUP BYst.s_idHAVINGcount(st.s_id) = (SELECTcount(*)FROMscoreWHEREs_id = '01') select Student.* from Student left JOIN Score on Student.s_id = Score.s_id where Score.c_id in (select c_id from Score where s_id='01') and Score.s_id <> '01' GROUP BY Student.s_id HAVING COUNT(*)=(select count(*) from Score where s_id='01') SELECT*FROMstudentWHEREs_id NOT IN (SELECTst.s_idFROMstudent st,score scWHEREst.s_id = sc.s_idAND c_id IN (SELECTc_idFROMteacher teLEFT JOIN course c ON te.t_id = c.t_idWHEREt_name = '张三')) SELECTst.s_id,st.s_name,round(avg(sc.s_score))FROMstudent st,score scWHEREst.s_id = sc.s_idAND s_score < 60GROUP BYs_idHAVINGcount(*) >= 2 SELECTst.*,sc.c_id,sc.s_scoreFROMstudent st,score scWHEREst.s_id = sc.s_idAND s_score < 60AND c_id = '01'ORDER BYs_score DESC select st.s_id,(select s_score from score where c_id='01' and s_id=st.s_id) as '语文' ,(select s_score from score where c_id='02' and s_id=st.s_id) as '数学',(select s_score from score where c_id='03' and s_id=st.s_id) as '英语',round((select avg(s_score) from score where s_id=st.s_id group by s_id),2) as '平均分'from student st order by 平均分 desc 这一题用到了子查询的另一种方式即创建计算字段,该子查询对检索出的每个student执行一次,在此例中,该查询共执行了8次,因为检索出8名学生,另外当在group by 或 order by后面使用中文时,不要加单引号,否则不生效
explain select sc.c_id,c_name,max(s_score),min(s_score),ROUND(avg(s_score),2) '平均分',ROUND(100*(SUM(case when sc.s_score>=60 then 1 else 0 end)/SUM(case when sc.s_score then 1 else 0 end)),2) as '及格率',ROUND(100*(SUM(case when sc.s_score>=70 and sc.s_score<80 then 1 else 0 end)/SUM(case when sc.s_score then 1 else 0 end)),2) as '中等率',ROUND(100*(SUM(case when sc.s_score>=80 and sc.s_score<90 then 1 else 0 end)/SUM(case when sc.s_score then 1 else 0 end)),2) as '优良率',ROUND(100*(SUM(case when sc.s_score>=90 then 1 else 0 end)/SUM(case when sc.s_score then 1 else 0 end)),2) as '优秀率'from course c,score sc where c.c_id=sc.c_id group by sc.c_id SELECT c.t_id,t.t_name,s.c_id,ROUND(AVG(s_score),2) avgsc FROM teacher t,course c,score s WHERE t.t_id=c.t_id AND c.c_id=s.c_id GROUP BY s.c_id,c.t_id,t.t_name ORDER BY avgsc DESC select c_id ,count(*) from score group by c_id select st.s_id,st.s_name,count(*) '课程数' from student st left join score sc on st.s_id=sc.s_id group by s_id having count(*)=2 select s_id,s_name from Student WHERE s_id in (select s_id FROM Score GROUP BY s_id HAVING count(*) = 2) select s_sex,(select count(s_sex) from student st2 where s_sex = st1.s_sex) '人数' from student st1 group by s_sex select DISTINCT s_sex,(select count(s_sex) from Student st2 where s_sex = st1.s_sex) '人数' from Student st1 select * from student where s_name like '%风%' select s_name,count(*)-1 '同名人数' from student group by s_name having count(*)>=2 select s_name from student where s_birth like '1990%' select c_id, ROUND(avg(s_score),2) '平均成绩' from score group by c_id order by 平均成绩 desc ,c_id select st.s_id,s_name,ROUND(avg(s_score),2) '平均成绩' from student st,score sc where st.s_id=sc.s_id group by st.s_id , s_name having avg(s_score)>=85 select s.s_id,s.s_name,ROUND(AVG(sc.s_score)) '平均分' from Student s LEFT JOIN Score sc ON s.s_id=sc.s_id GROUP BY s.s_id,s.s_name HAVING AVG(sc.s_score)>=85 select s_name,s_score from student st,course c,score sc where st.s_id=sc.s_id and sc.c_id=c.c_id and c_name='数学' and s_score<60 select distinct s_name,s_score from Student s LEFT JOIN Score sc on s.s_id=sc.s_id LEFT JOIN Course c on c.c_id=sc.c_id where c_name='数学' and s_score<60 select st.s_id,s_name,c_name,s_score from student st,course c,score sc where st.s_id=sc.s_id and sc.c_id=c.c_id select s_name,c_name,s_score from student st,course c,score sc where st.s_id = sc.s_id and c.c_id =sc.c_id and s_score>70 select st.*,c_name,s_score from student st,score sc,course c where st.s_id=sc.s_id and sc.c_id=c.c_id and s_score<60 select st.s_id,st.s_name from student st,score sc where st.s_id=sc.s_id and c_id='01' and s_score>=80 select c.c_name '课程名', count(*) '人数' from Course c,Score s where c.c_id=s.c_id GROUP BY s.c_id,c.c_name select c_name '课程名' ,(select count(*) from Score s1 where c_id=c.c_id) '人数' from Course c select st.*,s_score from student st,score sc where st.s_id=sc.s_id and c_id=(select c_id from teacher te left join course c on te.t_id=c.t_id where t_name='张三') order by s_score desc limit 1 select distinct s1.* FROM score s1 ,score s2 where s1.c_id !=s2.c_id and s1.s_score=s2.s_score select sc1.s_id,sc1.c_id,sc1.s_score from score sc1where (select COUNT(1) from score sc2 where sc2.c_id=sc1.c_id and sc2.s_score>=sc1.s_score)<=2 ORDER BY sc1.c_id 首先,select count(1)表示查询出表中符合条件的行数;
sc2.c_id=sc1.c_id and sc2.s_score>=sc1.s_score表示查询条件;
select COUNT(1) from score sc2 where sc2.c_id=sc1.c_id and sc2.s_score>=sc1.s_score总体的意思就是从表sc2中查询出满足sc2.c_id=sc1.c_id and sc2.s_score>=sc1.s_score条件的行数;
结合完整的sql语句来看,这个查询出的行数要<=2,所以"行数<=2"是作为前一个查询语句的查询条件的。
这样这个语句简单点理解就是:从sc1表查询sc1.s_id,sc1.c_id,sc1.s_score这三列,查询条件是"行数<=2"。
select c_id,count(*) '选修人数' from score group by c_id having count(*)>5 order by 选修人数 desc ,c_id select s_id from score group by s_id having count(*)>=2 select st.* from student st,score sc where st.s_id=sc.s_id group by sc.s_id having count(*) = (select count(*) from course) 来源地址:https://blog.csdn.net/m0_45210394/article/details/125492544
--结束END--
本文标题: sql语句练习50题(含解析)
本文链接: https://www.lsjlt.com/news/373868.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0