参考链接:https://www.cnblogs.com/edisonchou/p/3878135.html   感谢博主

     https://blog.csdn.net/flycat296/article/details/63681089

一、建表,插入数据

  1. create database zuoye2;
  2. use zuoye2;
  3.  
  4. CREATE TABLE Student
  5. (
  6. S INT,
  7. Sname nvarchar(32),
  8. Sage INT,
  9. Ssex nvarchar(8)
  10. ) ;
  11.  
  12. CREATE TABLE Course
  13. (
  14. C INT,
  15. Cname nvarchar(32),
  16. T INT
  17. ) ;
  18.  
  19. CREATE TABLE Sc
  20. (
  21. S INT,
  22. C INT,
  23. score INT
  24. ) ;
  25.  
  26. CREATE TABLE Teacher
  27. (
  28. T INT,
  29. Tname nvarchar(16)
  30. );
  31.  
  32. insert into Student select 1,N'刘一',18,N'男' union all
  33. select 2,N'钱二',19,N'女' union all
  34. select 3,N'张三',17,N'男' union all
  35. select 4,N'李四',18,N'女' union all
  36. select 5,N'王五',17,N'男' union all
  37. select 6,N'赵六',19,N'女' ;
  38.  
  39. insert into Teacher select 1,N'叶平' union all
  40. select 2,N'贺高' union all
  41. select 3,N'杨艳' union all
  42. select 4,N'周磊';
  43.  
  44. insert into Course select 1,N'语文',1 union all
  45. select 2,N'数学',2 union all
  46. select 3,N'英语',3 union all
  47. select 4,N'物理',4;
  48.  
  49. insert into SC
  50. select 1,1,56 union all
  51. select 1,2,78 union all
  52. select 1,3,67 union all
  53. select 1,4,58 union all
  54. select 2,1,79 union all
  55. select 2,2,81 union all
  56. select 2,3,92 union all
  57. select 2,4,68 union all
  58. select 3,1,91 union all
  59. select 3,2,47 union all
  60. select 3,3,88 union all
  61. select 3,4,56 union all
  62. select 4,2,88 union all
  63. select 4,3,90 union all
  64. select 4,4,93 union all
  65. select 5,1,46 union all
  66. select 5,3,78 union all
  67. select 5,4,53 union all
  68. select 6,1,35 union all
  69. select 6,2,68 union all
  70. select 6,4,71

二、开始练习

四张表分别如下:course,  sc,  student,  teacher

  1. #(1)查询“001”课程比“002”课程成绩高的所有学生的学号;
  2. select * from
  3. (select * from sc where c=1) as a,
  4. (select * from sc where c=2) as b
  5. where a.s = b.s and a.score > b.score
  6.  
  7. #其实跟这个一样,就是先把=1,=2两个表查询出来拼接,然后再筛选
  8. select * from
  9. (select * from sc where c=1) as a inner JOIN
  10. (select * from sc where c=2) as b on a.s = b.s
  11. where a.score > b.score

  1. #(2) 查询平均成绩大于60分的同学的学号和平均成绩;
  2. select s,avg(score) as avgscore from sc group by s having avgscore > 60
  3. #分组之后的条件直接用having就可以啦

  1. #(3)查询所有同学的学号、姓名、选课数、总成绩;
  2. select b.s,b.sname,a.countscore,a.sumsocre from
  3. (select sum(score) as sumsocre,s,count(1) as countscore from sc group by s) as a
  4. inner join student as b on b.s = a.s
  5. #在两张表中,先查询选课数,总成绩,然后拼接到student中就好啦

  1. #(4)查询姓“李”的老师的个数;
  2. select count(1) from teacher where tname like '李%'
  3. #熟悉like的用法

  1. #(5)查询没学过“叶平”老师课的同学的学号、姓名;
  2. select s,sname from student where s not in
  3. (select s from sc where c in (select c from course where t in (select t from teacher where tname = '叶平')))
  4. #一层层嵌套,只要知道哪些是学过的,然后not in就可以啦

  1. #(6)查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
  2. select s,sname from student where s in
  3. (select a.s from
  4. (select * from sc where c=1) as a,
  5. (select * from sc where c=2) as b
  6. where a.s = b.s);
  7. #学过1也学过2的使用拼接来查询出来,然后再查学号姓名

  1. #(7)查询学过“叶平”老师所教的所有课的同学的学号、姓名;
  2. select s,sname from student where s in
  3. (select s from sc where c in (select c from course where t in (select t from teacher where tname = '叶平')))
  4. #UPDATE teacher set tname = '叶平' where t=2
  5. select s,sname from student where s in (select s from (select s,count(1) as counts from (select sc.*,course.cname,course.t,teacher.tname from sc left join course on course.c = sc.c left join teacher on course.t = teacher.t where tname='叶平')
  6. as a group by a.s) as b where counts = (select count(1) from course where t in (select t from teacher where tname = '叶平')))
  7. #这个不能按照前面那样来做,比如叶平更改成两个的话,发现就不对了,这里的思路是,学生学习叶平课程的数量=叶平教学的数量
  8.  
  9. select s,count(1) from sc where c in (select c from course where t in (select t from teacher where tname='叶平')) group by s ; #这个查询学生选择叶平课程的数量
  10. select count(1) from course where t in (select t from teacher where tname = '叶平'); #叶平一共课程是2
  11. select s from sc where c in
  12. (select c from course where t in (select t from teacher where tname='叶平')) group by s
  13. having count(1) = (select count(1) from course where t in (select t from teacher where tname = '叶平'));
  14. #两个拼接起来
  15. select s,sname from student where s in (select s from sc where c in
  16. (select c from course where t in (select t from teacher where tname='叶平')) group by s
  17. having count(1) = (select count(1) from course where t in (select t from teacher where tname = '叶平')))

