MySql练习+加源代码

、设有一个数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。

四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。

1-1数据库的表结构

表(一)Student (学生表)

属性名

数据类型

可否为空

Sno

varchar (20)

学号(主码)

Sname

varchar (20)

学生姓名

Ssex

varchar (20)

学生性别

Sbirthday

datetime

学生出生年月

Class

varchar (20)

学生所在班级

表(二)Course(课程表)

属性名

数据类型

可否为空

Cno

varchar (20)

课程号(主码)

Cname

varchar (20)

课程名称

Tno

varchar (20)

教工编号(外码)

表(三)Score(成绩表)

属性名

数据类型

可否为空

Sno

varchar (20)

学号(外码)

Cno

varchar (20)

课程号(外码)

Degree

Decimal(4,1)

成绩

主码:Sno+ Cno

表(四)Teacher(教师表)

属性名

数据类型

可否为空

Tno

varchar (20)

教工编号(主码)

Tname

varchar (20)

教工姓名

Tsex

varchar (20)

教工性别

Tbirthday

datetime

教工出生年月

Prof

varchar (20)

职称

Depart

varchar (20)

教工所在部门

1-2数据库中的数据

表(一)Student

Sno

Sname

Ssex

Sbirthday

class

108

曾华

1977-09-01

95033

105

匡明

1975-10-02

95031

107

王丽

1976-01-23

95033

101

李军

1976-02-20

95033

109

王芳

1975-02-10

95031

103

陆君

1974-06-03

95031

 

表(二)Course

Cno

Cname

Tno

3-105

计算机导论

825

3-245

操作系统

804

6-166

数字电路

856

9-888

高等数学

831

表(三)Score

Sno

Cno

Degree

103

3-245

86

105

3-245

75

109

3-245

68

103

3-105

92

105

3-105

88

109

3-105

76

101

3-105

64

107

3-105

91

108

3-105

78

101

6-166

85

107

6-166

79

108

6-166

81

表(四)Teacher

Tno

Tname

Tsex

Tbirthday

Prof

Depart

804

李诚

1958-12-02

副教授

计算机系

856

张旭

1969-03-12

讲师

电子工程系

825

王萍

1972-05-05

助教

计算机系

831

刘冰

1977-08-14

助教

电子工程系

1、查询Student表中的所有记录的SnameSsexClass列。

2、查询教师所有的单位即不重复的Depart列。

3、查询Student表的所有记录。

4、查询Score表中成绩在6080之间的所有记录。

5、查询Score表中成绩为858688的记录。

6、查询Student表中"95031"班或性别为"女"的同学记录。

7、Class降序查询Student表的所有记录。

8、Cno升序、Degree降序查询Score表的所有记录。

9、查询"95031"班的学生人数。

10、 查询Score表中的最高分的学生学号和课程号。(子查询或者排序)

11、查询每门课的平均成绩。

12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

13、查询分数大于70,小于90Sno列。

14、查询所有学生的SnameCnoDegree列。

15、查询所有学生的SnoCnameDegree列。

16、查询所有学生的SnameCnameDegree列。

17、 查询"95033"班学生的平均分。

18、假设使用如下命令建立了一个grade表:

create table grade(low int(3),upp int(3),rank char(1))

insert into grade values(90,100,'A')

insert into grade values(80,89,'B')

insert into grade values(70,79,'C')

insert into grade values(60,69,'D')

insert into grade values(0,59,'E')

现查询所有同学的SnoCnorank列。

19、  查询选修"3-105"课程的成绩高于"109"号同学成绩的所有同学的记录。

20、查询score中选学多门课程的同学中分数为非最高分成绩的记录。

21、查询成绩高于学号为"109"、课程号为"3-105"的成绩的所有记录。

22、查询和学号为108的同学同年出生的所有学生的SnoSnameSbirthday列。

23、查询"张旭"教师任课的学生成绩。

24、查询选修某课程的同学人数多于5人的教师姓名。

25、查询95033班和95031班全体学生的记录。

26、  查询存在有85分以上成绩的课程Cno.

27、查询出"计算机系"教师所教课程的成绩表。

28、查询"计算机系"与"电子工程系"不同职称的教师的TnameProf

29、查询选修编号为"3-105"课程且成绩至少高于选修编号为"3-245"的同学的CnoSnoDegree,并按Degree从高到低次序排序。

30、查询选修编号为"3-105"且成绩高于选修编号为"3-245"课程的同学的CnoSnoDegree.

31、 查询所有教师和同学的namesexbirthday.

