diff --git "a/17 \350\221\243\345\272\206\345\274\272/20230228\346\237\245\350\257\242.md" "b/17 \350\221\243\345\272\206\345\274\272/20230228\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..bf577230bf9c9830edcbd78bff735e94d9d9f82c --- /dev/null +++ "b/17 \350\221\243\345\272\206\345\274\272/20230228\346\237\245\350\257\242.md" @@ -0,0 +1,174 @@ +## 笔记 + +```sql +关联查询:两个或更多个表一起查询。 +又称为联合查询,多表查询。 + +1、关联查询的结果一共有7种: +两个表的记录分为四种: +①A表中的记录能在B表中找到对应的记录 +②A表中的记录在B表中找不到对应的记录 +③B表中的记录可以在A表找到对应的记录 +④B表中的记录在A表中找不到对应的记录 + +(1)A∩B ①③ +(2)A ①② +(3)A-A∩B ② +(4)B ③④ +(5)B-A∩B ④ +(6)A∪B ①②③④ +(7)A∪B-A∩B ②④ + +2、两个表要一起查询,要有前提条件:有关联 +就是有相同逻辑意义和数据类型的字段。 + +3、如何实现7种查询结果 +(1)内连接 inner join +(2)外连接 outer join +左外连接 left outer join 或 left join +右外连接 right outer join 或 right join +全外连接 full outer join 或 full join -- union 代替 + +但是,mysql不支持全外连接,没有full join。 +mysql使用union关键字合并其他的查询结果实现全外连接的效果。 + +内连接 ==> A∩B +左连接 ==> A 或 A-A∩B +右连接 ==> B 或 B-A∩B +全外连接 ==> A∪B 或 A∪B - A∩B + 左连接的A union 右连接的B 得到 A∪B + 左连接的A-A∩B union 右连接B-A∩B 得到 A∪B - A∩B + +4、内连接 inner join +A表 inner join B表 on 关联条件 +*/ + +``` + +## 作业 + +```sql +CREATE database ku charset utf8; +USE ku; +CREATE table Student( +Sno varchar (20) primary key, +Sname varchar (20) NOT NULL, +Ssex varchar (20) NOT NULL, +Sbirthday datetime, +Class varchar (20) +); +DROP TABLE Student; +#foreign key +#foreign key (从表的某个字段) references 主表名(被参考字段) +CREATE table Course( +Cno varchar (20) PRIMARY key, +Cname varchar (20) not null, +Tno varchar (20) not null, +foreign key (Tno) references Teacher(Tno) +); +drop table Course; +CREATE table Score( +Sno varchar (20), +Cno varchar (20), +Degree Decimal(4,1), +PRIMARY key(Sno,Cno), +foreign key (Sno) REFERENCES Student(Sno), +foreign key (Cno) REFERENCES Course(Cno) +); + drop table Score; +CREATE table Teacher( +Tno varchar (20) PRIMARY key, +Tname varchar (20), +Tsex varchar (20), +Tbirthday datetime, +Prof varchar (20), +Depart varchar (20) +); +drop TABLE Teacher; +``` + +```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'); + +insert into Course VALUES ('3-105','计算机导论','825'), +('3-245','操作系统','804'), +('6-166','数字电路','856'), +('9-888','高等数学','831'); +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 Teacher values + ('804','李诚','男','1958-12-2','副教授','计算机系'), + ('856','张旭','男','1969-3-12','讲师','电子工程系'), + ('825','王萍','女','1972-5-5','助教','计算机系'), + ('831','刘冰','女','1977-8-14','助教','电子工程系'); + + +``` + +```sql +#① 查询Score表中的最高分的学生学号和课程号 +SELECT max(Degree) from Score; +#② 查询所有学生的Sname、Cno和Degree列。 +select Sname,Cno,Degree from student inner join score on score.Sno=student.Sno; +#③ 查询所有学生的Sno、Cname和Degree列。 +select Sno,Cname,Degree from Score inner join Course on Course.Cno=Score.Cno; +#④ 查询所有学生的Sname、Cname和Degree列。 +SELECT Sname,Cname,Degree from Score right join Course on Score.Cno=Course.Cno right join Student on Score.Sno=Student.Sno; +#⑤ 查询“95033”班学生的平均分。 +select avg(Degree) from Student inner join Score on Score.Sno=Student.Sno where Class='95033'; +#⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 +select Degree,Cno,Student.Sno from Student inner join Score on Score.Sno=Student.Sno where Cno='3-105' and Degree>72; +#⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 +SELECT Cname,Degree from Course left join Score on Score.Cno=Course.Cno where Degree<(select max(Degree) from Score); +#⑧ 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 +select Sno,Degree from Score where Degree>76; +#⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 +select Sno,Sname,Sbirthday from Student where Sno='108'; +#⑩ 查询“张旭“教师任课的学生成绩。 +SELECT Tname,Degree,Cname from Course inner join Score on Course.Cno=Score.Cno right join Teacher on Teacher.Tno=Course.Tno where Tname='张旭'; + +#⑪ 查询选修某课程的同学人数多于5人的教师姓名。 +select Tname from Course inner join Score on Course.Cno=Score.Cno inner join Teacher on Teacher.Tno=Course.Tno having count(Score.Cno)>5; +#⑫ 查询出“计算机系“教师所教课程的成绩表。 +select Tname,Degree from Course inner join Score on Course.Cno=Score.Cno right join Teacher on Teacher.Tno=Course.Tno where Tname='李诚' or Tname='王萍'; +#⑬ 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 +select Tname,Prof,Depart from Teacher ; +#⑭ 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 +select Degree,Cno,Student.Sno from Student inner join Score on Score.Sno=Student.Sno where Cno='3-105' and Degree>72 order by Degree desc; +#⑮ 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. +select Degree,Cno,Student.Sno from Student inner join Score on Score.Sno=Student.Sno where Cno='3-105' and Degree>72; +#⑯ 查询成绩比该课程平均成绩低的同学的成绩表。 +select Sname,Degree from Student right join Score on Student.Sno=Score.Sno where Degree<(select avg(Degree) from Score); +#查询所有任课教师的Tname和Depart. +select Tname,Depart from Course inner join Score on Course.Cno=Score.Cno right join Teacher on Teacher.Tno=Course.Tno where Degree is not null; +#查询所有未讲课的教师的Tname和Depart. +select Tname,Depart from Course inner join Score on Course.Cno=Score.Cno right join Teacher on Teacher.Tno=Course.Tno where Degree is null; +#查询“男”教师及其所上的课程。 +select Tname,Tsex,Cname from Teacher inner join Course on Course.Tno=Course.Tno where Tsex='男'; +#查询最高分同学的Sno、Cno和Degree列。 +select Sname,Degree,Cno,Student.Sno from Student inner join Score on Student.Sno=Score.Sno where Degree=(select max(Degree) from Score); +#查询和“李军”同性别的所有同学的Sname. +select Sname,Ssex from Student where Ssex='男'; +#查询和“李军”同性别并同班的同学Sname. +select Sname,Class from Student where Ssex='男' and class='95033'; +#查询所有选修“计算机导论”课程的“男”同学的成绩表。 +select Cname,Ssex from Course inner join Score on Course.Cno=Score.Cno inner join Student on Student.Sno=Score.Sno where Cname='计算机导论' and Ssex='男'; + + +```