先查询每个学生叶平课程数量,在查询叶平教学2门,然后查出那些刚好是两门的学生,再查学生的信息

  1. #(8)查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
  2. select s,sname from student where s in(select a.s from
  3. (select * from sc where c=1) as a,
  4. (select * from sc where c=2) as b
  5. where a.s = b.s and a.score > b.score)
  6. #跟前面那题差不多,就是拼接再查

  1. #(9)查询有课程成绩小于60分的同学的学号、姓名;
  2. select s,sname from student where s in (select DISTINCT s from sc where score < 60)
  3. #比较简单

  1. #(10)查询没有学全所有课的同学的学号、姓名;
  2. select count(1),s from sc group by s;
  3. select count(DISTINCT c) from sc;
  4. select s,sname from student where s in (select s from sc group by s having count(1) < (select count(DISTINCT c) from sc));
  5. #查询每个同学的课程数
  6. #查询一共课程数
  7. #小于总共课程数的学生查出来

  1. #()查询至少有一门课与学号为“”的同学所学相同的同学的学号和姓名;
  2. select * from sc where c=;
  3. select s,sname from student where s in (select s from sc where c in (select c from sc where s=));
  4. #查出1号同学学过的课程c,然后只要有学这些C的同学都可以

  1. #()查询至少学过学号为“”同学所有一门课的其他同学学号和姓名;(感觉跟11题有重叠)
  2.  
  3. #()把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
  4.  
  5. #()查询和“”号的同学学习的课程完全相同的其他同学学号和姓名;
  6. select * from sc where s=;
  7. select s,sname from student where s != and s in (select s from sc where c in (select c from sc where s=) group by s having count() = (select count() from sc where s=))
  8. #这个做法是先查询出所有修过2号同学那些课程的条目,然后group by之后如果count数量与2号同学的count数量一致,那么就筛选出来。

  1. #(15)删除学习“叶平”老师课的SC表记录;
  2. delete from sc where c in (select c from course where t in (select t from teacher where tname = '叶平'))
  1. #(17)按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
  2. select DISTINCT sc.s as '学生ID',a.score as '语文',b.score as '数学',c.score as '英语',d.num as '有效课程数',avgscore as '有效平均分' from sc
  3. left join (select s,score from sc where c = 1) as a on sc.s = a.s
  4. left join (select s,score from sc where c = 2) as b on sc.s = b.s
  5. left join (select s,score from sc where c = 3) as c on sc.s = c.s
  6. left join (select s,count(1) as num from sc group by s) as d on sc.s = d.s
  7. left join (select s,avg(score) as avgscore from sc group by s) as e on sc.s = e.s
  8. order by avgscore
  9. #一个个查询出来后拼接起来,方法感觉比较蠢

  1. #(18)查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
  2. select a.c,maxsc as '最高分',minsc as '最低分' from (select c,max(score) as maxsc from sc group by c) as a left join (select c,min(score) as minsc from sc group by c) as b on a.c = b.c;

  1. #(19)按各科平均成绩从低到高和及格率的百分数从高到低顺序;
  2. select a.c,a.avgsc,jige / zong * 100 from
  3. (select c,avg(score) as avgsc,count(1) as zong from sc GROUP BY c) as a
  4. left join
  5. (select c,count(1) as jige from sc where score >=60 group by c) as b
  6. on a.c=b.c;

  1. #(21)查询不同老师所教不同课程平均分从高到低显示;
  2. select sc.c,avg(score) as avgsc,tname,cname from sc left join course as a on a.c = sc.c left join teacher as b on b.t = a.t group by sc.c order by avgsc desc
  3.  
  4. #(23)统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
  5. select sc.c,max(cname),
  6. sum(case when sc.score between 85 and 100 then 1 else 0 end) as '[85-100]',
  7. sum(case when sc.score between 70 and 85 then 1 else 0 end) as '[70-85]',
  8. sum(case when sc.score between 60 and 70 then 1 else 0 end) as '[60-70]',
  9. sum(case when sc.score between 0 and 60 then 1 else 0 end) as '[0-60]'
  10. from sc left join course as a on a.c = sc.c
  11. group by c

  1. #(26)查询每门课程被选修的学生数;
  2. select sc.c,cname,count(1) from sc left join course as a on sc.c = a.c group by c;
  3. #(27)查询出只选修了一门课程的全部学生的学号和姓名;
  4. select sc.s,sname from sc LEFT JOIN student as a on a.s=sc.s group by s having count(1) =3;

  1. #(28)查询男生、女生的人数;
  2. select count(2),ssex from student group by ssex;
  3. #(29)查询姓“张”的学生名单;
  4. select * from student where sname like '张%';
  5. #(30)查询同名同姓学生名单,并统计同名人数;
  6. select sname from student group by sname having count(1)>1
  1. #(32)查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
  2. select c,avg(score) as avgscore from sc group by c order by avgscore,c desc;
  3. #(33)查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
  4. select s,avg(score) as avgscore from sc group by s having avgscore > 85;
  5. #(34)查询课程名称为“数学”,且分数低于60的学生姓名和分数;
  6. select * from sc where c = (select c from course where cname = '数学') and score < 60
  1. #(35)查询所有学生的选课情况;
  2. select sc.s,b.sname,a.cname,sc.c from sc left join course as a on a.c = sc.c left join student as b on b.s = sc.s;

