MySQL—练习2
参考链接:https://www.cnblogs.com/edisonchou/p/3878135.html 感谢博主
https://blog.csdn.net/flycat296/article/details/63681089
一、建表,插入数据
- create database zuoye2;
- use zuoye2;
- CREATE TABLE Student
- (
- S INT,
- Sname nvarchar(32),
- Sage INT,
- Ssex nvarchar(8)
- ) ;
- CREATE TABLE Course
- (
- C INT,
- Cname nvarchar(32),
- T INT
- ) ;
- CREATE TABLE Sc
- (
- S INT,
- C INT,
- score INT
- ) ;
- CREATE TABLE Teacher
- (
- T INT,
- Tname nvarchar(16)
- );
- insert into Student select 1,N'刘一',18,N'男' union all
- select 2,N'钱二',19,N'女' union all
- select 3,N'张三',17,N'男' union all
- select 4,N'李四',18,N'女' union all
- select 5,N'王五',17,N'男' union all
- select 6,N'赵六',19,N'女' ;
- insert into Teacher select 1,N'叶平' union all
- select 2,N'贺高' union all
- select 3,N'杨艳' union all
- select 4,N'周磊';
- insert into Course select 1,N'语文',1 union all
- select 2,N'数学',2 union all
- select 3,N'英语',3 union all
- select 4,N'物理',4;
- insert into SC
- select 1,1,56 union all
- select 1,2,78 union all
- select 1,3,67 union all
- select 1,4,58 union all
- select 2,1,79 union all
- select 2,2,81 union all
- select 2,3,92 union all
- select 2,4,68 union all
- select 3,1,91 union all
- select 3,2,47 union all
- select 3,3,88 union all
- select 3,4,56 union all
- select 4,2,88 union all
- select 4,3,90 union all
- select 4,4,93 union all
- select 5,1,46 union all
- select 5,3,78 union all
- select 5,4,53 union all
- select 6,1,35 union all
- select 6,2,68 union all
- select 6,4,71
二、开始练习
四张表分别如下:course, sc, student, teacher
- #(1)查询“001”课程比“002”课程成绩高的所有学生的学号;
- select * from
- (select * from sc where c=1) as a,
- (select * from sc where c=2) as b
- where a.s = b.s and a.score > b.score
- #其实跟这个一样,就是先把=1,=2两个表查询出来拼接,然后再筛选
- select * from
- (select * from sc where c=1) as a inner JOIN
- (select * from sc where c=2) as b on a.s = b.s
- where a.score > b.score
- #(2) 查询平均成绩大于60分的同学的学号和平均成绩;
- select s,avg(score) as avgscore from sc group by s having avgscore > 60
- #分组之后的条件直接用having就可以啦
- #(3)查询所有同学的学号、姓名、选课数、总成绩;
- select b.s,b.sname,a.countscore,a.sumsocre from
- (select sum(score) as sumsocre,s,count(1) as countscore from sc group by s) as a
- inner join student as b on b.s = a.s
- #在两张表中,先查询选课数,总成绩,然后拼接到student中就好啦
- #(4)查询姓“李”的老师的个数;
- select count(1) from teacher where tname like '李%'
- #熟悉like的用法
- #(5)查询没学过“叶平”老师课的同学的学号、姓名;
- select s,sname from student where s not in
- (select s from sc where c in (select c from course where t in (select t from teacher where tname = '叶平')))
- #一层层嵌套,只要知道哪些是学过的,然后not in就可以啦
- #(6)查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
- select s,sname from student where s in
- (select a.s from
- (select * from sc where c=1) as a,
- (select * from sc where c=2) as b
- where a.s = b.s);
- #学过1也学过2的使用拼接来查询出来,然后再查学号姓名
- #(7)查询学过“叶平”老师所教的所有课的同学的学号、姓名;
- select s,sname from student where s in
- (select s from sc where c in (select c from course where t in (select t from teacher where tname = '叶平')))
- #UPDATE teacher set tname = '叶平' where t=2
- 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='叶平')
- as a group by a.s) as b where counts = (select count(1) from course where t in (select t from teacher where tname = '叶平')))
- #这个不能按照前面那样来做,比如叶平更改成两个的话,发现就不对了,这里的思路是,学生学习叶平课程的数量=叶平教学的数量
- 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 ; #这个查询学生选择叶平课程的数量
- select count(1) from course where t in (select t from teacher where tname = '叶平'); #叶平一共课程是2
- select s from sc where c in
- (select c from course where t in (select t from teacher where tname='叶平')) group by s
- having count(1) = (select count(1) from course where t in (select t from teacher where tname = '叶平'));
- #两个拼接起来
- select s,sname from student where s in (select s from sc where c in
- (select c from course where t in (select t from teacher where tname='叶平')) group by s
- having count(1) = (select count(1) from course where t in (select t from teacher where tname = '叶平')))
先查询每个学生叶平课程数量,在查询叶平教学2门,然后查出那些刚好是两门的学生,再查学生的信息
- #(8)查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
- select s,sname from student where s in(select a.s from
- (select * from sc where c=1) as a,
- (select * from sc where c=2) as b
- where a.s = b.s and a.score > b.score)
- #跟前面那题差不多,就是拼接再查
- #(9)查询有课程成绩小于60分的同学的学号、姓名;
- select s,sname from student where s in (select DISTINCT s from sc where score < 60)
- #比较简单
- #(10)查询没有学全所有课的同学的学号、姓名;
- select count(1),s from sc group by s;
- select count(DISTINCT c) from sc;
- select s,sname from student where s in (select s from sc group by s having count(1) < (select count(DISTINCT c) from sc));
- #查询每个同学的课程数
- #查询一共课程数
- #小于总共课程数的学生查出来
- #()查询至少有一门课与学号为“”的同学所学相同的同学的学号和姓名;
- select * from sc where c=;
- select s,sname from student where s in (select s from sc where c in (select c from sc where s=));
- #查出1号同学学过的课程c,然后只要有学这些C的同学都可以
- #()查询至少学过学号为“”同学所有一门课的其他同学学号和姓名;(感觉跟11题有重叠)
- #()把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
- #()查询和“”号的同学学习的课程完全相同的其他同学学号和姓名;
- select * from sc where s=;
- 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=))
- #这个做法是先查询出所有修过2号同学那些课程的条目,然后group by之后如果count数量与2号同学的count数量一致,那么就筛选出来。
- #(15)删除学习“叶平”老师课的SC表记录;
- delete from sc where c in (select c from course where t in (select t from teacher where tname = '叶平'))
- #(17)按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
- select DISTINCT sc.s as '学生ID',a.score as '语文',b.score as '数学',c.score as '英语',d.num as '有效课程数',avgscore as '有效平均分' from sc
- left join (select s,score from sc where c = 1) as a on sc.s = a.s
- left join (select s,score from sc where c = 2) as b on sc.s = b.s
- left join (select s,score from sc where c = 3) as c on sc.s = c.s
- left join (select s,count(1) as num from sc group by s) as d on sc.s = d.s
- left join (select s,avg(score) as avgscore from sc group by s) as e on sc.s = e.s
- order by avgscore
- #一个个查询出来后拼接起来,方法感觉比较蠢
- #(18)查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
- 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;
- #(19)按各科平均成绩从低到高和及格率的百分数从高到低顺序;
- select a.c,a.avgsc,jige / zong * 100 from
- (select c,avg(score) as avgsc,count(1) as zong from sc GROUP BY c) as a
- left join
- (select c,count(1) as jige from sc where score >=60 group by c) as b
- on a.c=b.c;
- #(21)查询不同老师所教不同课程平均分从高到低显示;
- 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
- #(23)统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
- select sc.c,max(cname),
- sum(case when sc.score between 85 and 100 then 1 else 0 end) as '[85-100]',
- sum(case when sc.score between 70 and 85 then 1 else 0 end) as '[70-85]',
- sum(case when sc.score between 60 and 70 then 1 else 0 end) as '[60-70]',
- sum(case when sc.score between 0 and 60 then 1 else 0 end) as '[0-60]'
- from sc left join course as a on a.c = sc.c
- group by c
- #(26)查询每门课程被选修的学生数;
- select sc.c,cname,count(1) from sc left join course as a on sc.c = a.c group by c;
- #(27)查询出只选修了一门课程的全部学生的学号和姓名;
- select sc.s,sname from sc LEFT JOIN student as a on a.s=sc.s group by s having count(1) =3;
- #(28)查询男生、女生的人数;
- select count(2),ssex from student group by ssex;
- #(29)查询姓“张”的学生名单;
- select * from student where sname like '张%';
- #(30)查询同名同姓学生名单,并统计同名人数;
- select sname from student group by sname having count(1)>1
- #(32)查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
- select c,avg(score) as avgscore from sc group by c order by avgscore,c desc;
- #(33)查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
- select s,avg(score) as avgscore from sc group by s having avgscore > 85;
- #(34)查询课程名称为“数学”,且分数低于60的学生姓名和分数;
- select * from sc where c = (select c from course where cname = '数学') and score < 60;
- #(35)查询所有学生的选课情况;
- 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的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- LINUX篇,设置MYSQL远程访问实用版
每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- 闰秒导致MySQL服务器的CPU sys过高
今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
随机推荐
- 单线程和多线程处理1W条数据对比代码
package study.interview; import java.util.ArrayList; import java.util.HashMap; import java.util.Link ...
- Devexpres下LookUpEdit绑定数据后会默认弹出数据框的解决办法
LookUpEdit绑定数据后会默认弹出数据框很不友好问题现象: 问题解决前的代码: lueManagement.Text = groupEntity.Name; 2 lueManagement.Ed ...
- Java LinkedList 和 ArrayList
Java 手册 java.util 类 ArrayList<E> java.lang.Object java.util.AbstractCollection<E> java.u ...
- Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次)
ylbtech-Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次) 1.返回顶部 1. 这是本次培训的内容,望各位提前配好环境.工具.2.6-2.7 我们在环球金融8 ...
- Docker系列06:Linux修改docker镜像和容器数据存储位置
指定镜像和容器存放路径的参数是--graph=/var/lib/docker,其默认存储位置为/var/lib/docker, Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的 ...
- 我的solr学习笔记--solr admin 页面 检索调试
前言 Solr/Lucene是一个全文检索引擎,全文引擎和SQL引擎所不同的是强调部分相关度高的内容返回,而不是所有内容返回,所以部分内容包含在索引库中却无法命中是正常现象. 多数情况下我们 ...
- 分布式锁实践(一)-Redis编程实现总结
写在最前面 我在之前总结幂等性的时候,写过一种分布式锁的实现,可惜当时没有真正应用过,着实的心虚啊.正好这段时间对这部分实践了一下,也算是对之前填坑了. 分布式锁按照网上的结论,大致分为三种:1.数据 ...
- python爬搜狗微信获取指定微信公众号的文章
前言: 之前收藏了一个叫微信公众号的文章爬取,里面用到的模块不错.然而 偏偏报错= =.果断自己写了一个 正文: 第一步爬取搜狗微信搜到的公众号: http://weixin.sogou.com/we ...
- ASP.NET中的几种弹出框提示基本实现方法
我们在.NET程序的开发过程中,常常需要和用户进行信息交互,比如执行某项操作是否成功,“确定”还是“取消”,以及选择“确定”或“取消”后是否需要跳转到某个页面等,下面是本人对常用对话框使用的小结,希望 ...
- 用VB6.0实现串口通信
Then ' 1位或2位 'byte 类型取值范围为 0-255 ,不能为-1 = ) & ) End IfstrHe ...