数据表:分别有四个表

–1.学生表 
Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 
–2.课程表 
Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 
–3.教师表 
Teacher(t_id,t_name) –教师编号,教师姓名 
–4.成绩表 
Score(s_id,c_id,s_score) –学生编号,课程编号,分数

sql语句练习题(上):

-- 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
select s.*,s1.s_score lscore,s2.s_score 2score from student s,Score s1,Score s2 where s.s_id=s1.s_id and s.s_id=s2.s_id and s1.c_id="01" and s2.c_id="02" and s1.s_score>s2.s_score;-- 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数
select s.*,s1.s_score score1,s2.s_score score2 from student s,Score s1,Score s2 where s.s_id=s1.s_id and s.s_id=s2.s_id and s1.c_id="01" and s2.c_id="02" and s1.s_score<s2.s_score;-- 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
select s.s_id,s.s_name,avg(s2.s_score) avgSc from Student s,Score s2 where s.s_id=s2.s_id group by s2.s_id HAVING avg(s2.s_score) >=60;-- 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩-- (包括有成绩的和无成绩的)select s.s_id,s.s_name,avg(s2.s_score) avgSc from Student s,Score s2 where s.s_id=s2.s_id group by s2.s_id HAVING avg(s2.s_score) <=60;-- 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
select s.s_id,s.s_name,count(s2.c_id) as '选课总数',sum(s2.s_score) as '总成绩' from Student s,Score s2 where s.s_id=s2.s_id GROUP BY s2.s_id;-- 6、查询"李"姓老师的数量   用like 模糊查询
select count(*) as '数量' from Teacher where t_name like '李%';-- 7、查询学过"张三"老师授课的同学的信息   四表联查
select s.* from Student s,Score s2,Course c,Teacher t where s.s_id=s2.s_id and c.c_id=s2.c_id and t.t_id=c.t_id and t.t_name = "张三";-- 8、查询没学过"张三"老师授课的同学的信息
select s.* from Student s,Teacher t,Score s2 where s.s_id=s2.s_id and t.t_id=s2.c_id and s.s_name not in(select Student.s_name from Student,Teacher,Score  where Student.s_id=Score.s_id and Teacher.t_id=Score.c_id and Teacher.t_name="张三");-- 9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
select s_id,s_name from student where s_id in(select sc.s_id from (select * from score where c_id='01') as sc join (select * from score where c_id='02') as sc2 on sc.s_id=sc2.s_id);-- 10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
select s1.* from student s1 join score sc on s1.s_id =sc.s_id and sc.c_id='01' where s1.s_id not in(select s1.s_id from student s1 join score sc on s1.s_id = sc.s_id and sc.c_id='02');-- 11、查询没有学全所有课程的同学的信息
select s.* from Student s where s.s_id not in(select s2.s_id from Score s2 group by s2.s_id HAVING count(s2.c_id)=(select count(c.c_id) from Course c));-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
select s.*from Student s,Score s2 where s2.s_id=s.s_id and s2.c_id in(select c_id from Score s2 where s2.s_id="01") and not s.s_id="01" group by s.s_id;-- 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
select * from Student s where s.s_id in (select s2.s_id from Score s2 where s2.s_id not in (select a.s_id from Score a where a.c_id not in (select c_id from Score where s_id="01")) and s2.s_id <> '01' GROUP BY s2.s_id HAVING count(1) = (select count(1) from Score where s_id='01'));-- 14、查询没学过"张三"老师讲授的任一门课程的学生姓名 select s.s_name from Student s,Teacher t,Score s2 where s.s_id=s2.s_id and t.t_id=s2.c_id and s.s_name not in(select Student.s_name from Student,Teacher,Score  where Student.s_id=Score.s_id and Teacher.t_id=Score.c_id and Teacher.t_name="张三") GROUP BY s.s_name;-- 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
select s.s_id,s.s_name,avg(s2.s_score) from Student s,Score s2 where s.s_id=s2.s_id and s2.s_score<60 GROUP BY s2.s_id HAVING count(*) >1;-- 16、检索"01"课程分数小于60,按分数降序排列的学生信息select s.*,s2.s_score from Student s join score s2 on s.s_id=s2.s_id where s2.c_id='01' and s2.s_score<60;-- 17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩select s2.s_score as suos,(select avg(score.s_score) as a from score ORDER BY a desc) as avgs  from score s2 ORDER BY suos desc;-- SELECT student.sid,b.01,b.02,b.03,b.'平均成绩 '
-- FROM student LEFT JOIN (SELECT scid,max(CASE cid when '01' THEN score ELSE 0 END) '01'max(CASE cid when '02' THEN score ELSE 0 END) '02',
-- max(CASE cid when '03' THEN score ELSE 0 END) '03',avg(score) '平均成绩'
-- from sc GROUP BY scid) B on student.sid=b.scid ORDER BY b.平均成绩 desc-- 18.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90select distinct c.c_id,c.c_name,B.maxS,B.minS,B.avgS,b.jige from Course c left join (select avg(sc.s_score) as avgS,max(sc.s_score) as  maxS,min(sc.s_score) as minS,c_id, CONCAT(round(sum(case when s_score>=60 then 1 else 0 end)/count(*)*100,2),'%') as jige from Score sc  group by sc.c_id) B  on c.c_id=B.c_id;-- 19、按各科成绩进行排序,并显示排名 select a.s_name,b.s_score,b.c_id,(select count(c.s_score)+1 from (select c.s_score,count(c.s_score) from Score c group by c.s_score ORDER BY c.s_score desc) c where c.s_score > b.s_score) as '排名' from (select s_id,s_name from student) a left join score b on a.s_id=b.s_id where b.s_score>0 ORDER BY b.c_id,b.s_score desc;-- 20、查询学生的总成绩并进行排名select s.s_name,sum(s2.s_score) zongsc from student s left join score s2 on s.s_id=s2.s_id group by s.s_id ORDER BY zongsc desc;-- 21、查询不同老师所教不同课程平均分从高到低显示
SELECT b.t_id,b.t_name,a.c_name,a.c_id,AVG(c.s_score)'avgsc' FROM course as a INNER JOIN teacher as b ON a.t_id=b.t_id INNER JOIN score as c ON c.c_id=a.c_id GROUP BY c.c_id  ORDER BY avgsc DESC;-- 22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩(SELECT st.*,sc.s_score,sc.c_id FROM score sc,student st WHERE sc.s_id = st.s_id AND sc.c_id = '01' ORDER BY sc.s_score DESC LIMIT 1,2)
UNION ALL
(SELECT st.*,sc.s_score,sc.c_id FROM score sc,student st WHERE sc.s_id = st.s_id AND sc.c_id = '02' ORDER BY sc.s_score DESC LIMIT 1,2)
UNION ALL
(SELECT st.*,sc.s_score,sc.c_id FROM score sc,student st WHERE sc.s_id = st.s_id AND sc.c_id = '03' ORDER BY sc.s_score DESC LIMIT 1,2)-- 23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比SELECT sc.c_id,co.c_name,SUM(CASE WHEN sc.s_score<=100 and sc.s_score>=85 then 1 ELSE 0 END)'[100-85]',
SUM(CASE WHEN sc.s_score<=85 and sc.s_score>=70 then 1 ELSE 0 END)'[85-70]',
COUNT(CASE WHEN sc.s_score<=70 and sc.s_score>=60 then 521 ELSE NULL END)'[70-60]',
SUM(CASE WHEN sc.s_score<=60 then 1 ELSE 0 END)'[0-60]'
FROM
score as sc
INNER JOIN
course as co ON sc.c_id=co.c_id
GROUP BY sc.c_id,co.c_name;SELECT c.c_id,c.c_name
,((SELECT COUNT(1) FROM score sc WHERE sc.c_id=c.c_id AND sc.s_score<=100 AND sc.s_score>80)/(SELECT COUNT(1) FROM score sc WHERE sc.c_id=c.c_id )) "100-85"
,((SELECT COUNT(1) FROM score sc WHERE sc.c_id=c.c_id AND sc.s_score<=85 AND sc.s_score>70)/(SELECT COUNT(1) FROM score sc WHERE sc.c_id=c.c_id )) "85-70"
,((SELECT COUNT(1) FROM score sc WHERE sc.c_id=c.c_id AND sc.s_score<=70 AND sc.s_score>60)/(SELECT COUNT(1) FROM score sc WHERE sc.c_id=c.c_id )) "70-60"
,((SELECT COUNT(1) FROM score sc WHERE sc.c_id=c.c_id AND sc.s_score<=60 AND sc.s_score>=0)/(SELECT COUNT(1) FROM score sc WHERE sc.c_id=c.c_id )) "60-0"
FROM course c ORDER BY c.c_id-- 24、查询学生平均成绩及其名次
select s_id,avg(s_score) as Savg from score GROUP BY s_id ORDER BY Savg asc;-- 25、查询各科成绩前三名的记录-- 1.选出b表比a表成绩大的所有组-- 2.选出比当前id成绩大的 小于三个的select a.* from (select st.s_id,st.s_name,c.c_id,c.c_name,sc.s_score from student stleft join score sc on sc.s_id=st.s_idinner join course c on c.c_id=sc.c_id and c.c_id='01'order by sc.s_score desc LIMIT 0,3) a
union all
select b.* from (select st.s_id,st.s_name,c.c_id,c.c_name,sc.s_score from student stleft join score sc on sc.s_id=st.s_idinner join course c on c.c_id=sc.c_id and c.c_id='02'order by sc.s_score desc LIMIT 0,3) b
union all
select c.* from (select st.s_id,st.s_name,c.c_id,c.c_name,sc.s_score from student stleft join score sc on sc.s_id=st.s_idinner join course c on c.c_id=sc.c_id and c.c_id='03'order by sc.s_score desc LIMIT 0,3) c

