表结构图如下:
创建表和插入数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
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
(32)
NOT
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'
,
'二年九班'
);
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP
TABLE
IF EXISTS `course`;
CREATE
TABLE
`course` (
`cid`
int
(11)
NOT
NULL
AUTO_INCREMENT,
`cname`
varchar
(32)
NOT
NULL
,
`teacher_id`
int
(11)
NOT
NULL
,
PRIMARY
KEY
(`cid`),
KEY
`fk_course_teacher` (`teacher_id`),
CONSTRAINT
`fk_course_teacher`
FOREIGN
KEY
(`teacher_id`)
REFERENCES
`teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5
DEFAULT
CHARSET=utf8;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT
INTO
`course`
VALUES
(
'1'
,
'生物'
,
'1'
);
INSERT
INTO
`course`
VALUES
(
'2'
,
'物理'
,
'2'
);
INSERT
INTO
`course`
VALUES
(
'3'
,
'体育'
,
'3'
);
INSERT
INTO
`course`
VALUES
(
'4'
,
'美术'
,
'2'
);
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP
TABLE
IF EXISTS `score`;
CREATE
TABLE
`score` (
`sid`
int
(11)
NOT
NULL
AUTO_INCREMENT,
`student_id`
int
(11)
NOT
NULL
,
`course_id`
int
(11)
NOT
NULL
,
`num`
int
(11)
NOT
NULL
,
PRIMARY
KEY
(`sid`),
KEY
`fk_score_student` (`student_id`),
KEY
`fk_score_course` (`course_id`),
CONSTRAINT
`fk_score_course`
FOREIGN
KEY
(`course_id`)
REFERENCES
`course` (`cid`),
CONSTRAINT
`fk_score_student`
FOREIGN
KEY
(`student_id`)
REFERENCES
`student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53
DEFAULT
CHARSET=utf8;
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT
INTO
`score`
VALUES
(
'1'
,
'1'
,
'1'
,
'10'
);
INSERT
INTO
`score`
VALUES
(
'2'
,
'1'
,
'2'
,
'9'
);
INSERT
INTO
`score`
VALUES
(
'5'
,
'1'
,
'4'
,
'66'
);
INSERT
INTO
`score`
VALUES
(
'6'
,
'2'
,
'1'
,
'8'
);
INSERT
INTO
`score`
VALUES
(
'8'
,
'2'
,
'3'
,
'68'
);
INSERT
INTO
`score`
VALUES
(
'9'
,
'2'
,
'4'
,
'99'
);
INSERT
INTO
`score`
VALUES
(
'10'
,
'3'
,
'1'
,
'77'
);
INSERT
INTO
`score`
VALUES
(
'11'
,
'3'
,
'2'
,
'66'
);
INSERT
INTO
`score`
VALUES
(
'12'
,
'3'
,
'3'
,
'87'
);
INSERT
INTO
`score`
VALUES
(
'13'
,
'3'
,
'4'
,
'99'
);
INSERT
INTO
`score`
VALUES
(
'14'
,
'4'
,
'1'
,
'79'
);
INSERT
INTO
`score`
VALUES
(
'15'
,
'4'
,
'2'
,
'11'
);
INSERT
INTO
`score`
VALUES
(
'16'
,
'4'
,
'3'
,
'67'
);
INSERT
INTO
`score`
VALUES
(
'17'
,
'4'
,
'4'
,
'100'
);
INSERT
INTO
`score`
VALUES
(
'18'
,
'5'
,
'1'
,
'79'
);
INSERT
INTO
`score`
VALUES
(
'19'
,
'5'
,
'2'
,
'11'
);
INSERT
INTO
`score`
VALUES
(
'20'
,
'5'
,
'3'
,
'67'
);
INSERT
INTO
`score`
VALUES
(
'21'
,
'5'
,
'4'
,
'100'
);
INSERT
INTO
`score`
VALUES
(
'22'
,
'6'
,
'1'
,
'9'
);
INSERT
INTO
`score`
VALUES
(
'23'
,
'6'
,
'2'
,
'100'
);
INSERT
INTO
`score`
VALUES
(
'24'
,
'6'
,
'3'
,
'67'
);
INSERT
INTO
`score`
VALUES
(
'25'
,
'6'
,
'4'
,
'100'
);
INSERT
INTO
`score`
VALUES
(
'26'
,
'7'
,
'1'
,
'9'
);
INSERT
INTO
`score`
VALUES
(
'27'
,
'7'
,
'2'
,
'100'
);
INSERT
INTO
`score`
VALUES
(
'28'
,
'7'
,
'3'
,
'67'
);
INSERT
INTO
`score`
VALUES
(
'29'
,
'7'
,
'4'
,
'88'
);
INSERT
INTO
`score`
VALUES
(
'30'
,
'8'
,
'1'
,
'9'
);
INSERT
INTO
`score`
VALUES
(
'31'
,
'8'
,
'2'
,
'100'
);
INSERT
INTO
`score`
VALUES
(
'32'
,
'8'
,
'3'
,
'67'
);
INSERT
INTO
`score`
VALUES
(
'33'
,
'8'
,
'4'
,
'88'
);
INSERT
INTO
`score`
VALUES
(
'34'
,
'9'
,
'1'
,
'91'
);
INSERT
INTO
`score`
VALUES
(
'35'
,
'9'
,
'2'
,
'88'
);
INSERT
INTO
`score`
VALUES
(
'36'
,
'9'
,
'3'
,
'67'
);
INSERT
INTO
`score`
VALUES
(
'37'
,
'9'
,
'4'
,
'22'
);
INSERT
INTO
`score`
VALUES
(
'38'
,
'10'
,
'1'
,
'90'
);
INSERT
INTO
`score`
VALUES
(
'39'
,
'10'
,
'2'
,
'77'
);
INSERT
INTO
`score`
VALUES
(
'40'
,
'10'
,
'3'
,
'43'
);
INSERT
INTO
`score`
VALUES
(
'41'
,
'10'
,
'4'
,
'87'
);
INSERT
INTO
`score`
VALUES
(
'42'
,
'11'
,
'1'
,
'90'
);
INSERT
INTO
`score`
VALUES
(
'43'
,
'11'
,
'2'
,
'77'
);
INSERT
INTO
`score`
VALUES
(
'44'
,
'11'
,
'3'
,
'43'
);
INSERT
INTO
`score`
VALUES
(
'45'
,
'11'
,
'4'
,
'87'
);
INSERT
INTO
`score`
VALUES
(
'46'
,
'12'
,
'1'
,
'90'
);
INSERT
INTO
`score`
VALUES
(
'47'
,
'12'
,
'2'
,
'77'
);
INSERT
INTO
`score`
VALUES
(
'48'
,
'12'
,
'3'
,
'43'
);
INSERT
INTO
`score`
VALUES
(
'49'
,
'12'
,
'4'
,
'87'
);
INSERT
INTO
`score`
VALUES
(
'52'
,
'13'
,
'3'
,
'87'
);
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP
TABLE
IF EXISTS `student`;
CREATE
TABLE
`student` (
`sid`
int
(11)
NOT
NULL
AUTO_INCREMENT,
`gender`
char
(1)
NOT
NULL
,
`class_id`
int
(11)
NOT
NULL
,
`sname`
varchar
(32)
NOT
NULL
,
PRIMARY
KEY
(`sid`),
KEY
`fk_class` (`class_id`),
CONSTRAINT
`fk_class`
FOREIGN
KEY
(`class_id`)
REFERENCES
`class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17
DEFAULT
CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT
INTO
`student`
VALUES
(
'1'
,
'男'
,
'1'
,
'理解'
);
INSERT
INTO
`student`
VALUES
(
'2'
,
'女'
,
'1'
,
'钢蛋'
);
INSERT
INTO
`student`
VALUES
(
'3'
,
'男'
,
'1'
,
'张三'
);
INSERT
INTO
`student`
VALUES
(
'4'
,
'男'
,
'1'
,
'张一'
);
INSERT
INTO
`student`
VALUES
(
'5'
,
'女'
,
'1'
,
'张二'
);
INSERT
INTO
`student`
VALUES
(
'6'
,
'男'
,
'1'
,
'张四'
);
INSERT
INTO
`student`
VALUES
(
'7'
,
'女'
,
'2'
,
'铁锤'
);
INSERT
INTO
`student`
VALUES
(
'8'
,
'男'
,
'2'
,
'李三'
);
INSERT
INTO
`student`
VALUES
(
'9'
,
'男'
,
'2'
,
'李一'
);
INSERT
INTO
`student`
VALUES
(
'10'
,
'女'
,
'2'
,
'李二'
);
INSERT
INTO
`student`
VALUES
(
'11'
,
'男'
,
'2'
,
'李四'
);
INSERT
INTO
`student`
VALUES
(
'12'
,
'女'
,
'3'
,
'如花'
);
INSERT
INTO
`student`
VALUES
(
'13'
,
'男'
,
'3'
,
'刘三'
);
INSERT
INTO
`student`
VALUES
(
'14'
,
'男'
,
'3'
,
'刘一'
);
INSERT
INTO
`student`
VALUES
(
'15'
,
'女'
,
'3'
,
'刘二'
);
INSERT
INTO
`student`
VALUES
(
'16'
,
'男'
,
'3'
,
'刘四'
);
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP
TABLE
IF EXISTS `teacher`;
CREATE
TABLE
`teacher` (
`tid`
int
(11)
NOT
NULL
AUTO_INCREMENT,
`tname`
varchar
(32)
NOT
NULL
,
PRIMARY
KEY
(`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6
DEFAULT
CHARSET=utf8;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT
INTO
`teacher`
VALUES
(
'1'
,
'张磊老师'
);
INSERT
INTO
`teacher`
VALUES
(
'2'
,
'李平老师'
);
INSERT
INTO
`teacher`
VALUES
(
'3'
,
'刘海燕老师'
);
INSERT
INTO
`teacher`
VALUES
(
'4'
,
'朱云海老师'
);
INSERT
INTO
`teacher`
VALUES
(
'5'
,
'李杰老师'
);
SET
FOREIGN_KEY_CHECKS=1;
|
sql练习:
1、查询所有的课程的名称以及对应的任课老师姓名
1
|
select
course.cname 课程,teacher.tname 讲师
from
course
inner
join
teacher
on
course.teacher_id=teacher.tid;
|
2、查询学生表中男女生各有多少人
1
|
select
gender 性别,
count
(*) 人数
from
student
group
by
gender;
|
3、查询物理成绩等于100的学生的姓名
1
|
select
sname 姓名
from
student
where
sid
in
(
select
student_id
from
score
inner
join
course
on
score.course_id=course.cid
where
course.cname=
'物理'
and
score.num=100);
|
4、查询平均成绩大于八十分的同学的姓名和平均成绩
1
|
select
student.sname 姓名,
avg
(score.num) 平均分
from
score
left
join
student
on
score.student_id=student.sid
group
by
student_id;
|
5、查询所有学生的学号,姓名,选课数,总成绩
1
|
select
student.sid 学号,student.sname 姓名,
count
(score.course_id) 课程数,
sum
(score.num) 总成绩
from
student
left
join
score
on
student.sid=score.student_id
group
by
student.sid;
|
6、 查询姓李老师的个数
1
|
select
tname 姓李的老师
from
teacher
where
tname
like
"李%"
;
|
7、 查询没有报李平老师课的学生姓名
1
|
select
sid 学号,sname 姓名
from
student
where
sid
not
in
(
select
student_id
from
score
where
course_id
in
(
select
course.cid
from
teacher
left
join
course
on
teacher.tid=course.teacher_id
where
teacher.tname=
"李平老师"
));
|
8、 查询物理课程比生物课程高的学生的学号
1
2
3
4
5
6
7
8
9
|
select
phy.student_id 学号
from
(
select
score.student_id,score.num
from
score
left
join
course
on
score.course_id=course.cid
where
cname=
"物理"
)
as
phy
inner
join
(
select
score.student_id,score.num
from
score
left
join
course
on
score.course_id=course.cid
where
cname=
"生物"
)
as
bio
on
phy.student_id=bio.student_id
where
phy.num>bio.num
|
9、 查询没有同时选修物理课程和体育课程的学生姓名
1
2
3
4
5
6
7
|
select
sname 姓名
from
student
where
sid
not
in
(
select
student_id
from
score
left
join
course
on
score.course_id=course.cid
where
cname=
"体育"
or
cname=
"物理"
group
by
student_id
having
count
(course_id)>1)
);
|
10、查询挂科超过两门(包括两门)的学生姓名和班级
1
2
3
4
5
|
select
sname,caption
from
student
inner
join
class
on
student.class_id=class.cid
where
student.sid
in
(
select
student_id
from
score
where
score.num<60
group
by
student_id
having
count
(student_id)>=2);
|
11 、查询选修了所有课程的学生姓名
1
2
3
4
|
select
sname 姓名
from
student
where
sid
in
(
select
student_id
from
score
group
by
student_id
having
count
(student_id) = (
select
count
(cid)
from
course));
|
12、查询李平老师教的课程的所有成绩记录
1
2
3
4
5
|
select
course.cname 课程,score.num 成绩
from
score
inner
join
course
on
course_id=cid
where
course_id
in
(
select
cid
from
course
left
join
teacher
on
teacher_id=tid
where
tname
like
"李平%"
);
|
13、查询全部学生都选修了的课程号和课程名
1
2
3
4
|
select
cid,cname
from
course
where
cid
in
(
select
course_id
from
score
group
by
course_id
having
count
(course_id) = (
select
count
(sid)
from
student));
|
14、查询每门课程被选修的次数
1
2
3
|
select
course.cname 课程,
count
(course_id) 选修次数
from
score
inner
join
course
on
score.course_id=course.cid
group
by
course_id;
|
15、查询只选修了一门课程的学生姓名和学号
1
2
3
4
5
|
select
sid 学号,sname 姓名
from
student
where
sid
in
(
select
student_id
from
score
group
by
student_id
having
count
(student_id)=1);
|
16、查询所有学生考出的成绩并按从高到低排序(成绩去重)
1
2
3
4
|
select
sname 姓名,
sum
(num) 总分
from
score
inner
join
student
on
score.student_id=student.sid
group
by
student_id
order
by
sum
(num)
desc
;
|
17、查询平均成绩大于85的学生姓名和平均成绩
1
2
3
4
5
|
select
student.sname 姓名,
avg
(num) 平均成绩
from
student
inner
join
score
on
student.sid=student_id
group
by
student_id
having
avg
(num)>85;
|
18、查询生物成绩不及格的学生姓名和对应生物分数
1
2
3
4
5
|
select
sname 姓名,num 分数
from
score
inner
join
student
on
student_id=student.sid
where
course_id
in
(
select
cid
from
course
where
cname=
"生物"
)
having
num <60;
|
19、查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名
1
2
3
4
5
6
7
8
9
10
|
select
student.sname 姓名,
avg
(num) 平均成绩
from
score
inner
join
student
on
score.student_id=student.sid
where
course_id
in
(
select
cid
from
course
inner
join
teacher
on
teacher_id=tid
where
teacher.tname
like
"李平%"
)
group
by
student_id
order
by
avg
(num)
desc
limit 1
|
迟到的栋子