导出现有数据库数据:

  • 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 练习的更多相关文章

  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. Asp.net WebApi 项目示例(增删改查)

    1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...

  2. win2003 64位系统IIS6.0 32位与64位间切换

    ASP.NET 1.1,32 位版本 要运行 32 位版本的 ASP.NET 1.1,按照以下步骤操作: 1.单击“开始”,单击“运行”,键入 cmd,然后单击“确定”. 2.键入以下命令启用 32 ...

  3. 移动端IM开发需要面对的技术问题

    1.前言 这两年多一直从事网易云信 iOS 端 IM SDK的开发,期间不断有兄弟部门的同事和合作伙伴过来问各种技术细节,干脆统一介绍下一个IM APP的方方面面,包括技术选型(包括通讯方式,网络连接 ...

  4. seajs模块化开发

    seajs是一个起辅助作用的库,所以它可以更方便开发,而它可以解决以下问题: 1.命名问题,就是冲突 2.性能问题,就是只要一个功能,但却使用一个大插件中的一个小功能,所以要手动拆分出这个功能 3.j ...

  5. js阻止冒泡及jquery阻止事件冒泡示例介绍

    js阻止冒泡 在阻止冒泡的过程中,W3C和IE采用的不同的方法,那么我们必须做以下兼容. 复制代码 代码如下: function stopPro(evt){ var e = evt || window ...

  6. 2014牡丹江网络zoj3816Generalized Palindromic Number(dfs或者bfs)

    #include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> ...

  7. hdu4292Food(最大流Dinic算法)

    /* 题意:每一个人都有喜欢的吃的和喝的,每一个人只选择一个数量的吃的和一个数量的喝的,问能满足最多的人数!? 思路:建图很是重要!f-food, p-people, d-drink 建图: 0(源点 ...

  8. 05-Vue入门系列之Vue实例详解与生命周期

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着. ...

  9. Spark入门实战系列--4.Spark运行架构

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...

  10. 推荐10个 CSS3 制作的创意下拉菜单效果

    下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...