Mysql的四表练习题(一)相关推荐

  1. mysql经典四表查询_mysql经典问题四表查询(教师,学生,成绩,课程表)

    创建数据库 1.创建一个数据库 create database work;web 2.进入数据库work use work;数据库 3.数据库默认编码可能不支持中文,能够在这里设置下 set name ...

  2. MySQL经典四表查询(教师,学生,成绩,课程表)多表查询

    我用的工具:MySQL5.7+SQLyog-11.2.5-0 1.表架构呈现 student(sid,sname,sage,ssex) 学生表 teacher(tid,tname) 教师表 cours ...

  3. mysql的四表查询_Mysql经典四表查询

    **建立student表** 属性有:编号:id (主键,自动增长),姓名:sname,出生年月:sage,性别:ssex(枚举) create table student(sid int prima ...

  4. mysql经典四表查询_sql 经典四表查询

    题 目 : student(sid, sname, sage, ssex) -- 学生信息表(学生编号 自增,学生姓名, 学生出生年月, 性别): teacher(tid, tname) -- 教师信 ...

  5. mysql的四表联查_数据库四表联查

    21.查询不同老师所教不同课程平均分从高到低显示SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课 ...

  6. mysql 四 表操作

    表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 本节重点: 1 创建 ...

  7. mysql第四篇:数据操作之多表查询

    mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment P ...

  8. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  9. MySQL优化四(优化表结构)

    MySQL优化四(优化表结构) MySQL优化四(优化表) 昨晚吃吃喝喝的太多,熬夜到凌晨二点.今天头发杂乱,脸庞憔悴,像是吸毒了.下午去买衣服,肚子一看大了不少.奈何女朋友还没有一个,就已经发福了. ...

最新文章

  1. 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例
  2. 【Android FFMPEG 开发】FFMPEG 解码 AVPacket 数据到 AVFrame ( AVPacket-解码器 | 初始化 AVFrame | 解码为 AVFrame 数据 )
  3. [译]以PostgreSQL为例,谈join计算的代价
  4. Python教程讲解二叉树的三种深度
  5. Windows-Qt-EclipseCDT 环境问题集
  6. 工业以太网交换机与以太网光端机的区别
  7. 2021方便速食行业洞察报告
  8. 点到点 Ipsec *** 从一端能正常发起,另一端发起不成功的解决过程
  9. Centos+Mysql+sphinx+mmseg(rhel4)
  10. Android 功耗(24)---不待机分析
  11. 霸气!任正非:即使美企断供 也无法威胁华为生存
  12. 向.NET Core项目添加EntityFrameworkCore支持
  13. 报告PPT|Python网络程序设计教学要点与案例分享(含音频)
  14. 现有产品的三种发展战略
  15. 当我讲容灾交付前,我先说点啥?
  16. golang日志收集方案之ELK
  17. Peekaboo——代码规范、冲刺任务与计划
  18. Pycharm安装打包工具
  19. 车联网(智能网联汽车)无线电频率规划发布 助力制造强国和网络强国建设
  20. js函数使用详细讲解!

热门文章

  1. 买电脑时,i5和i7处理器有什么区别?
  2. python3 cookbook中常遇问题的解答记录
  3. win7 自建wifi
  4. JFinal配置说明
  5. hdu 4745 区间dp
  6. POSIX是什么?解决了什么问题?
  7. POSIX是什么,为什么需要POSIX
  8. .NET 6 WebApi Swagger 配置 JWT token+Authorize认证
  9. 闭环式数字孪生智慧交通管理系统平台应用及分析
  10. R语言学习-基础篇1