diff --git "a/01 \345\274\240\350\276\211/20230227 \345\205\263\350\201\224\346\237\245\350\257\242\357\274\210\350\201\224\345\220\210\346\237\245\350\257\242\357\274\211.md" "b/01 \345\274\240\350\276\211/20230227 \345\205\263\350\201\224\346\237\245\350\257\242\357\274\210\350\201\224\345\220\210\346\237\245\350\257\242\357\274\211.md" index a3dc9bbe98867b0555daf6cb57f619baa687bfd4..b9343865cfd1eea5dae4862dc0bbad4514b3af46 100644 --- "a/01 \345\274\240\350\276\211/20230227 \345\205\263\350\201\224\346\237\245\350\257\242\357\274\210\350\201\224\345\220\210\346\237\245\350\257\242\357\274\211.md" +++ "b/01 \345\274\240\350\276\211/20230227 \345\205\263\350\201\224\346\237\245\350\257\242\357\274\210\350\201\224\345\220\210\346\237\245\350\257\242\357\274\211.md" @@ -66,12 +66,12 @@ SELECT 字段列表 FROM 表A ...UNION [ALL]SELECT 字段列表 FROM 表B ... ```mysql -- 1. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 --- +-- create database demo charset utf8; -- 2. **数据库的表结构** use demo; -- 表(一)Student (学生表) --- +-- -- | 属性名 | 数据类型 | 可否为空 | 含义 | -- | --------- | ------------ | -------- | ------------ | -- | Sno | varchar (20) | 否 | 学号(主码) | @@ -79,44 +79,50 @@ use demo; -- | Ssex | varchar (20) | 否 | 学生性别 | -- | Sbirthday | datetime | 可 | 学生出生年月 | -- | Class | varchar (20) | 可 | 学生所在班级 | -create table Student( - Sno varchar(20) primary key comment"学号", - Sname varchar(20) not null comment"学生姓名", - Ssex varchar(20) not null comment"学生性别", - Sbirthday datetime comment'学生出生年月', - Class varchar(20) comment'学生所在班级' +create table Student +( + Sno varchar(20) primary key comment '学号', + Sname varchar(20) not null comment '学生姓名', + Ssex varchar(20) not null comment '学生性别', + Sbirthday datetime comment '学生出生年月', + Class varchar(20) comment '学生所在班级' ); + -- 表(二)Course(课程表) --- +-- -- | 属性名 | 数据类型 | 可否为空 | 含义 | -- | ------ | ------------ | -------- | ---------------- | -- | Cno | varchar (20) | 否 | 课程号(主码) | -- | Cname | varchar (20) | 否 | 课程名称 | -- | Tno | varchar (20) | 否 | 教工编号(外码) | -create table Course( - Cno varchar (20) primary key comment'课程号', - Cname varchar(20) not null comment'课程名称 ', - Tno varchar(20) not null comment'教工编号', - foreign key (Tno) references Teacher(Tno) +create table Course +( + Cno varchar(20) primary key comment '课程号', + Cname varchar(20) not null comment '课程名称 ', + Tno varchar(20) not null comment '教工编号', + foreign key (Tno) references Teacher (Tno) ); + -- 表(三)Score(成绩表) --- +-- -- | 属性名 | 数据类型 | 可否为空 | 含义 | -- | -------------- | ------------ | -------- | -------------- | -- | Sno | varchar (20) | 否 | 学号(外码) | -- | Cno | varchar (20) | 否 | 课程号(外码) | -- | Degree | Decimal(4,1) | 可 | 成绩 | -- | 主码:Sno+ Cno | | | | -create table Score( - Sno varchar(20) not null comment'学号', - Cno varchar(20) not null comment'课程号', - Degree Decimal(4,1) comment'成绩', - foreign key (Sno) references Student(Sno), - foreign key (Cno) references Course(Cno), - primary key(Sno,Cno) +create table Score +( + Sno varchar(20) not null comment '学号', + Cno varchar(20) not null comment '课程号', + Degree Decimal(4, 1) comment '成绩', + foreign key (Sno) references Student (Sno), + foreign key (Cno) references Course (Cno), + primary key (Sno, Cno) ); + -- 表(四)Teacher(教师表) --- +-- -- | 属性名 | 数据类型 | 可否为空 | 含义 | -- | --------- | ------------ | -------- | ---------------- | -- | Tno | varchar (20) | 否 | 教工编号(主码) | @@ -125,20 +131,18 @@ create table Score( -- | Tbirthday | datetime | 可 | 教工出生年月 | -- | Prof | varchar (20) | 可 | 职称 | -- | Depart | varchar (20) | 否 | 教工所在部门 | -create table Teacher( - Tno varchar(20) primary key not null comment'教工编号', - Tname varchar(20) not null comment'教工姓名', - Tsex varchar(20) not null comment'教工性别', - Tbirthday datetime comment'教工出生年月', - Prof varchar(20) comment'职称', - Depart varchar(20) not null comment'教工所在部门' +create table Teacher +( + Tno varchar(20) primary key not null comment '教工编号', + Tname varchar(20) not null comment '教工姓名', + Tsex varchar(20) not null comment '教工性别', + Tbirthday datetime comment '教工出生年月', + Prof varchar(20) comment '职称', + Depart varchar(20) not null comment '教工所在部门' ); --- --- --- --- + -- 表(一)Student --- +-- -- | Sno | Sname | Ssex | Sbirthday | class | -- | ---- | ----- | ---- | --------- | ----- | -- | 108 | 曾华 | 男 | 1977-9-1 | 95033 | @@ -147,28 +151,30 @@ create table Teacher( -- | 101 | 李军 | 男 | 1976-2-20 | 95033 | -- | 109 | 王芳 | 女 | 1975-2-10 | 95031 | -- | 103 | 陆君 | 男 | 1974-6-3 | 95031 | -insert into Student values - ('108','曾华','男','1977-9-1','95033'), - ('105','匡明','男','1975-10-2','95031'), - ('107','王丽','女','1976-1-23','95033'), - ('101','李军','男','1976-2-20','95033'), - ('109','王芳','女','1975-2-10','95031'), - ('103','陆君','男','1974-6-3','95031'); +insert into Student +values ('108', '曾华', '男', '1977-9-1', '95033'), + ('105', '匡明', '男', '1975-10-2', '95031'), + ('107', '王丽', '女', '1976-1-23', '95033'), + ('101', '李军', '男', '1976-2-20', '95033'), + ('109', '王芳', '女', '1975-2-10', '95031'), + ('103', '陆君', '男', '1974-6-3', '95031'); + -- 表(二)Course --- +-- -- | Cno | Cname | Tno | -- | ----- | ---------- | ---- | -- | 3-105 | 计算机导论 | 825 | -- | 3-245 | 操作系统 | 804 | -- | 6-166 | 数字电路 | 856 | -- | 9-888 | 高等数学 | 831 | -insert into Course values - ('3-105','计算机导论','825'), - ('3-245','操作系统','804'), - ('6-166','数字电路','856'), - ('9-888','高等数学','831'); +insert into Course +values ('3-105', '计算机导论', '825'), + ('3-245', '操作系统', '804'), + ('6-166', '数字电路', '856'), + ('9-888', '高等数学', '831'); + -- 表(三)Score --- +-- -- | Sno | Cno | Degree | -- | ---- | ----- | ------ | -- | 103 | 3-245 | 86 | @@ -183,90 +189,290 @@ insert into Course values -- | 101 | 6-166 | 85 | -- | 107 | 6-166 | 79 | -- | 108 | 6-166 | 81 | -insert into Score values - ('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'); +insert into Score +values ('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-2 | 副教授 | 计算机系 | -- | 856 | 张旭 | 男 | 1969-3-12 | 讲师 | 电子工程系 | -- | 825 | 王萍 | 女 | 1972-5-5 | 助教 | 计算机系 | -- | 831 | 刘冰 | 女 | 1977-8-14 | 助教 | 电子工程系 | -insert into Teacher values - (804,'李诚','男','1958-12-2','副教授','计算机系'), - (856,'张旭','男','1969-3-12','讲师','电子工程系'), - (825,'王萍','女','1972-5-5','助教','计算机系'), - (831,'刘冰','女','1977-8-14','助教','电子工程系'); +insert into Teacher +values (804, '李诚', '男', '1958-12-2', '副教授', '计算机系'), + (856, '张旭', '男', '1969-3-12', '讲师', '电子工程系'), + (825, '王萍', '女', '1972-5-5', '助教', '计算机系'), + (831, '刘冰', '女', '1977-8-14', '助教', '电子工程系'); + -- 3. **数据库中的数据**: --- +-- -- -- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ -select Student.sno,sname,ssex,sbirthday,class,cname -from Student left join Score on Student.sno=Score.sno -left join Course on Score.cno=Course.cno; +SELECT + Student.*, + cname +FROM + Student + LEFT JOIN Score ON Student.sno = Score.sno + LEFT JOIN Course ON Score.cno = Course.cno; + -- -- 2,查询没有学生的教师的所有信息 -select Teacher.Tno,Tname,Tsex,Tbirthday,Prof,Depart -from Teacher left join Course on Teacher.Tno = Course.Tno -left join Score on Course.Cno = Score.Cno; +SELECT + teacher.* +FROM + teacher + LEFT JOIN Course ON teacher.tno = course.tno + LEFT JOIN score ON score.cno = course.cno + LEFT JOIN student ON student.sno = score.sno +WHERE + student.sno IS NULL; + -- 4. 查询 --- +-- -- ① 查询Score表中的最高分的学生学号和课程号。 -select sno,cno from score where degree=(select max(degree) from score); +SELECT + sno, + cno +FROM + score +WHERE + degree = ( SELECT max( degree ) FROM score ); + -- ② 查询所有学生的Sname、Cno和Degree列。 -select Sname,Cno,Degree from Student inner join Score on student.sno=score.sno; +SELECT + Sname, + Cno, + Degree +FROM + Student + INNER JOIN Score ON student.sno = score.sno; + -- ③ 查询所有学生的Sno、Cname和Degree列。 -select Sno,Cname,Degree from Score inner join course on score.cno=course.cno; +SELECT + Sno, + Cname, + Degree +FROM + Score + INNER JOIN course ON score.cno = course.cno; + -- ④ 查询所有学生的Sname、Cname和Degree列。 -select sname,cname,degree from student inner join score on student.sno=score.sno inner join course on score.cno=course.cno; +SELECT + sname, + cname, + degree +FROM + student + INNER JOIN score ON student.sno = score.sno + INNER JOIN course ON score.cno = course.cno; + -- ⑤ 查询“95033”班学生的平均分。 -select avg(score.Degree) from score inner join student on student.Sno = score.Sno where student.Class = '95033'; +SELECT + class, + avg( Degree ) +FROM + Score + INNER JOIN Student ON Score.Sno = Student.Sno +WHERE + class = 95033; + -- ⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 -select * from student inner join score on student.sno=score.sno where score.cno='3-105' and degree > (select degree from score where score.sno=109 and score.cno='3-105' ); +SELECT * FROM Score WHERE Degree >( SELECT Degree FROM Score WHERE Sno = '109' AND Cno = '3-105' ) +AND Cno = '3-105'; + -- ⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 -select * from Score a where Degree <(select MAX(degree) from Score b where a.Cno=b.Cno) and Sno in(select Sno from Score group by Sno having count(*)>1); +SELECT + * +FROM + Score a +WHERE + Degree < ( SELECT MAX( degree ) FROM Score b WHERE a.Cno = b.Cno ) + AND Sno IN ( SELECT Sno FROM Score GROUP BY Sno HAVING count(*) > 1 ); + -- ⑧ 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 -select * from score where degree>(select degree from score where score.sno=109 and score.cno='3-105'); +SELECT + * +FROM + score +WHERE + degree > ( SELECT degree FROM score WHERE score.sno = 109 AND score.cno = '3-105' ); + -- ⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 -select sno,sname,sbirthday from student where sbirthday=(select sbirthday from student where sno=108); +SELECT + sno, + sname, + sbirthday +FROM + student +WHERE + sbirthday = ( SELECT sbirthday FROM student WHERE sno = 108 ); + -- ⑩ 查询“张旭“教师任课的学生成绩。 -select Degree from score left JOIN course on Score.Cno =Course.Cno right JOIN Teacher on Course.Tno = Teacher.Tno WHERE score.cno=(SELECT cno FROM course INNER JOIN teacher on teacher.Tno=course.Tno WHERE tname='张旭'); +SELECT + Sno, + Degree +FROM + Score +WHERE + Cno =( + SELECT + Cno + FROM + Course + INNER JOIN Teacher ON Course.Tno = Teacher.Tno + WHERE + Tname = '张旭' + ); + -- 11 查询选修某课程的同学人数多于5人的教师姓名。 -select Tname from Teacher where Tno=(select Tno from Course where Cno=(select Cno from Score group by Cno having COUNT(Cno)>5)); +SELECT + Tname +FROM + Teacher +WHERE + Tno = ( + SELECT + Tno + FROM + Course + WHERE + Cno = ( SELECT Cno FROM Score GROUP BY Cno HAVING COUNT( Cno ) > 5 )); + -- 12 查询出“计算机系“教师所教课程的成绩表。 -select score.sno,score.cno,degree from score left join course on score.cno=course.cno left join teacher on course.tno=teacher.tno where depart='计算机系'; +SELECT + score.sno, + score.cno, + degree +FROM + score + LEFT JOIN course ON score.cno = course.cno + LEFT JOIN teacher ON course.tno = teacher.tno +WHERE + depart = '计算机系'; + -- 13 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 -select tname,prof from teacher where prof in (select distinct prof from teacher); +SELECT + tname, + prof +FROM + teacher +WHERE + prof IN ( SELECT DISTINCT prof FROM teacher ); + -- 14 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 -select score.cno,score.sno,score.degree from score inner join course on score.cno = course.cno and score.cno = '3-105' and score.degree > (select max(degree) from score where score.cno='3-245')order by score.degree desc; +SELECT + score.cno, + score.sno, + score.degree +FROM + score + INNER JOIN course ON score.cno = course.cno + AND score.cno = '3-105' + AND score.degree > ( SELECT max( degree ) FROM score WHERE score.cno = '3-245' ) +ORDER BY + score.degree DESC; + -- 15 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. -select score.cno,score.sno,score.degree from score inner join course on score.cno = course.cno and score.cno = '3-105' and score.degree > (select max(degree) from score where score.cno='3-245'); +SELECT + score.cno, + score.sno, + score.degree +FROM + score + INNER JOIN course ON score.cno = course.cno + AND score.cno = '3-105' + AND score.degree > ( SELECT max( degree ) FROM score WHERE score.cno = '3-245' ); + -- 16 查询成绩比该课程平均成绩低的同学的成绩表。 -select Cno,Sno,Degree from Score where Degree > avg(sum(select Degree from Score where Cno='3-245')); +SELECT + * +FROM + Score a +WHERE + Degree < ( SELECT avg( Degree ) FROM score b WHERE a.Cno = b.Cno ); + -- 17 查询所有任课教师的Tname和Depart. -SELECT tname,depart from teacher; +SELECT + tname, + depart +FROM + teacher; + -- 18 查询所有未讲课的教师的Tname和Depart -select Tname,Depart from Course inner join Score on Course.Cno=Score.Cno right join Teacher on Teacher.Tno=Course.Tno where Score.cno is null; +SELECT + Tname, + Depart +FROM + Teacher + LEFT JOIN Course ON Teacher.Tno = Course.Tno + LEFT JOIN Score ON Course.Cno = Score.Cno +WHERE + Score.Cno IS NULL; + -- 19 查询“男”教师及其所上的课程。 -select tname,cname from teacher left join course on teacher.tno=course.tno where tsex='男'; +SELECT + tname, + cname +FROM + teacher + LEFT JOIN course ON teacher.tno = course.tno +WHERE + tsex = '男'; + -- 20 查询最高分同学的Sno、Cno和Degree列。 -select sno,cno,degree from score where degree=(select max(degree) from score); +SELECT + sno, + cno, + degree +FROM + score +WHERE + degree = ( SELECT max( degree ) FROM score ); + -- 21 查询和“李军”同性别的所有同学的Sname. -select sname from student where ssex=(select ssex from student where sname='李军'); +SELECT + sname +FROM + student +WHERE + ssex = ( SELECT ssex FROM student WHERE sname = '李军' ); + -- 22 查询和“李军”同性别并同班的同学Sname. -select sname from student where ssex=(select ssex from student where sname='李军')and class=(select class from student where sname='李军'); --- 23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 -select score.* from score left join courseon score.cno=course.cno left join studenton score.sno=student.sno where score.cno=(select course.cno from course where cname='计算机导论'); +SELECT + sname +FROM + student +WHERE + ssex = ( SELECT ssex FROM student WHERE sname = '李军' ) + AND class = ( SELECT class FROM student WHERE sname = '李军' ); +-- 23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 +SELECT + score.* +FROM + score + LEFT JOIN courseon score.cno = course.cno + LEFT JOIN studenton score.sno = student.sno +WHERE + score.cno =( + SELECT + course.cno + FROM + course + WHERE + cname = '计算机导论' + ); ```