/*
2 Navicat Premium Data Transfer
3
4 Source Server : localhost
5 Source Server Type : MySQL
6 Source Server Version : 50624
7 Source Host : localhost
8 Source Database : sqlexam
9
10 Target Server Type : MySQL
11 Target Server Version : 50624
12 File Encoding : utf-8
13
14 Date: 10/21/2016 06:46:46
AM
15 */
16
17 SET NAMES utf8;
18 SET FOREIGN_KEY_CHECKS =
0;
19
20 -- ----------------------------
21 -- Table structure
for `
class`
22 -- ----------------------------
23 DROP TABLE IF EXISTS `
class`;
24 CREATE TABLE `
class` (
25 `cid` int(11
) NOT NULL AUTO_INCREMENT,
26 `caption` varchar(32
) NOT NULL,
27 PRIMARY KEY (`cid`)
28 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=
utf8;
29
30 -- ----------------------------
31 -- Records of `
class`
32 -- ----------------------------
33 BEGIN;
34 INSERT INTO `
class` VALUES (
‘1‘,
‘三年二班‘), (
‘2‘,
‘三年三班‘), (
‘3‘,
‘一年二班‘), (
‘4‘,
‘二年九班‘);
35 COMMIT;
36
37 -- ----------------------------
38 -- Table structure
for `course`
39 -- ----------------------------
40 DROP TABLE IF EXISTS `course`;
41 CREATE TABLE `course` (
42 `cid` int(11
) NOT NULL AUTO_INCREMENT,
43 `cname` varchar(32
) NOT NULL,
44 `teacher_id` int(11
) NOT NULL,
45 PRIMARY KEY (`cid`),
46 KEY `fk_course_teacher` (`teacher_id`),
47 CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
48 ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=
utf8;
49
50 -- ----------------------------
51 --
Records of `course`
52 -- ----------------------------
53 BEGIN;
54 INSERT INTO `course` VALUES (
‘1‘,
‘生物‘,
‘1‘), (
‘2‘,
‘物理‘,
‘2‘), (
‘3‘,
‘体育‘,
‘3‘), (
‘4‘,
‘美术‘,
‘2‘);
55 COMMIT;
56
57 -- ----------------------------
58 -- Table structure
for `score`
59 -- ----------------------------
60 DROP TABLE IF EXISTS `score`;
61 CREATE TABLE `score` (
62 `sid` int(11
) NOT NULL AUTO_INCREMENT,
63 `student_id` int(11
) NOT NULL,
64 `course_id` int(11
) NOT NULL,
65 `num` int(11
) NOT NULL,
66 PRIMARY KEY (`sid`),
67 KEY `fk_score_student` (`student_id`),
68 KEY `fk_score_course` (`course_id`),
69 CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
70 CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
71 ) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=
utf8;
72
73 -- ----------------------------
74 --
Records of `score`
75 -- ----------------------------
76 BEGIN;
77 INSERT INTO `score` VALUES (
‘1‘,
‘1‘,
‘1‘,
‘10‘), (
‘2‘,
‘1‘,
‘2‘,
‘9‘), (
‘5‘,
‘1‘,
‘4‘,
‘66‘), (
‘6‘,
‘2‘,
‘1‘,
‘8‘), (
‘8‘,
‘2‘,
‘3‘,
‘68‘), (
‘9‘,
‘2‘,
‘4‘,
‘99‘), (
‘10‘,
‘3‘,
‘1‘,
‘77‘), (
‘11‘,
‘3‘,
‘2‘,
‘66‘), (
‘12‘,
‘3‘,
‘3‘,
‘87‘), (
‘13‘,
‘3‘,
‘4‘,
‘99‘), (
‘14‘,
‘4‘,
‘1‘,
‘79‘), (
‘15‘,
‘4‘,
‘2‘,
‘11‘), (
‘16‘,
‘4‘,
‘3‘,
‘67‘), (
‘17‘,
‘4‘,
‘4‘,
‘100‘), (
‘18‘,
‘5‘,
‘1‘,
‘79‘), (
‘19‘,
‘5‘,
‘2‘,
‘11‘), (
‘20‘,
‘5‘,
‘3‘,
‘67‘), (
‘21‘,
‘5‘,
‘4‘,
‘100‘), (
‘22‘,
‘6‘,
‘1‘,
‘9‘), (
‘23‘,
‘6‘,
‘2‘,
‘100‘), (
‘24‘,
‘6‘,
‘3‘,
‘67‘), (
‘25‘,
‘6‘,
‘4‘,
‘100‘), (
‘26‘,
‘7‘,
‘1‘,
‘9‘), (
‘27‘,
‘7‘,
‘2‘,
‘100‘), (
‘28‘,
‘7‘,
‘3‘,
‘67‘), (
‘29‘,
‘7‘,
‘4‘,
‘88‘), (
‘30‘,
‘8‘,
‘1‘,
‘9‘), (
‘31‘,
‘8‘,
‘2‘,
‘100‘), (
‘32‘,
‘8‘,
‘3‘,
‘67‘), (
‘33‘,
‘8‘,
‘4‘,
‘88‘), (
‘34‘,
‘9‘,
‘1‘,
‘91‘), (
‘35‘,
‘9‘,
‘2‘,
‘88‘), (
‘36‘,
‘9‘,
‘3‘,
‘67‘), (
‘37‘,
‘9‘,
‘4‘,
‘22‘), (
‘38‘,
‘10‘,
‘1‘,
‘90‘), (
‘39‘,
‘10‘,
‘2‘,
‘77‘), (
‘40‘,
‘10‘,
‘3‘,
‘43‘), (
‘41‘,
‘10‘,
‘4‘,
‘87‘), (
‘42‘,
‘11‘,
‘1‘,
‘90‘), (
‘43‘,
‘11‘,
‘2‘,
‘77‘), (
‘44‘,
‘11‘,
‘3‘,
‘43‘), (
‘45‘,
‘11‘,
‘4‘,
‘87‘), (
‘46‘,
‘12‘,
‘1‘,
‘90‘), (
‘47‘,
‘12‘,
‘2‘,
‘77‘), (
‘48‘,
‘12‘,
‘3‘,
‘43‘), (
‘49‘,
‘12‘,
‘4‘,
‘87‘), (
‘52‘,
‘13‘,
‘3‘,
‘87‘);
78 COMMIT;
79
80 -- ----------------------------
81 -- Table structure
for `student`
82 -- ----------------------------
83 DROP TABLE IF EXISTS `student`;
84 CREATE TABLE `student` (
85 `sid` int(11
) NOT NULL AUTO_INCREMENT,
86 `gender` char(1
) NOT NULL,
87 `class_id` int(11
) NOT NULL,
88 `sname` varchar(32
) NOT NULL,
89 PRIMARY KEY (`sid`),
90 KEY `fk_class` (`class_id`),
91 CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `
class` (`cid`)
92 ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=
utf8;
93
94 -- ----------------------------
95 --
Records of `student`
96 -- ----------------------------
97 BEGIN;
98 INSERT INTO `student` VALUES (
‘1‘,
‘男‘,
‘1‘,
‘理解‘), (
‘2‘,
‘女‘,
‘1‘,
‘钢蛋‘), (
‘3‘,
‘男‘,
‘1‘,
‘张三‘), (
‘4‘,
‘男‘,
‘1‘,
‘张一‘), (
‘5‘,
‘女‘,
‘1‘,
‘张二‘), (
‘6‘,
‘男‘,
‘1‘,
‘张四‘), (
‘7‘,
‘女‘,
‘2‘,
‘铁锤‘), (
‘8‘,
‘男‘,
‘2‘,
‘李三‘), (
‘9‘,
‘男‘,
‘2‘,
‘李一‘), (
‘10‘,
‘女‘,
‘2‘,
‘李二‘), (
‘11‘,
‘男‘,
‘2‘,
‘李四‘), (
‘12‘,
‘女‘,
‘3‘,
‘如花‘), (
‘13‘,
‘男‘,
‘3‘,
‘刘三‘), (
‘14‘,
‘男‘,
‘3‘,
‘刘一‘), (
‘15‘,
‘女‘,
‘3‘,
‘刘二‘), (
‘16‘,
‘男‘,
‘3‘,
‘刘四‘);
99 COMMIT;
100
101 -- ----------------------------
102 -- Table structure
for `teacher`
103 -- ----------------------------
104 DROP TABLE IF EXISTS `teacher`;
105 CREATE TABLE `teacher` (
106 `tid` int(11
) NOT NULL AUTO_INCREMENT,
107 `tname` varchar(32
) NOT NULL,
108 PRIMARY KEY (`tid`)
109 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=
utf8;
110
111 -- ----------------------------
112 --
Records of `teacher`
113 -- ----------------------------
114 BEGIN;
115 INSERT INTO `teacher` VALUES (
‘1‘,
‘张磊老师‘), (
‘2‘,
‘李平老师‘), (
‘3‘,
‘刘海燕老师‘), (
‘4‘,
‘朱云海老师‘), (
‘5‘,
‘李杰老师‘);
116 COMMIT;
117
118 SET FOREIGN_KEY_CHECKS = 1;
表结构和数据

1 2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;
2 思路:
3 获取所有有生物课程的人(学号,成绩) - 临时表
4 获取所有有物理课程的人(学号,成绩) - 临时表
5 根据【学号】连接两个临时表:
6 学号 物理成绩 生物成绩
7
8 然后再进行筛选
9
10 select A.student_id,sw,ty from
11
12 (select student_id,num as sw from score left join course on score.course_id = course.cid where course.cname = ‘生物‘) as A
13
14 left join
15
16 (select student_id,num as ty from score left join course on score.course_id = course.cid where course.cname = ‘体育‘) as B
17
18 on A.student_id = B.student_id where sw > if(isnull(ty),0,ty);
19
20 3、查询平均成绩大于60分的同学的学号和平均成绩;
21 思路:
22 根据学生分组,使用avg获取平均值,通过having对avg进行筛选
23
24 select student_id,avg(num) from score group by student_id having avg(num) > 60
25
26 4、查询所有同学的学号、姓名、选课数、总成绩;
27
28 select score.student_id,sum(score.num),count(score.student_id),student.sname
29 from
30 score left join student on score.student_id = student.sid
31 group by score.student_id
32
33 5、查询姓“李”的老师的个数;
34 select count(tid) from teacher where tname like ‘李%‘
35
36 select count(1) from (select tid from teacher where tname like ‘李%‘) as B
37
38 6、查询没学过“叶平”老师课的同学的学号、姓名;
39 思路:
40 先查到“李平老师”老师教的所有课ID
41 获取选过课的所有学生ID
42 学生表中筛选
43 select * from student where sid not in (
44 select DISTINCT student_id from score where score.course_id in (
45 select cid from course left join teacher on course.teacher_id = teacher.tid where tname = ‘李平老师‘
46 )
47 )
48
49 7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
50 思路:
51 先查到既选择001又选择002课程的所有同学
52 根据学生进行分组,如果学生数量等于2表示,两门均已选择
53
54 select student_id,sname from
55
56 (select student_id,course_id from score where course_id = 1 or course_id = 2) as B
57
58 left join student on B.student_id = student.sid group by student_id HAVING count(student_id) > 1
59
60
61 8、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
62
63 同上,只不过将001和002变成 in (叶平老师的所有课)
64
65 9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
66 同第1题
67
68
69 10、查询有课程成绩小于60分的同学的学号、姓名;
70
71 select sid,sname from student where sid in (
72 select distinct student_id from score where num < 60
73 )
74
75 11、查询没有学全所有课的同学的学号、姓名;
76 思路:
77 在分数表中根据学生进行分组,获取每一个学生选课数量
78 如果数量 == 总课程数量,表示已经选择了所有课程
79
80 select student_id,sname
81 from score left join student on score.student_id = student.sid
82 group by student_id HAVING count(course_id) = (select count(1) from course)
83
84
85 12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
86 思路:
87 获取 001 同学选择的所有课程
88 获取课程在其中的所有人以及所有课程
89 根据学生筛选,获取所有学生信息
90 再与学生表连接,获取姓名
91
92 select student_id,sname, count(course_id)
93 from score left join student on score.student_id = student.sid
94 where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id
95
96 13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名;
97 先找到和001的学过的所有人
98 然后个数 = 001所有学科 ==》 其他人可能选择的更多
99
100 select student_id,sname, count(course_id)
101 from score left join student on score.student_id = student.sid
102 where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id having count(course_id) = (select count(course_id) from score where student_id = 1)
103
104 14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
105
106 个数相同
107 002学过的也学过
108
109 select student_id,sname from score left join student on score.student_id = student.sid where student_id in (
110 select student_id from score where student_id != 1 group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1)
111 ) and course_id in (select course_id from score where student_id = 1) group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1)
112
113
114 15、删除学习“叶平”老师课的score表记录;
115
116 delete from score where course_id in (
117 select cid from course left join teacher on course.teacher_id = teacher.tid where teacher.name = ‘叶平‘
118 )
119
120 16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩;
121 思路:
122 由于insert 支持
123 inset into tb1(xx,xx) select x1,x2 from tb2;
124 所有,获取所有没上过002课的所有人,获取002的平均成绩
125
126 insert into score(student_id, course_id, num) select sid,2,(select avg(num) from score where course_id = 2)
127 from student where sid not in (
128 select student_id from score where course_id = 2
129 )
130
131 17、按平均成绩从低到高 显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
132 select sc.student_id,
133 (select num from score left join course on score.course_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy,
134 (select num from score left join course on score.course_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl,
135 (select num from score left join course on score.course_id = course.cid where course.cname = "体育" and score.student_id=sc.student_id) as ty,
136 count(sc.course_id),
137 avg(sc.num)
138 from score as sc
139 group by student_id desc
140
141 18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
142
143 select course_id, max(num) as max_num, min(num) as min_num from score group by course_id;
144
145 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
146 思路:case when .. then
147 select course_id, avg(num) as avgnum,sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent from score group by course_id order by avgnum asc,percent desc;
148
149 20、课程平均分从高到低显示(现实任课老师);
150
151 select avg(if(isnull(score.num),0,score.num)),teacher.tname from course
152 left join score on course.cid = score.course_id
153 left join teacher on course.teacher_id = teacher.tid
154
155 group by score.course_id
156