mysql练习

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表中的所有记录的Sname、Ssex和Class列。

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

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

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

5、查询Score表中成绩为85,86或88的记录。

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

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

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

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

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

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

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

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

14、查询所有学生的Sname、Cno和Degree列。

15、查询所有学生的Sno、Cname和Degree列。

16、查询所有学生的Sname、Cname和Degree列。

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')

现查询所有同学的Sno、Cno和rank列。

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

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

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

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

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

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

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

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

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

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

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

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

31、 查询所有教师和同学的name、sex和birthday.

32、查询所有"女"教师和"女"同学的name、sex和birthday.

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

34、查询所有任课教师的Tname和Depart.

35 、查询所有未讲课的教师的Tname和Depart.

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

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

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

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

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

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

42、查询最高分同学的Sno、Cno和Degree列。

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 -- 嵌套的思路

复制代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值