MYSQL 练习
Posted 别拿曾经看以后
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 (\'1\', \'三年二班\'); INSERT INTO `class` VALUES (\'2\', \'一年三班\'); INSERT INTO `class` VALUES (\'3\', \'三年一班\'); INSERT INTO `class` VALUES (\'4\', \'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 (\'1\', \'生物\', \'1\'); INSERT INTO `course` VALUES (\'2\', \'体育\', \'1\'); INSERT INTO `course` VALUES (\'3\', \'物理\', \'2\'); -- ---------------------------- -- 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 (\'1\', \'1\', \'1\', \'60\'); INSERT INTO `score` VALUES (\'2\', \'1\', \'2\', \'59\'); INSERT INTO `score` VALUES (\'3\', \'2\', \'2\', \'100\'); INSERT INTO `score` VALUES (\'4\', \'1\', \'3\', \'76\'); INSERT INTO `score` VALUES (\'5\', \'2\', \'1\', \'99\'); INSERT INTO `score` VALUES (\'6\', \'2\', \'3\', \'88\'); INSERT INTO `score` VALUES (\'7\', \'3\', \'1\', \'66\'); INSERT INTO `score` VALUES (\'8\', \'3\', \'2\', \'77\'); INSERT INTO `score` VALUES (\'9\', \'3\', \'3\', \'88\'); INSERT INTO `score` VALUES (\'10\', \'4\', \'1\', \'76\'); INSERT INTO `score` VALUES (\'11\', \'4\', \'2\', \'99\'); INSERT INTO `score` VALUES (\'12\', \'4\', \'3\', \'88\'); INSERT INTO `score` VALUES (\'13\', \'5\', \'1\', \'66\'); INSERT INTO `score` VALUES (\'14\', \'5\', \'2\', \'77\'); INSERT INTO `score` VALUES (\'15\', \'5\', \'3\', \'88\'); INSERT INTO `score` VALUES (\'16\', \'6\', \'1\', \'58\'); INSERT INTO `score` VALUES (\'17\', \'6\', \'2\', \'68\'); INSERT INTO `score` VALUES (\'18\', \'6\', \'3\', \'78\'); INSERT INTO `score` VALUES (\'19\', \'7\', \'1\', \'87\'); INSERT INTO `score` VALUES (\'20\', \'7\', \'2\', \'76\'); INSERT INTO `score` VALUES (\'21\', \'7\', \'3\', \'65\'); INSERT INTO `score` VALUES (\'22\', \'8\', \'1\', \'90\'); INSERT INTO `score` VALUES (\'23\', \'8\', \'2\', \'81\'); INSERT INTO `score` VALUES (\'24\', \'8\', \'3\', \'77\'); INSERT INTO `score` VALUES (\'25\', \'9\', \'1\', \'86\'); INSERT INTO `score` VALUES (\'26\', \'9\', \'2\', \'78\'); INSERT INTO `score` VALUES (\'27\', \'9\', \'3\', \'97\'); -- ---------------------------- -- 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 (\'1\', \'钢蛋\', \'女\', \'1\'); INSERT INTO `student` VALUES (\'2\', \'铁锤\', \'女\', \'1\'); INSERT INTO `student` VALUES (\'3\', \'山炮\', \'男\', \'2\'); INSERT INTO `student` VALUES (\'4\', \'张三\', \'男\', \'3\'); INSERT INTO `student` VALUES (\'5\', \'李四\', \'男\', \'2\'); INSERT INTO `student` VALUES (\'6\', \'王五\', \'男\', \'3\'); INSERT INTO `student` VALUES (\'7\', \'马六\', \'女\', \'1\'); INSERT INTO `student` VALUES (\'8\', \'霍七\', \'男\', \'2\'); INSERT INTO `student` VALUES (\'9\', \'贺八\', \'男\', \'3\'); -- ---------------------------- -- 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 (\'1\', \'波多\'); INSERT INTO `teacher` VALUES (\'2\', \'苍空\'); INSERT INTO `teacher` VALUES (\'3\', \'饭岛\');
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 以上是关于MYSQL 练习的主要内容,如果未能解决你的问题,请参考以下文章