后面的题目感觉简单了太多。重点还是前面的三十题吧。

MySQL—练习2的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  10. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

随机推荐

  1. 单线程和多线程处理1W条数据对比代码

    package study.interview; import java.util.ArrayList; import java.util.HashMap; import java.util.Link ...

  2. Devexpres下LookUpEdit绑定数据后会默认弹出数据框的解决办法

    LookUpEdit绑定数据后会默认弹出数据框很不友好问题现象: 问题解决前的代码: lueManagement.Text = groupEntity.Name; 2 lueManagement.Ed ...

  3. Java LinkedList 和 ArrayList

    Java 手册 java.util 类 ArrayList<E> java.lang.Object java.util.AbstractCollection<E> java.u ...

  4. Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次)

    ylbtech-Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次) 1.返回顶部 1. 这是本次培训的内容,望各位提前配好环境.工具.2.6-2.7 我们在环球金融8 ...

  5. Docker系列06:Linux修改docker镜像和容器数据存储位置

    指定镜像和容器存放路径的参数是--graph=/var/lib/docker,其默认存储位置为/var/lib/docker, Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的 ...

  6. 我的solr学习笔记--solr admin 页面 检索调试

    前言 Solr/Lucene是一个全文检索引擎,全文引擎和SQL引擎所不同的是强调部分相关度高的内容返回,而不是所有内容返回,所以部分内容包含在索引库中却无法命中是正常现象.      多数情况下我们 ...

  7. 分布式锁实践(一)-Redis编程实现总结

    写在最前面 我在之前总结幂等性的时候,写过一种分布式锁的实现,可惜当时没有真正应用过,着实的心虚啊.正好这段时间对这部分实践了一下,也算是对之前填坑了. 分布式锁按照网上的结论,大致分为三种:1.数据 ...

  8. python爬搜狗微信获取指定微信公众号的文章

    前言: 之前收藏了一个叫微信公众号的文章爬取,里面用到的模块不错.然而 偏偏报错= =.果断自己写了一个 正文: 第一步爬取搜狗微信搜到的公众号: http://weixin.sogou.com/we ...

  9. ASP.NET中的几种弹出框提示基本实现方法

    我们在.NET程序的开发过程中,常常需要和用户进行信息交互,比如执行某项操作是否成功,“确定”还是“取消”,以及选择“确定”或“取消”后是否需要跳转到某个页面等,下面是本人对常用对话框使用的小结,希望 ...

  10. 用VB6.0实现串口通信

    Then       ' 1位或2位          'byte 类型取值范围为 0-255 ,不能为-1                   = ) & )     End IfstrHe ...