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" new file mode 100644 index 0000000000000000000000000000000000000000..a3dc9bbe98867b0555daf6cb57f619baa687bfd4 --- /dev/null +++ "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" @@ -0,0 +1,272 @@ +# 1.笔记 + +## 多表查询 + +### 多表关系 + +- 一对多(多对一) +- 多对多 +- 一对一 + +#### 一对多 + +案例:部门与员工 +关系:一个部门对应多个员工,一个员工对应一个部门 +实现:在多的一方建立外键,指向一的一方的主键 + +#### 多对多 + +案例:学生与课程 +关系:一个学生可以选多门课程,一门课程也可以供多个学生选修 +实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键 + +#### 一对一 + +案例:用户与用户详情 +关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率 +实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE) + +### 内连接查询 + +内连接查询的是两张表交集的部分 + +### 外连接查询 + +左外连接: +查询左表所有数据,以及两张表交集部分数据 + +```mysql +SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...; +``` + +相当于查询表1的所有数据,包含表1和表2交集部分数据 + +右外连接: +查询右表所有数据,以及两张表交集部分数据 + +```mysql +SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...; +``` + +### 联合查询 union, union all + +把多次查询的结果合并,形成一个新的查询集 + +语法: + +```mysql +SELECT 字段列表 FROM 表A ...UNION [ALL]SELECT 字段列表 FROM 表B ... +``` + +#### 注意事项 + +- UNION ALL 会有重复结果,UNION 不会 + +# 2.作业 + +```mysql +-- 1. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 +-- +create database demo charset utf8; +-- 2. **数据库的表结构** +use demo; +-- 表(一)Student (学生表) +-- +-- | 属性名 | 数据类型 | 可否为空 | 含义 | +-- | --------- | ------------ | -------- | ------------ | +-- | Sno | varchar (20) | 否 | 学号(主码) | +-- | Sname | varchar (20) | 否 | 学生姓名 | +-- | 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'学生所在班级' +); +-- 表(二)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) +); +-- 表(三)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) +); +-- 表(四)Teacher(教师表) +-- +-- | 属性名 | 数据类型 | 可否为空 | 含义 | +-- | --------- | ------------ | -------- | ---------------- | +-- | Tno | varchar (20) | 否 | 教工编号(主码) | +-- | Tname | varchar (20) | 否 | 教工姓名 | +-- | Tsex | varchar (20) | 否 | 教工性别 | +-- | 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'教工所在部门' +); +-- +-- +-- +-- +-- 表(一)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 | +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'); +-- 表(三)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 | +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','助教','电子工程系'); +-- 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; +-- -- 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; +-- 4. 查询 +-- +-- ① 查询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; +-- ③ 查询所有学生的Sno、Cname和Degree列。 +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; +-- ⑤ 查询“95033”班学生的平均分。 +select avg(score.Degree) from score inner join student on student.Sno = score.Sno where student.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' ); +-- ⑦ 查询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); +-- ⑧ 查询成绩高于学号为“109”、课程号为“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 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人的教师姓名。 +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='计算机系'; +-- 13 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 +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; +-- 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'); +-- 16 查询成绩比该课程平均成绩低的同学的成绩表。 +select Cno,Sno,Degree from Score where Degree > avg(sum(select Degree from Score where Cno='3-245')); +-- 17 查询所有任课教师的Tname和Depart. +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; +-- 19 查询“男”教师及其所上的课程。 +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); +-- 21 查询和“李军”同性别的所有同学的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='计算机导论'); + +``` +