MYSQL 练习
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MYSQL 练习,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含15175字,纯文字阅读大概需要22分钟。
内容图文
![MYSQL 练习](/upload/InfoBanner/zyjiaocheng/1081/6ba07986e1614e6aaf7aea5dec589261.jpg)
导出现有数据库数据:
- mysqldump -u用户名 -p密码 数据库名称 >导出文件路径 # 结构+数据
- mysqldump -u用户名 -p密码 -d 数据库名称 >导出文件路径 # 结构
导入现有数据库数据:
- mysqldump -uroot -p密码 数据库名称 < 文件路径
一、表关系
请创建如下表,并创建相关约束
二、操作表
1、自行创建测试数据
![技术分享](/img/jia.gif)
![技术分享](/img/jian.gif)
/* 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` -- ----------------------------DROPTABLEIFEXISTS `class`; CREATETABLE `class` ( `cid` int(11) NOTNULL AUTO_INCREMENT, `caption` varchar(20) DEFAULTNULL, PRIMARYKEY (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=5DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of class -- ----------------------------INSERTINTO `class` VALUES (‘1‘, ‘三年二班‘); INSERTINTO `class` VALUES (‘2‘, ‘一年三班‘); INSERTINTO `class` VALUES (‘3‘, ‘三年一班‘); INSERTINTO `class` VALUES (‘4‘, ‘python 二期‘); -- ---------------------------- -- Table structure for `course` -- ----------------------------DROPTABLEIFEXISTS `course`; CREATETABLE `course` ( `cid` int(11) NOTNULL AUTO_INCREMENT, `cname` varchar(20) DEFAULTNULL, `teache_id` int(11) DEFAULTNULL, PRIMARYKEY (`cid`), KEY `fk_c_t` (`teache_id`), CONSTRAINT `fk_c_t` FOREIGNKEY (`teache_id`) REFERENCES `teacher` (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=4DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of course -- ----------------------------INSERTINTO `course` VALUES (‘1‘, ‘生物‘, ‘1‘); INSERTINTO `course` VALUES (‘2‘, ‘体育‘, ‘1‘); INSERTINTO `course` VALUES (‘3‘, ‘物理‘, ‘2‘); -- ---------------------------- -- Table structure for `score` -- ----------------------------DROPTABLEIFEXISTS `score`; CREATETABLE `score` ( `sid` int(11) NOTNULL AUTO_INCREMENT, `student_id` int(11) DEFAULTNULL, `corse_id` int(11) DEFAULTNULL, `number` int(11) DEFAULTNULL, PRIMARYKEY (`sid`), KEY `fk_s_st` (`student_id`), KEY `fk_s_co` (`corse_id`), CONSTRAINT `fk_s_co` FOREIGNKEY (`corse_id`) REFERENCES `course` (`cid`), CONSTRAINT `fk_s_st` FOREIGNKEY (`student_id`) REFERENCES `student` (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=33DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of score -- ----------------------------INSERTINTO `score` VALUES (‘1‘, ‘1‘, ‘1‘, ‘60‘); INSERTINTO `score` VALUES (‘2‘, ‘1‘, ‘2‘, ‘59‘); INSERTINTO `score` VALUES (‘3‘, ‘2‘, ‘2‘, ‘100‘); INSERTINTO `score` VALUES (‘4‘, ‘1‘, ‘3‘, ‘76‘); INSERTINTO `score` VALUES (‘5‘, ‘2‘, ‘1‘, ‘99‘); INSERTINTO `score` VALUES (‘6‘, ‘2‘, ‘3‘, ‘88‘); INSERTINTO `score` VALUES (‘7‘, ‘3‘, ‘1‘, ‘66‘); INSERTINTO `score` VALUES (‘8‘, ‘3‘, ‘2‘, ‘77‘); INSERTINTO `score` VALUES (‘9‘, ‘3‘, ‘3‘, ‘88‘); INSERTINTO `score` VALUES (‘10‘, ‘4‘, ‘1‘, ‘76‘); INSERTINTO `score` VALUES (‘11‘, ‘4‘, ‘2‘, ‘99‘); INSERTINTO `score` VALUES (‘12‘, ‘4‘, ‘3‘, ‘88‘); INSERTINTO `score` VALUES (‘13‘, ‘5‘, ‘1‘, ‘66‘); INSERTINTO `score` VALUES (‘14‘, ‘5‘, ‘2‘, ‘77‘); INSERTINTO `score` VALUES (‘15‘, ‘5‘, ‘3‘, ‘88‘); INSERTINTO `score` VALUES (‘16‘, ‘6‘, ‘1‘, ‘58‘); INSERTINTO `score` VALUES (‘17‘, ‘6‘, ‘2‘, ‘68‘); INSERTINTO `score` VALUES (‘18‘, ‘6‘, ‘3‘, ‘78‘); INSERTINTO `score` VALUES (‘19‘, ‘7‘, ‘1‘, ‘87‘); INSERTINTO `score` VALUES (‘20‘, ‘7‘, ‘2‘, ‘76‘); INSERTINTO `score` VALUES (‘21‘, ‘7‘, ‘3‘, ‘65‘); INSERTINTO `score` VALUES (‘22‘, ‘8‘, ‘1‘, ‘90‘); INSERTINTO `score` VALUES (‘23‘, ‘8‘, ‘2‘, ‘81‘); INSERTINTO `score` VALUES (‘24‘, ‘8‘, ‘3‘, ‘77‘); INSERTINTO `score` VALUES (‘25‘, ‘9‘, ‘1‘, ‘86‘); INSERTINTO `score` VALUES (‘26‘, ‘9‘, ‘2‘, ‘78‘); INSERTINTO `score` VALUES (‘27‘, ‘9‘, ‘3‘, ‘97‘); -- ---------------------------- -- Table structure for `student` -- ----------------------------DROPTABLEIFEXISTS `student`; CREATETABLE `student` ( `sid` int(11) NOTNULL AUTO_INCREMENT, `sname` varchar(20) DEFAULTNULL, `gender` varchar(12) DEFAULTNULL, `class_id` int(11) DEFAULTNULL, PRIMARYKEY (`sid`), KEY `fk_s_c` (`class_id`), CONSTRAINT `fk_s_c` FOREIGNKEY (`class_id`) REFERENCES `class` (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=10DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ----------------------------INSERTINTO `student` VALUES (‘1‘, ‘钢蛋‘, ‘女‘, ‘1‘); INSERTINTO `student` VALUES (‘2‘, ‘铁锤‘, ‘女‘, ‘1‘); INSERTINTO `student` VALUES (‘3‘, ‘山炮‘, ‘男‘, ‘2‘); INSERTINTO `student` VALUES (‘4‘, ‘张三‘, ‘男‘, ‘3‘); INSERTINTO `student` VALUES (‘5‘, ‘李四‘, ‘男‘, ‘2‘); INSERTINTO `student` VALUES (‘6‘, ‘王五‘, ‘男‘, ‘3‘); INSERTINTO `student` VALUES (‘7‘, ‘马六‘, ‘女‘, ‘1‘); INSERTINTO `student` VALUES (‘8‘, ‘霍七‘, ‘男‘, ‘2‘); INSERTINTO `student` VALUES (‘9‘, ‘贺八‘, ‘男‘, ‘3‘); -- ---------------------------- -- Table structure for `teacher` -- ----------------------------DROPTABLEIFEXISTS `teacher`; CREATETABLE `teacher` ( `tid` int(11) NOTNULL AUTO_INCREMENT, `tname` varchar(20) DEFAULTNULL, PRIMARYKEY (`tid`) ) ENGINE=InnoDB AUTO_INCREMENT=4DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher -- ----------------------------INSERTINTO `teacher` VALUES (‘1‘, ‘波多‘); INSERTINTO `teacher` VALUES (‘2‘, ‘苍空‘); INSERTINTO `teacher` VALUES (‘3‘, ‘饭岛‘);
2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;
思路:
获取所有有生物课程的人(学号,成绩) - 临时表
获取所有有物理课程的人(学号,成绩) - 临时表
根据【学号】连接两个临时表:
学号 物理成绩 生物成绩
然后再进行筛选
select A.student_id,生物,物理 from (select student_id,numberas 生物 from score leftjoin course on score.corse_id = course.cid where course.cname =‘生物‘) as A leftjoin (select student_id,numberas 物理 from score leftjoin 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 GROUPBY student_id havingavg(number)>60;
4、查询所有同学的学号、姓名、选课数、总成绩;
SELECT score.student_id, COUNT (score.corse_id), SUM(score.number), student.sname FROM score LEFTJOIN student ON student.sid = score.student_id GROUPBY student_id
5、查询姓“李”的老师的个数
select
COUNT(tid) from teacher where tname LIKE"波%";
selectcount(1) from (select tid from teacher where tname like‘波%‘) as B
6、查询没学过“叶平”老师课的同学的学号、姓名;
思路:
先查到“叶平老师”老师教的所有课ID
获取选过课的所有学生ID
学生表中筛选
select * from student where sid notin( select student_id from score WHERE score.corse_id in( select cid from course LEFTJOIN 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 =1or corse_id =2) as B leftjoin student on B.student_id = student.sid groupby student_id HAVINGcount(student_id) = 2
8、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select * from student where sid in( select student_id from score WHERE score.corse_id in( select cid from course LEFTJOIN 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,numberas a from score leftjoin course on score.corse_id = course.cid where course.cid =1) as A
leftjoin
(select student_id,numberas b from score leftjoin 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
LEFTJOIN
student on c.student_id = student.sid;
10、查询有课程成绩小于60分的同学的学号、姓名;
select sid,sname from student where sid in ( selectdistinct student_id from score wherenumber<60 ) select sid,sname from student where sid in ( select student_id from score wherenumber<60GROUPBY student_id )
11、查询没有学全所有课的同学的学号、姓名;
思路:
在分数表中根据学生进行分组,获取每一个学生选课数量
如果数量 == 总课程数量,表示已经选择了所有课程
select student_id,sname from score leftjoin student on score.student_id = student.sid groupby student_id HAVINGcount(corse_id) = (selectcount(cid) from course)
12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
思路:
获取 001 同学选择的所有课程
获取课程在其中的所有人以及所有课程
根据学生筛选,获取所有学生信息
再与学生表连接,获取姓名
select student_id,sname, count(corse_id) from score leftjoin student on score.student_id = student.sid where student_id !=1and corse_id in (select corse_id from score where student_id =1) groupby student_id
13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名;
先找到和001的学过的所有人
然后个数 = 001所有学科 ==》 其他人可能选择的更多
select student_id,sname, count(corse_id) from score leftjoin student on score.student_id = student.sid where student_id !=1and corse_id in (select corse_id from score where student_id =1) groupby student_id
14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
个数相同
002学过的也学过
select student_id,sname from score leftjoin student on score.student_id = student.sid where student_id in ( select student_id from score where student_id !=1groupby student_id HAVINGcount(corse_id) = (selectcount(1) from score where student_id =1) ) and corse_id in (select corse_id from score where student_id =1) groupby student_id HAVINGcount(corse_id) = (selectcount(1) from score where student_id =1)
15、删除学习“叶平”老师课的score表记录;
delete from score where corse_id in ( select cid from course leftjoin 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,(selectavg(number) from score where corse_id =2)
from student where sid notin (
select student_id from score where corse_id =2
)
17、按平均成绩从低到高 显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
select
sc.student_id,
(
select
number
from score leftjoin course on score.corse_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy,
(selectnumberfrom score leftjoin course on score.corse_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl,
(selectnumberfrom score leftjoin 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
groupby student_id descselect student_id,
(selectnumberfrom score as a WHERE a.student_id=b.student_id and corse_id=1)as sw,
(selectnumberfrom score as a WHERE a.student_id=b.student_id and corse_id=2) as ty,
(selectnumberfrom 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 groupby student_id ORDERBYavg(number) desc
18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
select corse_id, max(number) as max_num, min(number) as min_num from score groupby corse_id;
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
思路:
case
when
..
then (类似三目(元)运算)
select corse_id, avg(number) ,sum(casewhen score.number>60then1else0END)/count(1)*100aspercentfrom score groupby corse_id orderbyavg(number) asc,percentdesc;
20、课程平均分从高到低显示(现实任课老师);
select avg(if(isnull(score.number),0,score.number)),teacher.tname from course leftjoin score on course.cid = score.corse_id leftjoin teacher on course.teache_id = teacher.tid groupby score.corse_id selectavg(score.number),teacher.tname from course leftjoin score on course.cid = score.corse_id leftjoin teacher on course.teache_id = teacher.tid groupby score.corse_id
21、查询各科成绩前三名的记录:(不考虑成绩并列情况)
select score.sid,score.corse_id,score.number,T.first_num,T.second_num from score leftjoin ( select sid, (selectnumberfrom score as s2 where s2.corse_id = s1.corse_id orderbynumberdesc limit 0,1) as first_num, (selectnumberfrom score as s2 where s2.corse_id = s1.corse_id orderbynumberdesc 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 groupby corse_id
23、查询出只选修了一门课程的全部学生的学号和姓名;
select student.sid, student.sname, count(1) from score
leftjoin student on score.student_id = student.sid
groupby corse_id havingcount(1) =1
24、查询男生、女生的人数;
select
*
from
(
select
count(1) as man from student where gender=‘男‘)as A ,
(selectcount(1) as feman from student where gender=‘女‘) as B
25、查询姓“张”的学生名单;
select sname from student where sname like‘张%‘;
26、查询同名同姓学生名单,并统计同名人数;
select sname,count(1) ascountfrom student groupby sname;
27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
select corse_id,avg(if(isnull(number), 0 ,number)) asavgfrom score groupby corse_id orderbyavgasc,corse_id desc; select corse_id,avg(number)from score groupby corse_id orderbyavg(number) asc,corse_id desc;
28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
select student_id,avg(number),student.sname FROM score LEFTJOIN student on student.sid = score.student_id GROUPBY student_id HAVINGavg(number)>85;
29、查询课程名称为“数学”,且分数低于60的学生姓名和分数;
SELECT student.sname,score.numberFROM score LEFTJOIN student on student.sid = score.student_id leftjoin course on score.corse_id = course.cid WHERE score.number<60and course.cname= "物理"
30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
select student.sname,score.student_id from score LEFTJOIN student on student.sid = score.student_id WHERE score.number>80and score.corse_id=3GROUPBY student_id
31、求选了课程的学生人数
select count(distinct student_id) from score selectcount(c) from ( selectcount(student_id) as c from score groupby 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 1;
33、查询各个课程及相应的选修人数;
select course.cname,count(1) 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.numberfrom score as s1, score as s2 where s1.number= s2.numberand 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 0,1) as first_num, (select number from score as s2 where s2.corse_id = s1.corse_id order by number desc limit 1,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
36、检索至少选修两门课程的学生学号;
select student_id from score groupby student_id havingcount(student_id) >1
37、查询全部学生都选修的课程的课程号和课程名;
select corse_id,course.cname,count(student_id) from score LEFTJOIN course on score.corse_id = course.cid GROUPBY corse_id HAVINGCOUNT(student_id)=(selectcount(sid) FROM student)
38、查询没学过“叶平”老师讲授的任一门课程的学生姓名;
select student_id,student.sname from score leftjoin student on score.student_id = student.sid where score.corse_id notin ( select cid from course leftjoin teacher on course.teache_id = teacher.tid where tname =‘波多‘ ) groupby student_id select student_id,student.sname from score leftjoin student on score.student_id = student.sid where score.corse_id notin ( select cid from course leftjoin teacher on course.teache_id = teacher.tid where tname =‘波多‘ ) groupby student_id
39、查询两门以上不及格课程的同学的学号及其平均成绩;
select student_id,avg(number) from score wherenumber<60GROUPBY student_id havingcount(corse_id)>=2
40、检索“004”课程分数小于60,按分数降序排列的同学学号;
SELECT student_id,numberfrom score where corse_id=4andnumber<60ORDERBYnumberdesc
41、删除“002”同学的“001”课程的成绩;
delete from score where corse_id =1and student_id =2
原文:http://www.cnblogs.com/lst1010/p/5994159.html
内容总结
以上是互联网集市为您收集整理的MYSQL 练习全部内容,希望文章能够帮你解决MYSQL 练习所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。