diff --git "a/27 \346\236\227\351\235\222\350\214\271/20230228 \345\205\263\350\201\224\346\237\245\350\257\242.md" "b/27 \346\236\227\351\235\222\350\214\271/20230228 \345\205\263\350\201\224\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..471064a2645f894d28187a49f6fa1a7ad171e56c --- /dev/null +++ "b/27 \346\236\227\351\235\222\350\214\271/20230228 \345\205\263\350\201\224\346\237\245\350\257\242.md" @@ -0,0 +1,319 @@ +# 笔记 + + + +# 作业 + +1. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 + +```sql + create database school charset utf8; + use school ; + drop database school; +``` + +- 2. 数据库的表结构 + -- 表(一)Student (学生表) + -- 属性名 数据类型 可否为空 含义 + -- Sno varchar (20) 否 学号(主码) + -- Sname varchar (20) 否 学生姓名 + -- Ssex varchar (20) 否 学生性别 + -- Sbirthday datetime 可 学生出生年月 + -- Class varchar (20) 可 学生所在班级 + +```sql +create table Student( + Sno varchar (20) not null primary key, #学号(主码) + Sname varchar (20) not null, #学生姓名 + Ssex varchar (20) not null, #学生性别 + Sbirthday datetime, #学生出生年月 + Class varchar (20) #学生所在班级 +); +``` + +- 表(二)Course(课程表) + -- 属性名 数据类型 可否为空 含义 + -- Cno varchar (20) 否 课程号(主码) + -- Cname varchar (20) 否 课程名称 + -- Tno varchar (20) 否 教工编号(外码) + +```sql +CREATE TABLE Course ( + Cno varchar(20) NOT NULL primary key, #课程号(主码) + Cname varchar(20) NOT NULL, #课程名称 + Tno varchar(20) NOT NULL, #教工编号(外码) + foreign key(Tno) references Teacher(Tno) +); +``` + +- 表(三)Score(成绩表) + -- 属性名 数据类型 可否为空 含义 + -- Sno varchar (20) 否 + -- Cno varchar (20) 否 + -- Degree Decimal(4,1) 可 + -- 主码:Sno+ Cno + +```sql +create table Score( + Sno varchar (20) not null,#学号(外码) + Cno varchar (20) not null,#课程号(外码) + Degree Decimal(4,1),#成绩 + foreign key(Sno) references Student(Sno), + foreign key(Cno) references Course(Cno) +); +``` + +- 表(四)Teacher(教师表) + -- 属性名 数据类型 可否为空 含义 + -- Tno varchar (20) 否 + -- Tname varchar (20) 否 + -- Tsex varchar (20) 否 + -- Tbirthday datetime 可 + -- Prof varchar (20) 可 + -- Depart varchar (20) 否 + +```sql +create table Teacher( + Tno varchar (20) not null primary key ,#教工编号(主码) + Tname varchar (20) not null ,#教工姓名 + Tsex varchar (20) not null ,#教工性别 + Tbirthday datetime,#教工出生年月 + Prof varchar (20),#职称 + Depart varchar (20) #教工所在部门 +); +``` + +- 3. 数据库中的数据: + +-- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ + +```sql + # 不会写 +``` + +-- 2,查询没有学生的教师的所有信息 + +```sql +#不会写 +``` + +- 表(一)Student + -- Sno Sname Ssex Sbirthday class + -- 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 + +```sql +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 + +```sql +insert into Course values + ('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 + +```sql +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 助教 电子工程系 + +```sql +insert into Teacher values + ('804','李诚','男','1958-12-2','副教授','计算机系'), + ('856','张旭','男','1969-3-12','讲师','电子工程系'), + ('825','王萍','女','1972-5-5','助教','计算机系'), + ('831','刘冰','女','1977-8-14','助教','电子工程系'); +``` + +4. 查询 + + -- ① 查询Score表中的最高分的学生学号和课程号。Sno,Cno + +```sql +select Sno,Cno from Score where Degree=(select max(Degree)from Score); +``` + +-- ② 查询所有学生的Sname、Cno和Degree列。 + +```sql +select Sname,Cno,Degree from Student inner join Score on student.sno=score.sno; +``` + +-- ③ 查询所有学生的Sno、Cname和Degree列。 + +```sql +select Sno,Cname,Degree from Score inner join course on score.cno=course.cno; +``` + +-- ④ 查询所有学生的Sname、Cname和Degree列。 + +```sql +select sname,cname,degree from student inner join score on student.sno=score.sno inner join course on score.cno=course.cno; +``` + +-- ⑤ 查询“95033”班学生的平均分。 + +```sql +select avg(score.Degree) from score inner join student on student.Sno = score.Sno where student.Class = '95033'; +``` + +-- ⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 + +```sql +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' ); +``` + +-- ⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 + +```sql +#不会写 +``` + +-- ⑧ 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 + +```sql +select * from score where degree>(select degree from score where score.sno=109 and score.cno='3-105'); +``` + +-- ⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 + +```sql +select sno,sname,sbirthday from student where sbirthday=(select sbirthday from student where sno=108); +``` + +-- ⑩ 查询“张旭“教师任课的学生成绩。 + +```sql +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='张旭'); +``` + +-- 11 查询选修某课程的同学人数多于5人的教师姓名。 + +```sql +#不会写 +``` + +-- 12 查询出“计算机系“教师所教课程的成绩表。 + +```sql +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。 + +```sql +select tname,prof from teacher where prof in (select distinct prof from teacher); +``` + +-- 14 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 + +```sql +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. + +```sql +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 查询成绩比该课程平均成绩低的同学的成绩表。 + +```sql +#不会写 +``` + +-- 17 查询所有任课教师的Tname和Depart. + +```sql +#不会写 +``` + +-- 18 查询所有未讲课的教师的Tname和Depart. + +```sql +#不会写 +``` + +-- 19 查询“男”教师及其所上的课程。 + +```sql +select tname,cname from teacher left join course on teacher.tno=course.tno where tsex='男'; +``` + +-- 20 查询最高分同学的Sno、Cno和Degree列。 + +```sql +select sno,cno,degree from score where degree=(select max(degree) from score); +``` + +-- 21 查询和“李军”同性别的所有同学的Sname. + +```sql +select sname from student where ssex=(select ssex from student where sname='李军'); +``` + +-- 22 查询和“李军”同性别并同班的同学Sname. + +```sql +select sname from student where ssex=(select ssex from student where sname='李军')and class=(select class from student where sname='李军'); +``` + +-- 23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 + +```sql +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='计算机导论'); +``` +