32、查询所有"女"教师和"女"同学的namesexbirthday.

33、 查询成绩比该课程平均成绩低的同学的成绩表。

34、查询所有任课教师的TnameDepart.

35 查询所有未讲课的教师的TnameDepart.

36、查询至少有2名男生的班号。

37、查询Student表中不姓"王"的同学记录。

38、查询Student表中每个学生的姓名和年龄。

39、查询Student表中最大和最小的Sbirthday日期值。

40、以班号和年龄从大到小的顺序查询Student表中的全部记录。

41、查询"男"教师及其所上的课程。

42、查询最高分同学的SnoCnoDegree列。

43、查询和"李军"同性别的所有同学的Sname.

44、查询和"李军"同性别并同班的同学Sname.

45、查询所有选修"计算机导论"课程的"男"同学的成绩表。

代码:

  1 USE exam;
  2 -- 创建表
  3 -- 学生表
  4 CREATE TABLE student(
  5     sno VARCHAR(20) NOT NULL PRIMARY KEY,-- 学生学号
  6     sname VARCHAR(20) NOT NULL,-- 学生姓名
  7     ssex VARCHAR(20) NOT NULL,-- 学生性别
  8     sbirthday date, -- 学生出生年月
  9     class VARCHAR(20)-- 所在班级
 10 );
 11 -- 老师表
 12 CREATE TABLE teacher(
 13     tno VARCHAR(20) NOT NULL PRIMARY KEY,-- 老师编号
 14     tname VARCHAR(20) NOT NULL,-- 老师姓名
 15     tsex VARCHAR(20) NOT NULL,-- 老师性别
 16     tbirthday date,-- 老师出生年月
 17     prof VARCHAR(20),-- 职称
 18     depart VARCHAR(20) NOT NULL-- 所在部门
 19 );
 20 -- 课程表
 21 CREATE TABLE course(
 22     cno VARCHAR(20) NOT NULL PRIMARY KEY,-- 课程号
 23     cname VARCHAR(20) NOT NULL,-- 课程名称
 24     tno VARCHAR(20) NOT NULL,-- 教工编号
 25     FOREIGN KEY (tno) REFERENCES teacher(tno) -- 外键
 26 );
 27 -- 成绩表
 28 CREATE TABLE score(
 29     sno VARCHAR(20) NOT NULL, -- 学生编号
 30     cno VARCHAR(20) NOT NULL, -- 课程编号
 31     degree DECIMAL(4,1),-- 成绩 
 32     CONSTRAINT fk FOREIGN KEY (sno) REFERENCES student(sno),-- 学生外键
 33     CONSTRAINT fk1 FOREIGN KEY (cno) REFERENCES course(cno),-- 课程外键
 34     PRIMARY KEY (sno,cno)
 35 );
 36 -- 18题grade表
 37 create table grade(low  int(3),upp  int(3),rank  char(1));
 38 insert into grade values(90,100,'A');
 39 insert into grade values(80,89,'B');
 40 insert into grade values(70,79,'C');
 41 insert into grade values(60,69,'D');
 42 insert into grade values(0,59,'E');
 43 
 44 -- 录入信息
 45 -- 录入学生表信息
 46 INSERT INTO student VALUES 
 47 ('108','曾华','','1977-09-01','95033'),
 48 ('105','匡明','','1975-10-02','95031'),
 49 ('107','王丽','','1976-01-23','95033'),
 50 ('101','李军','','1976-02-20','95033'),
 51 ('109','王芳','','1975-02-10','95031'),
 52 ('103','陆君','','1974-06-03','95031');
 53 -- 录入老师的信息
 54 INSERT INTO teacher VALUES
 55 ('804','李成','','1958-12-02','副教授','计算机系'),
 56 ('856','张旭','','1969-03-12','讲师','电子工程系'),
 57 ('825','王萍','','1972-05-05','助教','计算机系'),
 58 ('831','刘冰','','1977-08-14','助教','电子工程系');
 59 -- 录入课程信息
 60 INSERT INTO course VALUES
 61 ('3-105','计算机导论','825'),
 62 ('3-245','操作系统','804'),
 63 ('6-166','数字电路','856'),
 64 ('9-888','高等数学','831');
 65 -- 录入成绩信息
 66 INSERT INTO score VALUES
 67 ('103','3-245',86),
 68 ('105','3-245',75),
 69 ('109','3-245',68),
 70 ('103','3-105',92),
 71 ('105','3-105',88),
 72 ('109','3-105',76),
 73 ('101','3-105',64),
 74 ('107','3-105',91),
 75 ('108','3-105',78),
 76 ('101','6-166',85),
 77 ('107','6-166',79),
 78 ('108','6-166',81);
 79 -- 查询
 80 -- 1,查询Student表中的所有记录的Sname、Ssex和Class列
 81 SELECT sname,ssex,class FROM student;
 82 
 83 
 84 -- 2,查询教师所有的单位即不重复的Depart列
 85 SELECT DISTINCT depart  所在单位 FROM teacher;
 86 
 87 
 88 -- 3,查询Student表的所有记录
 89 SELECT * FROM student;
 90 
 91 
 92 -- 4,查询Score表中成绩在60到80之间的所有记录
 93 -- 前闭后开
 94 SELECT * FROM score WHERE degree BETWEEN 60 AND 80;
 95 
 96 
 97 -- 5,查询Score表中成绩为85,86或88的记录
 98 SELECT * FROM score WHERE degree=85 || degree=86 || degree=88;
 99 SELECT * FROM score WHERE degree=85 OR degree=86 OR degree=88;
