• 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 -- 嵌套的思路
  • 相关阅读:
    odoo国际化翻译
    Odoo创建基础模块和相关内容
    odoo权限管理(二.记录管理)
    推荐的 MongoDB 安装文档
    Python Spider 抓取今日头条街拍美图
    Python Spider 抓取猫眼电影TOP100
    如何选择 SQL Server 数据库跟操作系统版本
    Mongodb 折腾笔记
    MySQLReport
    kernel TCP time wait bucket table overflow
  • 原文地址:https://www.cnblogs.com/zhengfengyun/p/5287645.html
Copyright © 2020-2023  润新知