标题: [成都校区]多表学习笔记 [打印本页] 作者: mengmatu 时间: 2018-5-30 12:47 标题: [成都校区]多表学习笔记 多表设计之表关系 一对多关系(1-N)
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/f9b31a3620824a7497a3f30b156f7198/clipboard.png 多对多关系(N-N)
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/9fd02817e46644ee9bb3090e72e9a375/clipboard.png 一对一关系(1-1)
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/f7413b833553461cb82999bf8117a39e/clipboard.png 多表设计之多表分析及创建 需求:完成一个学校的选课系统,在选课系统中包含班级,学生和课程这些实体 分析: 班级--学生 1--N 学生--课程 N--N
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/83f2bf7a562341fe8fafd5a0a70e2062/ip_image002.jpeg 多表查询的分类 链接查询 交叉连接:cross join 语法: select * from 表1 cross join 表2; select * from 表1,表二; 内连接:inner join(inner 可以省略) 隐示内连接:在SQL中没有调用inner join关键字 select * from 表1,表二 where 关联条件 and 其他条件 显示内连接:在SQL中显示的调用inner join关键字 select * from 表1 inner join 表二 on 关联条件 where 其他条件 外连接: outer join(outer 可以省略) 左外连接 语法:select * from 表1 left outer join 表2 on 关联条件 右外连接 语法:select * from 表1 right outer join 表2 on 关联条件 子查询 子查询:一个查询语句条件需要以来另一个查询语句的结果 带in的子查询
l 查询学生生日在91年之后的班级的信息。
select * from classes where cid in (SELECT cno FROM student WHERE birthday > '1991-01-01');
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/b5dd98571e8b4045a4383314ef9769fa/lip_image001.png 带exists的子查询
l 查询学生生日大于91年1月1日,如果记录存在,前面的SQL语句就会执行
select * from classes where exists (SELECT cno FROM student WHERE birthday > '1991-01-01');
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/b1762d7d4972424cb563bdc9cdfcf554/lip_image002.png 带any的子查询
SELECT * FROM classes WHERE cid > ANY (SELECT cno FROM student )
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/9fd6f2fe10654c898ce7293cba0058e4/lip_image003.png 带all的子查询
SELECT * FROM classes WHERE cid > ALL (SELECT cno FROM student)
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/b9f47d1a5c484ee2afbcf13a66c8b41d/lip_image004.png 注意:> any 大于 最小的 <any 小于最大的 <all 小于最小 >all 大于最大的 内连接与外连接的区别
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/1d92f602be6147959082720e6b111a51/clipboard.png 多表查询之练习 多表查询的练习
l 查询班级名称,和班级总人数
SELECT c.cname,COUNT(*) FROM classes c,student s WHERE c.cid = s.cno GROUP BY c.cname;
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/b5dd98571e8b4045a4383314ef9769fa/lip_image001.png
l 查询学生的姓名和学生所选的总课程平均成绩。
select s.sname,avg(sc.score) from student s,stu_cour sc where s.sid = sc.sno group by s.sname;
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/b1762d7d4972424cb563bdc9cdfcf554/lip_image002.png
l 查询学生的姓名和学生的选课总数,显示选课超过2门学生姓名。
select s.sname,count(*) from student s,stu_cour sc where s.sid = sc.sno group by s.sname having count(*) > 2;
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/9fd6f2fe10654c898ce7293cba0058e4/lip_image003.png
l 查询平均成绩大于80分的学生的总数。
select count(*) from student s where s.sid in (SELECT sc.sno FROM stu_cour sc GROUP BY sc.sno HAVING AVG(sc.score) > 80);
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/b9f47d1a5c484ee2afbcf13a66c8b41d/lip_image004.png
l 查询学生和平均成绩,但是平均成绩大于01班的任何一个学生的平均成绩。
select s.sname,avg(sc.score) from student s,stu_cour sc where s.sid = sc.sno group by s.sname having avg(sc.score) > any(SELECT AVG(sc.score) FROM student s,stu_cour sc,classes c WHERE s.sid = sc.sno AND s.cno = c.cid AND c.cname= '01班' GROUP BY s.sname);
D:/%E5%AD%A6%E4%B9%A0%E8%BD%AF%E4%BB%B6/Youdao/YoudaoNoteData/m15183310120@163.com/29d8b37825b14a7a929099dd23f9e0da/lip_image005.png