赞
踩
我们在执行数据库查询操作的时候,有时候一张表是完全不能满足我们的需求。所以,我们需要同时从两张表中才能得到我们想要的数据。
当我们获取的数据不是来自于同一张表而是来自于多张表时就需要使用到表连接
所谓的连表查询,就是为了解决上面的需求出现的。
连表的意思就是将两张表连接起来组成一张保存了两张表的数据的新的表,新表并不是真正被保存到数据库中的表,只是逻辑上的表。
查询的意思就是,在这个新表中查询自己想要查询的数据。
连表查询,涉及到了两张表,那么它的效率一定比只从一张表中拿出自己需要的数据要低很多。但是,从现实意义讲,连表查询虽然效率低,但却是我们做项目不可获取的操作。
select 数据 from 数据源1,数据源2...;
在数据路中,连表的默认查询结果就是笛卡尔积。
数据库中的笛卡尔积是说,我们连接的不同的数据源中的数据进行对乘。
也就是说,一个数据量为8的表和一个数据量是5的表,进行连表查询,会得到一个数据量为40的新表。
select * from emp,dept;
定义在where后面,作为一个行过滤条件出现。
所谓的表连接的条件,我们可以理解成是,在笛卡尔积中拿出有效数据:也就是我们需要的数据。
2.4.1.依据连接条件
等值连接就是指where后面的表连接的条件是一行等值语句。
什么是等值语句呢?
等值语句就是比较两个值是否相等。
总结:只要连接条件是比较两个值是否相等,那么就被称为等值连接
- -- 查询员工信息以及所在的部门信息
- -- 数据: 员工信息 部门信息
- -- 来源: 员工表emp 部门表dept
- select * from emp,dept where emp.deptno=dept.deptno;
- select empno,ename,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;
- select empno,ename,e.deptno,dname from emp e,dept d where e.deptno=d.deptno; --别名
- select e.*,dname from emp e,dept d where e.deptno=d.deptno;
非等值连接指的是where后面表连接条件语句是非等值语句
什么是非等值语句?
等值语句是判断两个值是否相等,显而易见,非等值语句就是指并不是通过值的相等来作为判断依据,那么非等值语句是以什么为依据的呢?
我们可以记住一句话,但凡不是等值语句,那就是非等值语句。
- --查询员工信息以及薪资登记信息
- select * from emp e,salgrade s where e.sal between s.losal and s.hisal;
- select * from emp e,salgrade s where e.sal between s.losal and s.hisal and deptno in (10,30);
-
- --查询员工的信息以及所在部门信息以及薪资等级信息
- select e.*, d.dname, s.grade
- from emp e, dept d, salgrade s
- where e.deptno = d.deptno
- and e.sal between s.losal and s.hisal;
2.4.2.依据查询结果中是否显示不满足连接条件的记录
满足条件的才保留,不满足连接条件的不显示。
解释:
我们在查询的时候,那些不满足条件的记录一般我们是不保存到结果集中的
假设,我们要查询有上级的员工的员工信息和该员工的上级的经理人信息
- --查询有上级的员工的员工信息以及这个员工的上级经理人信息
- --数据: 员工信息 , 经理人信息
- --来源: 员工表 emp e1 ,经理人表 emp e2
- select * from emp e1,emp e2 where e1.mgr = e2.empno;
问题:
我们发现,查询结果有11条,而我们的员工表中,共有12条数据;
分析:
出现上述情况的主要原因是:12个员工中,有一个员工king,他没有属于自己的上级员工,因此在查询结果中,不显示king这条信息
疑问:
那么,如果我们不仅想要看到满足条件的记录,也想在结果集中看到不满足条件的记录,我们怎么做?
通过外连接就可以帮助我们做到这一点
在外连接中:主表中的数据不满足连接条件也可以显示
外连接的定义:在连接条件的位置,在主表的对面添加(+)
左外连接|左连接:from后面,主表在左边就是左连接
右外连接|右连接:from后面,主表在右边就是右连接
- --查询所有员工信息以及他的经理人信息
- --主表 : 员工表 emp e1
- select * from emp e1,emp e2 where e1.mgr = e2.empno(+);
外连接简单总结:
1.根据(+)的位置判断哪个是主表
2.根据主表在,的位置来判断是左外连接,还是右外连接
交叉连接 cross join | 笛卡尔积 |
自然连接(主外键、同名列) natural join | 等值连接 |
join using连接(同名列) | 等值连接 |
[inner]join on 连接 | 等值连接 非等值 自连接 (解决一切) 关系列必须区分 |
left|right [outer] join on|using | 外连接 |
full join on|usin | 全连接 满足直接匹配,不满足相互补充null 确保 所有表的记录 都至少出现一次 |
交叉连接,就是92语法中的笛卡尔积。
在99语法中,将笛卡尔积这种特殊的情况专门拿出来变成了一个关键字cross join
select ename from emp cross join dept;
自然连接就是我们的等值连接,但是,自然连接的前提是两个表之间必须有一个同名字段。他会依据同名字段来自动进行表的连接。
不仅如此,对于同名字段,他在结果集中也仅仅会保留一列。
natural join 自动对主外键关联关系同名字段做等值连接,连接条件等可以省略
select ename from emp natural join dept;
注意:在自然连接中使用同名字段不能使用限定词
join就是inner join的简写
内连接inner join和自然连接的结果基本相同,不同点是自然连接必须保证有同字段的出现。
内连接则不然,内连接可以通过using和on来人为的指定连接条件,更为灵活
为什么要使用using?
我们使用内连接的时候,需要我们自己来指定两张表的连接条件,当两张表具有同名列的时候,我们就可以使用using来指定该同名列。让其通过同名列来得到结果集,相当于自然连接。
语法结构:
join ... using(同名字段) 指定使用哪两条字段相等来自动做等值连接
select * from emp e join dept d using(deptno) where deptno = 30;
注意:在join..using中使用同名字段不能使用限定词
为什么要使用on连接?
在join using中,我们的using后面的内容是同名列,那么,如果我们没有同名列的两张表需要怎么进行连接呢?我们此时就可以通过on来指定连接条件。
语法结构:
数据源1 join 数据源2 on 连接条件
select * from emp e join dept d on e.deptno = d.deptno;
注意:
在join on连接中,我们可以实现等值连接,也可以实现非等值连接。
在92语法中,外连接的主表是需要通过(+)以及表依据,所处位置来进行判断的,但是在99语法中,我们就可以直接通过关键字来进行指定即可
所谓主表,就是外连接结果中展示的为满足条件记录的依据。
什么意思呢?
外连接是为了将未满足条件的记录也在结果中展示,但是这会涉及到一个问题,那就是这些未满足条件的记录是以什么为基础的,主表就是用来确定这个的
左外连接中,主表在左边
select * from emp e1 left join emp e2 on e1.mgr = e2.empno;
右外连接中,主表在右边
select * from emp e1 right join emp e2 on e1.mgr = e2.empno;
所谓的全连接就是把两张表都作为主表。
select * from emp e1 full join emp e2 on e1.mgr = e2.empno;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。