多表联查首先我们要知道多表联查分几部分?
就三部分...
一对一【1:1】
一对多【1:n】
多对多【n:n】
那怎么理解这三个部分???
很简单...
1.一对一我们可以理解为一个人只有一个身份证,一个身份证可以证明一个人,这两者之间是可以相互成立的...
1.如果两个对象是1对1的关系,则可以建成一张表。
2.如果两个对象是1对1的关系,可以通过1对1主键关联放在两张表中。
2.一对多我们可以理解为一个人可以拥有多辆车,一位老师可以教授多位学生,一个教室有多个学生,一个市有多个地区....但是!!这里有一个注意事项:
如果两张表之间是1对多的关系,则需要通过外键去建立两张表的关系。
3.多对多我们可以理解为一个人可以拥有多辆车,一辆车可以被多个人使用,,这就是多对多,这里也有一个注意事项:
如果两张表的关系是多对多,则必须引入中间表
我们都知道了主键,那在这里就要知道另一个东西叫外键!!!
所谓外键就是为了建立表与表之间的关系,这就叫外键.....
外键是可以重复的,可以为空的。
通常情况下一个表的外键是另外一张表的主键。
基础知识都知道了那就开始多表联查:
在这之前要知道另一个单词
1..."内连接" inner join
翻译:只显示两张表有关联的数据
select 字段名(或者*) from 表1 s inner join 表2 c on 表1和表2的关联条件
什么是表1和表2的关联条件??其实该为代码可以举例是:s.classid=c.id
意思是:表1的classid字段等于表2的id字段
如果这个例子看的云里雾里的,那好换一个真实的例子
查询年龄在18-30之间的女生姓名以及所在的班级名
select s.studentname,c.classname,s.studentage,s.sex from t_student s inner join t_class c
on s.classid=c.id
where s.studentage>=18 and s.studentage<=30 and s.sex=0;
其实就是将多张表的信息结合成一张表输出出来,,,,就是这样...
我们再举一个复杂的例子
查询年龄在18-30之间的姓张的女生姓名以及所在的班级名并且按照年龄进行升序排列
select s.studentname,c.classname,s.studentage,s.sex from t_student s inner join t_class c
on s.classid=c.id
where s.studentage>=18 and s.studentage<=30 and s.sex=0
and s.studentname like '张%'
order by s.studentage asc;
然后我们要学习另一个知识点:
2...左连接 left join
意义:会将左边表的全部数据进行展示,另外一张表有和它关联的就展示,没有就不展示
select 字段名,字段名 from 表1 left join 表2 on 表1和表2的关联条件
上代码例子
select * from t_student left join t_class
on t_class.id=t_student.classid;
在这个代码中t_student在左,t_class在右,那么在执行这段代码后左边的信息全部展示,在右边的信息有关联的就展示出来,没有关联就不展示.....就是这样....
有左就该有右啊!
3...右连接 right join
意义:会将右边表的全部数据进行展示,另外一张表有和它关联的就展示,没有就不展示
那之前不是说了要建立两者之间的中间表吗??中间表怎么建???要新建中间表
create table 中间表表名(
sid number(11),
cid number(11),
score number(3),
constraint 主键名称 primary key(sid,cid)
);
这就是中间表,,当然,,现在的数据是要你自己手动去输入的,,手动输入虚假数据..
那我们开始三表联查吧!!
查询学生名,课程名以及对应的成绩
select s.studentname,c.cname,sc.score from t_student s
left join t_score sc on s.id=sc.sid
left join t_course c on c.id=sc.cid
order by studentName;
之中要注意left join 和select join 一般用left join
其实多表联查和两表联查就多了一段而已....
最后输出的也就是三张表结合成一张表输出而已....
那如何将多表联查的结构进行分页???
select * from (
select t.*,rownum rn from(
select s.studentname,c.cname,sc.score from t_student s
left join t_score sc on s.id=sc.sid
left join t_course c on c.id=sc.cid
order by studentName
) t where rownum<=6
)where rn>4;
即可.....
新手上路,请多关照...
如有错误,评论指出,本人感激不尽..
谢谢...