MYSQL 练习
导出现有数据库数据:
- mysqldump -u用户名 -p密码 数据库名称 >导出文件路径 # 结构+数据
- mysqldump -u用户名 -p密码 -d 数据库名称 >导出文件路径 # 结构
导入现有数据库数据:
- mysqldump -uroot -p密码 数据库名称 < 文件路径
一、表关系
请创建如下表,并创建相关约束
二、操作表
1、自行创建测试数据
- /*
- Navicat MySQL Data Transfer
- Source Server : abc
- Source Server Version : 50713
- Source Host : localhost:3306
- Source Database : lx
- Target Server Type : MYSQL
- Target Server Version : 50713
- File Encoding : 65001
- Date: 2016-10-24 18:07:25
- */
- SET FOREIGN_KEY_CHECKS=0;
- -- ----------------------------
- -- Table structure for `class`
- -- ----------------------------
- DROP TABLE IF EXISTS `class`;
- CREATE TABLE `class` (
- `cid` int(11) NOT NULL AUTO_INCREMENT,
- `caption` varchar(20) DEFAULT NULL,
- PRIMARY KEY (`cid`)
- ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of class
- -- ----------------------------
- INSERT INTO `class` VALUES ('', '三年二班');
- INSERT INTO `class` VALUES ('', '一年三班');
- INSERT INTO `class` VALUES ('', '三年一班');
- INSERT INTO `class` VALUES ('', 'python 二期');
- -- ----------------------------
- -- Table structure for `course`
- -- ----------------------------
- DROP TABLE IF EXISTS `course`;
- CREATE TABLE `course` (
- `cid` int(11) NOT NULL AUTO_INCREMENT,
- `cname` varchar(20) DEFAULT NULL,
- `teache_id` int(11) DEFAULT NULL,
- PRIMARY KEY (`cid`),
- KEY `fk_c_t` (`teache_id`),
- CONSTRAINT `fk_c_t` FOREIGN KEY (`teache_id`) REFERENCES `teacher` (`tid`)
- ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of course
- -- ----------------------------
- INSERT INTO `course` VALUES ('', '生物', '');
- INSERT INTO `course` VALUES ('', '体育', '');
- INSERT INTO `course` VALUES ('', '物理', '');
- -- ----------------------------
- -- Table structure for `score`
- -- ----------------------------
- DROP TABLE IF EXISTS `score`;
- CREATE TABLE `score` (
- `sid` int(11) NOT NULL AUTO_INCREMENT,
- `student_id` int(11) DEFAULT NULL,
- `corse_id` int(11) DEFAULT NULL,
- `number` int(11) DEFAULT NULL,
- PRIMARY KEY (`sid`),
- KEY `fk_s_st` (`student_id`),
- KEY `fk_s_co` (`corse_id`),
- CONSTRAINT `fk_s_co` FOREIGN KEY (`corse_id`) REFERENCES `course` (`cid`),
- CONSTRAINT `fk_s_st` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
- ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of score
- -- ----------------------------
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- INSERT INTO `score` VALUES ('', '', '', '');
- -- ----------------------------
- -- Table structure for `student`
- -- ----------------------------
- DROP TABLE IF EXISTS `student`;
- CREATE TABLE `student` (
- `sid` int(11) NOT NULL AUTO_INCREMENT,
- `sname` varchar(20) DEFAULT NULL,
- `gender` varchar(12) DEFAULT NULL,
- `class_id` int(11) DEFAULT NULL,
- PRIMARY KEY (`sid`),
- KEY `fk_s_c` (`class_id`),
- CONSTRAINT `fk_s_c` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
- ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of student
- -- ----------------------------
- INSERT INTO `student` VALUES ('', '钢蛋', '女', '');
- INSERT INTO `student` VALUES ('', '铁锤', '女', '');
- INSERT INTO `student` VALUES ('', '山炮', '男', '');
- INSERT INTO `student` VALUES ('', '张三', '男', '');
- INSERT INTO `student` VALUES ('', '李四', '男', '');
- INSERT INTO `student` VALUES ('', '王五', '男', '');
- INSERT INTO `student` VALUES ('', '马六', '女', '');
- INSERT INTO `student` VALUES ('', '霍七', '男', '');
- INSERT INTO `student` VALUES ('', '贺八', '男', '');
- -- ----------------------------
- -- Table structure for `teacher`
- -- ----------------------------
- DROP TABLE IF EXISTS `teacher`;
- CREATE TABLE `teacher` (
- `tid` int(11) NOT NULL AUTO_INCREMENT,
- `tname` varchar(20) DEFAULT NULL,
- PRIMARY KEY (`tid`)
- ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of teacher
- -- ----------------------------
- INSERT INTO `teacher` VALUES ('', '波多');
- INSERT INTO `teacher` VALUES ('', '苍空');
- INSERT INTO `teacher` VALUES ('', '饭岛');
创建表(结构)
2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;
思路:
获取所有有生物课程的人(学号,成绩) - 临时表
获取所有有物理课程的人(学号,成绩) - 临时表
根据【学号】连接两个临时表:
学号 物理成绩 生物成绩
然后再进行筛选
- select A.student_id,生物,物理 from
- (select student_id,number as 生物 from score left join course on score.corse_id = course.cid where course.cname = '生物') as A
- left join
- (select student_id,number as 物理 from score left join course on score.corse_id = course.cid where course.cname = '物理') as B
- on A.student_id = B.student_id where 物理 > 生物 ;
3、查询平均成绩大于60分的同学的学号和平均成绩;
思路:
根据学生分组,使用
avg
获取平均值,通过
having
对
avg
进行筛选
- select student_id,avg(number) from score GROUP BY student_id having avg(number)>60;
4、查询所有同学的学号、姓名、选课数、总成绩;
- SELECT
- score.student_id,
- COUNT(score.corse_id),
- SUM(score.number),
- student.sname
- FROM
- score
- LEFT JOIN student ON student.sid = score.student_id
- GROUP BY
- student_id
5、查询姓“李”的老师的个数
- select COUNT(tid) from teacher where tname LIKE"波%";
- select count(1) from (select tid from teacher where tname like '波%') as B
6、查询没学过“叶平”老师课的同学的学号、姓名;
思路:
先查到“叶平老师”老师教的所有课ID
获取选过课的所有学生ID
学生表中筛选
- select * from student where sid not in(
- select student_id from score WHERE score.corse_id in(
- select cid from course
- LEFT JOIN teacher on teacher.tid = course.teache_id where teacher.tname = "波多"
- )
- )
7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
思路:
先查到既选择001又选择002课程的所有同学
根据学生进行分组,如果学生数量等于2表示,两门均已选择
- select student_id,sname from
- (select student_id,corse_id from score where corse_id = 1 or corse_id = 2) as B
- left join student on B.student_id = student.sid group by student_id HAVING count(student_id) = 2
8、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
- select * from student where sid in(
- select student_id from score WHERE score.corse_id in(
- select cid from course
- LEFT JOIN teacher on teacher.tid = course.teache_id where teacher.tname = "波多"
- )
- )
9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
- select c.student_id,student.sname from
- (select A.student_id,a,b from
- (select student_id,number as a from score left join course on score.corse_id = course.cid where course.cid = 1) as A
- left join
- (select student_id,number as b from score left join course on score.corse_id = course.cid where course.cid = 2) as B
- on A.student_id = B.student_id where b > a ) as c
- LEFT JOIN
- student on c.student_id = student.sid;
10、查询有课程成绩小于60分的同学的学号、姓名;
- select sid,sname from student where sid in (
- select distinct student_id from score where number < 60
- )
- select sid,sname from student where sid in (
- select student_id from score where number < 60 GROUP BY student_id
- )
11、查询没有学全所有课的同学的学号、姓名;
思路:
在分数表中根据学生进行分组,获取每一个学生选课数量
如果数量 == 总课程数量,表示已经选择了所有课程
- select student_id,sname from score left join student on score.student_id = student.sid
- group by student_id HAVING count(corse_id) = (select count(cid) from course)
12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
思路:
获取 001 同学选择的所有课程
获取课程在其中的所有人以及所有课程
根据学生筛选,获取所有学生信息
再与学生表连接,获取姓名
- select student_id,sname, count(corse_id)
- from score left join student on score.student_id = student.sid
- where student_id != 1 and corse_id in (select corse_id from score where student_id = 1) group by student_id
13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名;
先找到和001的学过的所有人
然后个数 = 001所有学科 ==》 其他人可能选择的更多
- select student_id,sname, count(corse_id)
- from score left join student on score.student_id = student.sid
- where student_id != 1 and corse_id in (select corse_id from score where student_id = 1)
- group by student_id
14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
个数相同
002学过的也学过
- select student_id,sname from score left join student on score.student_id = student.sid where student_id in (
- select student_id from score where student_id != 1 group by student_id HAVING count(corse_id) = (select count(1) from score where student_id = 1)
- ) and corse_id in (select corse_id from score where student_id = 1) group by student_id HAVING count(corse_id) = (select count(1) from score where student_id = 1)
15、删除学习“叶平”老师课的score表记录;
- delete from score where corse_id in (
- select cid from course left join teacher on course.teache_id = teacher.tid where teacher.tname = '饭岛'
- )
16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩;
- insert into score(student_id, corse_id, number) select sid,2,(select avg(number) from score where corse_id = 2)
- from student where sid not in (
- select student_id from score where corse_id = 2
- )
17、按平均成绩从低到高 显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
- select sc.student_id,
- (select number from score left join course on score.corse_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy,
- (select number from score left join course on score.corse_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl,
- (select number from score left join course on score.corse_id = course.cid where course.cname = "体育" and score.student_id=sc.student_id) as ty,
- count(sc.corse_id),
- avg(sc.number)
- from score as sc
- group by student_id desc
- select student_id,
- (select number from score as a WHERE a.student_id=b.student_id and corse_id=1)as sw,
- (select number from score as a WHERE a.student_id=b.student_id and corse_id=2) as ty,
- (select number from score as a WHERE a.student_id=b.student_id and corse_id=3) as wl,
- count(corse_id),avg(number)from score as b group by student_id ORDER BY avg(number) desc
18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
- select corse_id, max(number) as max_num, min(number) as min_num from score group by corse_id;
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
思路:
case
when
..
then (类似三目(元)运算)
- select corse_id, avg(number) ,sum(case when score.number > 60 then 1 else 0 END)/count(1)*100 as percent
- from score group by corse_id order by avg(number) asc,percent desc;
20、课程平均分从高到低显示(现实任课老师);
- select avg(if(isnull(score.number),0,score.number)),teacher.tname from course
- left join score on course.cid = score.corse_id
- left join teacher on course.teache_id = teacher.tid
- group by score.corse_id
- select avg(score.number),teacher.tname from course
- left join score on course.cid = score.corse_id
- left join teacher on course.teache_id = teacher.tid
- group by score.corse_id
21、查询各科成绩前三名的记录:(不考虑成绩并列情况)
- select score.sid,score.corse_id,score.number,T.first_num,T.second_num from score left join
- (
- select sid,
- (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit 0,1) as first_num,
- (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit 2,1) as second_num
- from
- score as s1
- ) as T
- on score.sid =T.sid
- where score.number <= T.first_num and score.number >= T.second_num
22、查询每门课程被选修的学生数;
- select corse_id, count(1) from score group by corse_id
23、查询出只选修了一门课程的全部学生的学号和姓名;
- select student.sid, student.sname, count(1) from score
- left join student on score.student_id = student.sid
- group by corse_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) as count from student group by sname;
27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
- select corse_id,avg(if(isnull(number), 0 ,number)) as avg from score group by corse_id order by avg asc,corse_id desc;
- select corse_id,avg(number)from score group by corse_id order by avg(number) asc,corse_id desc;
28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
- select student_id,avg(number),student.sname FROM score LEFT JOIN student on student.sid = score.student_id GROUP BY student_id
- HAVING avg(number)>85;
29、查询课程名称为“数学”,且分数低于60的学生姓名和分数;
- SELECT student.sname,score.number FROM score LEFT JOIN student on student.sid = score.student_id left join course on score.corse_id = course.cid
- WHERE score.number<60 and course.cname= "物理"
30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
- select student.sname,score.student_id from score LEFT JOIN student
- on student.sid = score.student_id WHERE score.number>80 and score.corse_id=3 GROUP BY student_id
31、求选了课程的学生人数
- select count(distinct student_id) from score
- select count(c) from (
- select count(student_id) as c from score group by student_id) as A
32、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
- select sname,number from score
- left join student on score.student_id = student.sid
- where score.corse_id in (select course.cid from course left join teacher
- on course.teache_id = teacher.tid where tname='波多') order by number desc limit ;
33、查询各个课程及相应的选修人数;
- select course.cname,count() from score
- left join course on score.corse_id = course.cid
- group by corse_id;
34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
- select DISTINCT s1.corse_id,s2.corse_id,s1.number,s2.number from score as s1, score as s2 where s1.number = s2.number and s1.corse_id != s2.corse_id;
35、查询每门课程成绩最好的前两名;
- select score.sid,score.corse_id,score.number,T.first_num,T.second_num from score left join
- (
- select
- sid,
- (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit ,) as first_num,
- (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit ,) as second_num
- from
- score as s1
- ) as T
- on score.sid =T.sid
- where score.number <= T.first_num and score.number >= T.second_num
36、检索至少选修两门课程的学生学号;
- select student_id from score group by student_id having count(student_id) > 1
37、查询全部学生都选修的课程的课程号和课程名;
- select corse_id,course.cname,count(student_id) from score LEFT JOIN course on
- score.corse_id = course.cid GROUP BY corse_id HAVING COUNT(student_id)=(select count(sid) FROM student)
38、查询没学过“叶平”老师讲授的任一门课程的学生姓名;
- select student_id,student.sname from score
- left join student on score.student_id = student.sid
- where score.corse_id not in (
- select cid from course left join teacher on course.teache_id = teacher.tid where tname = '波多'
- )
- group by student_id
- select student_id,student.sname from score
- left join student on score.student_id = student.sid
- where score.corse_id not in (
- select cid from course left join teacher on course.teache_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(corse_id)>=2
40、检索“004”课程分数小于60,按分数降序排列的同学学号;
- SELECT student_id,number from score where corse_id=4 and number<60 ORDER BY number desc
41、删除“002”同学的“001”课程的成绩;
- delete from score where corse_id = 1 and student_id = 2
MYSQL 练习的更多相关文章
- 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所在的文件 ...
随机推荐
- AntV 数据可视化解决方案发布
今天蚂蚁金服发布了一套数据可视化规范AntV. AntV 是一套专业的数据可视化规范,这套规范的目的是为了让可视化的使用者更懂数据可视化.这套规范是蚂蚁金服在可视化建设过程中的理论沉淀,它可以很好得指 ...
- 使用swoole和websocket结合来制造弹幕
在知乎上无意中看到了一篇有关这个的话题https://zhuanlan.zhihu.com/p/23992890,刚好没事也好久没弄swoole了就自己按照知乎上的那篇文站实操了一下 那个试验中有几个 ...
- China Mobile 免流原理
用户添加包头之类(SSR软件),最后连接上了Server. 这个过程因为修改了数据包(混淆)以及服务器使用移动IP. 服务器得到信息后通过计费系统漏洞137 138端口等再返回给用户. 整个过程最重要 ...
- javaweb回顾第八篇如何创建自定义标签
前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...
- Html与CSS快速入门02-HTML基础应用
这部分是html细节知识的学习. 快速入门系列--HTML-01简介 快速入门系列--HTML-02基础元素 快速入门系列--HTML-03高级元素和布局 快速入门系列--HTML-04进阶概念 示例 ...
- 默認打開pr_debug和dev_dbg
作者:彭東林 郵箱:pengdonglin137@163.com 日期:2016-08-26 18:04:14 在進行Linux驅動開發時經常見到使用pr_debug和dev_dbg打印驅動的log, ...
- Activity间中使用Intent传值
主页面用来输入一个值传入第二个页面显示,关闭第二个页面返回一个值 主页布局: <RelativeLayout xmlns:android="http://schemas.android ...
- Android Activity返回键控制的两种方式
Android Activity返回键监听的两种方式 1.覆写Activity的OnBackPressed方法 官方解释: Called when the activity has detected ...
- springmvc学习笔记--json--返回json的日期格式问题
(一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annotation-driven 2.在依赖管理中添加ja ...
- PHP开发知识
基本职能 服务器端开发-PHP,主要使用语言是PHP,主要是服务端工程师. 具体要求 对PHP达到熟悉的程度:熟读PHP手册,掌握开发的小技巧. 学习和研究PHP内核. 设计模式,缓存,存储 深远价值 ...