100 SELECT * FROM score WHERE degree IN (85,86,88);
101 
102 
103 -- 6,查询Student表中“95031”班,性别为“女”的同学记录
104 SELECT * FROM student WHERE ssex='' AND class='95031'; 
105 SELECT * FROM student WHERE ssex='' OR class='95031'; 
106 
107 
108 -- 7,Class降序查询Student表的所有记录
109 SELECT * FROM student ORDER BY class DESC;
110 
111 
112 -- 8,以Cno升序,Degree降序查询Score表的所有记录。
113 SELECT * FROM score ORDER BY cno,degree DESC;
114 
115 
116 -- 9,查询“95031”班的学生人数。
117 SELECT class 班级,COUNT(*) 人数 FROM student WHERE class='95031'; 
118 SELECT class 班级 FROM student WHERE class='95031'; 
119 
120 
121 -- 10,查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
122 SELECT sno 学号,cno 课程号 FROM score WHERE degree =(SELECT MAX(degree)FROM score )
123 
124 
125 -- 11,查询每门课的平均成绩
126 SELECT cno 课程编号,AVG(degree) FROM score GROUP BY cno;
127 -- 加上课程名称了
128 SELECT cno 课程编号,cname 课程名称,AVG(degree) 
129 FROM (SELECT score.cno,cname,degree FROM course,score WHERE course.cno=score.cno) AS xx
130 GROUP BY cno;
131 -- 1.明确要查询的表,可能是子查询(明确语句的执行顺序)
132 -- 2.加条件
133 -- 3.尽量用IN,不用等号?
134 -- 12,查询Score表中至少有5名学生选修的并以3开头的课程的平均分数
135 -- 没有加上课程名,太麻烦
136 -- 方法一:
137 SELECT cno,AVG(degree) FROM score WHERE 
138 cno=(SELECT cno FROM score WHERE cno LIKE '3%' GROUP BY cno HAVING COUNT(*)>=5);
139 -- 方法二:
140 SELECT cno,AVG(degree ) FROM score WHERE cno LIKE '3%' GROUP BY cno HAVING COUNT(*)>=5;
141 
142 
143 -- 13,查询分数大于70,小于90的Sno列
144 -- between and 前闭后开?
145 SELECT sno FROM score WHERE degree>70 AND degree<90;
146 
147 
148 -- 14,查询所有学生的Sname、Cno和Degree列
149 -- 可以试着加上课程的名字
150 -- 用JOIN写写
151 SELECT sname,cno,degree FROM student,score WHERE student.sno=score.sno;
152 
153 
154 -- 15,查询所有学生的Sno、Cname和Degree列
155 -- 用JOIN写写
156 SELECT student.sno,sname,cname,degree FROM student,score,course 
157 WHERE student.sno=score.sno AND score.cno=course.cno
158 ORDER BY student.sno;
159 
160 
161 -- 16,查询所有学生的Sname、Cname和Degree列
162 SELECT sname,cname,degree FROM student,score,course 
163 WHERE student.sno=score.sno AND score.cno=course.cno
164 ORDER BY student.sno;
165 
166 
167 -- 17,查询“95033”班学生的平均分。
168 SELECT class,AVG(degree) FROM score,student 
169 WHERE student.sno=score.sno and class='95033';
170 
171 
172 -- 18,现查询所有同学的Sno、Cno和rank列
173 SELECT student.sno,cno,rank FROM student,score,grade
174 WHERE student.sno=score.sno  AND degree<=upp AND degree>low;
175 -- 方法二:这个很重要
176 SELECT sno,cno,rank FROM score JOIN grade ON degree BETWEEN low AND upp;
177 
178 
179 -- 19,查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
180 SELECT * FROM score WHERE cno='3-105'
181 AND degree>(SELECT degree FROM score WHERE sno='109'AND cno='3-105');
182 
183 
184 -- 20,查询score中选学多门课程的同学中分数为非最高分成绩的记录。
185 -- 会有别名错误,什么时候才必须加别名
186 SELECT * FROM score
187 WHERE cno in(SELECT cno FROM score GROUP BY cno HAVING count(*)>1)
188 AND degree <> (SELECT MAX(degree) FROM score);
189 -- 更正
190 SELECT * FROM score a
191 WHERE sno in(SELECT sno FROM score GROUP BY sno HAVING count(*)>1)
192 AND degree <> (SELECT MAX(degree) FROM score b WHERE b.cno=a.cno);
193 -- 另一种理解
194 SELECT * FROM score a
195 WHERE sno in(SELECT sno FROM score GROUP BY sno HAVING count(*)>1) 
196 AND degree <> (SELECT MAX(degree) FROM );
197 
198 
199 -- 21,查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
200 SELECT * FROM score
201 WHERE degree > (SELECT max(degree) FROM score WHERE sno='109'AND cno = '3-105');
202 
203 
204 -- 22,查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
205 SELECT * FROM student 
206 WHERE YEAR(sbirthday)=(SELECT YEAR(sbirthday) FROM student WHERE sno='108') AND sno <> '108';
207 
208 
209 -- 23,查询“张旭“教师任课的学生成绩。
210 SELECT degree FROM course,teacher,score 
211 WHERE teacher.tno=course.tno AND course.cno=score.cno AND tname='张旭';
212 -- :嵌套的做法
213 
214 
215 -- 24,查询选修某课程的同学人数多于5人的教师姓名
216 SELECT tname FROM course,teacher,score 
217 WHERE teacher.tno=course.tno AND course.cno=score.cno 
218 GROUP BY teacher.tno HAVING count(*)>5;
219 -- 嵌套的做法
220 SELECT tname FROM teacher WHERE tno IN
221 (SELECT tno FROM course WHERE cno IN 
222 (SELECT cno FROM score GROUP BY cno HAVING COUNT(*)>5));
223 
224 
225 -- 25,查询95033班和95031班全体学生的记录
226 SELECT * FROM student WHERE class='95033' OR class='95031';
227 SELECT * FROM student WHERE class IN ('95033','95031');
228 
229 
230 -- 26,查询存在有85分以上成绩的课程Cno.
231 SELECT DISTINCT cno FROM score WHERE degree>85;
232 
233 
234 -- 27,查询出“计算机系“教师所教课程的成绩表。
235 SELECT score.sno,score.cno,score.degree,depart FROM course,teacher,score 
236 WHERE teacher.tno=course.tno AND course.cno=score.cno AND depart='计算机系';
237 -- 这里也可以用嵌套
238 
239 
240 -- 28,查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof
241 -- 方法一:
242 SELECT tname,prof FROM teacher  WHERE depart='计算机系' 
243 AND prof NOT IN(SELECT prof FROM teacher WHERE depart='电子工程系' ) 
244 UNION
245 SELECT tname,prof FROM teacher  WHERE depart='电子工程系' 
246 AND prof NOT IN(SELECT prof FROM teacher WHERE depart='计算机系' ) ;
247 -- 方法二:思路不清晰,得整理
248 SELECT tname,prof FROM teacher a WHERE 
249 a.prof NOT IN (SELECT b.prof FROM teacher b WHERE b.depart <> a.depart )
250 -- 方法三:
251 SELECT * FROM teacher WHERE prof NOT IN (SELECT prof FROM teacher WHERE depart='计算机系' 
252 AND prof IN(SELECT prof FROM teacher WHERE depart='电子工程系')); 
253 
254 
255 -- 29,查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的
256 -- Cno、Sno和Degree,并按Degree从高到低次序排序。
257 SELECT cno,sno,degree FROM score WHERE cno='3-105'
258 AND degree > ANY(SELECT MIN(degree) FROM score WHERE cno='3-245' )
259 ORDER BY degree DESC;
260 -- ANY 至少一个  ALL 所有的 可以用来替代min和max
261 
262 
263 -- 30,查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
264 SELECT cno,sno,degree FROM score WHERE cno='3-105'
265 AND degree > ALL(SELECT MAX(degree) FROM score WHERE cno='3-245' )
266 ORDER BY degree DESC;
267 
268 
269 -- 31,查询所有教师和同学的name、sex和birthday.
270 SELECT sname 姓名,ssex 性别,sbirthday 生日 FROM student
271 UNION-- 研究一下这个还有相关子查询
272 SELECT tname 姓名,tsex 性别,tbirthday 生日 FROM teacher;
273 
274 
275 -- 32,查询所有“女”教师和“女”同学的name、sex和birthday.
276 SELECT sname 姓名,ssex 性别,sbirthday 生日 FROM student WHERE ssex=''
277 UNION-- 研究一下join
278 SELECT tname 姓名,tsex 性别,tbirthday 生日 FROM teacher WHERE tsex='';
279 
280 
281 -- 33,查询成绩比该课程平均成绩低的同学的成绩表。
282 -- 相关子查询的应用
283 SELECT * FROM score a 
284 WHERE a.degree > (SELECT AVG(degree) FROM score b WHERE b.cno=a.cno);
285 
286 
287 -- 34,查询所有任课教师的Tname和Depart.
288 -- 方法一:
289 SELECT tname,depart FROM teacher WHERE tname IN
290 (SELECT DISTINCT tname FROM course,teacher,score 
291 WHERE teacher.tno=course.tno AND course.cno=score.cno);
292 -- 方法二:还得研究一下啊
293 SELECT DISTINCT tname,depart FROM teacher LEFT JOIN course ON teacher.tno=course.tno
294 LEFT JOIN score ON score.cno=course.cno WHERE degree IS NOT NULL;
295 -- 嵌套的方法
296  SELECT tname,depart FROM teacher WHERE tno IN (SELECT tno FROM course );
297 
298 
299 -- 35,查询所有未讲课的教师的Tname和Depart. 
300 SELECT tname,depart FROM teacher WHERE tname NOT IN
301 (SELECT DISTINCT tname FROM course,teacher,score 
302 WHERE teacher.tno=course.tno AND course.cno=score.cno);
303 -- 方法二:
304 SELECT tname,depart FROM teacher LEFT JOIN course ON teacher.tno=course.tno
305 LEFT JOIN score ON score.cno=course.cno WHERE degree IS NULL;
306 
307 
308 -- 36,查询至少有2名男生的班号。
309 SELECT class FROM student 
310 GROUP BY class HAVING COUNT(ssex)>=2;
311 
312 
313 -- 37,查询Student表中不姓“王”的同学记录。
314 SELECT * FROM student WHERE sname NOT LIKE '王%';
315 
316 
317 -- 38,查询Student表中每个学生的姓名和年龄。
318 SELECT sname 姓名,YEAR(NOW())-YEAR(sbirthday) 年龄 FROM student;
319 
320 
321 -- 39,查询Student表中最大和最小的Sbirthday日期值。
322 SELECT MAX(sbirthday),MIN(sbirthday) FROM student; 
323 SELECT MAX(sbirthday) FROM student  UNION SELECT MIN(sbirthday) FROM student;
324 
325 
326 -- 40,以班号和年龄从大到小的顺序查询Student表中的全部记录。
327 SELECT * FROM student ORDER BY class DESC,sbirthday ASC;
328 
329 
330 -- 41,查询“男”教师及其所上的课程。
331 SELECT cname,tname FROM course JOIN teacher ON teacher.tno=course.tno
332 WHERE tsex='';
333 
334 
335 -- 42,查询最高分同学的Sno、Cno和Degree列。
336 SELECT sno,cno,degree FROM score WHERE degree = (SELECT MAX(degree) FROM score);
337 
338 
339 -- 43,查询和“李军”同性别的所有同学的Sname.
340 SELECT sname FROM student WHERE ssex IN 
341 (SELECT ssex FROM student WHERE sname='李军');
342 
343 
344 -- 44,查询和“李军”同性别并同班的同学Sname.
345 SELECT sname FROM student WHERE 
346 ssex IN (SELECT ssex FROM student WHERE sname='李军')
347 AND 
348 class IN (SELECT class FROM student WHERE sname='李军');
349 
350 
351 -- 45,查询所有选修“计算机导论”课程的“男”同学的成绩表。
352 SELECT * FROM course JOIN score ON course.cno=score.cno 
353 JOIN student ON student.sno=score.sno 
354 WHERE cname='计算机导论' AND ssex='';
355 -- 嵌套的思路

 

posted @ 2016-03-17 15:36  xz小郑  阅读(674)  评论(0编辑  收藏  举报