博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySql练习+加源代码
阅读量:5884 次
发布时间:2019-06-19

本文共 14200 字,大约阅读时间需要 47 分钟。

、设有一个数据库,包括四个表:学生表(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 xx130 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.cno158 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.cno164 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,grade174 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 score187 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 a191 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 a195 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 score201 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 IN221 (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和Prof241 -- 方法一:242 SELECT tname,prof FROM teacher  WHERE depart='计算机系' 243 AND prof NOT IN(SELECT prof FROM teacher WHERE depart='电子工程系' ) 244 UNION245 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和max261 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 student271 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-- 研究一下join278 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 IN290 (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.tno294 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 IN301 (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.tno305 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.tno332 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 -- 嵌套的思路

 

转载于:https://www.cnblogs.com/zhengfengyun/p/5287645.html

你可能感兴趣的文章
GRUB Legacy
查看>>
关于 error: LINK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案...
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
文件缓存
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
MySQL查询优化
查看>>
android app启动过程(转)
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Applet
查看>>
高并发环境下,Redisson实现redis分布式锁
查看>>
关于浏览器的cookie
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
【吉光片羽】短信验证
查看>>
gitlab 完整部署实例
查看>>
GNS关于IPS&ASA&PIX&Junos的配置
查看>>