A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mengmatu 初级黑马   /  2018-5-30 12:47  /  886 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多表设计之表关系
一对多关系(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  查询学生生日大于9111日,如果记录存在,前面的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


1 个回复

倒序浏览
占楼!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马