Oracle/MySQL数据库的表间关联查询_多表关联查询的SQL语句详解

内连接 inner join

内连接又称为等值连接,语法结构:

1 inner join2 on 条件 -- inner可以省略
  1. 表 1 叫做驱动表(参照表/匹配表) , 表 2 叫做被匹配表(被参照表)
  2. 等值连接方式下 , 驱动表和被匹配表位置可以互换 , 不影响结果集
  3. 执行方式:无论谁做驱动表 , 都会遍历驱动表 , 在被匹配表中查找匹配数据,不匹配的数据舍弃

PS.外键所在的表叫子表或者从表,主键所在的表叫父表或者主表,所谓驱动表,就是必须遍历的表

示例

select ename , dname , location
from emp_xxx t1 join dept_xxx t2 --t1 驱动表 , t2 被匹配表
on t1.deptno = t2.deptno ;

上述连接的方式可以称之为“显式内连接”,下面这种方式称之为“隐式内连接”:

select ename, dname, location 
from emp_xxx t1,dept_xxx t2 
where t1.deptno = t2.deptno;

外连接 outer join

left outer join 左外连接

左外连接的语法结构:

1 left outer join2 on 条件 -- outer可以省略

1.左外连接以左边的表为驱动表,并且左边的表的记录必须全部保留,所以左边的表亦称之为保留表。
2.驱动表和被匹配表不能互换

示例

下面的例子中,驱动表:emp_xxx;被匹配表:dept_xxx,结果集中包括有部门的员工和没有部门的员工:

select e.empno , ename , d.deptno , d.dname , d.location
from emp_xxx e left outer join dept_xxx d on e.deptno = d.deptno ;

right outer join 右外连接

右外连接语法结构:

1 right outer join2 on 条件 -- outer可以省略

1.右外连接以右边的表为驱动表,并且右边的表的记录必须全部保留,所以右边的表又称之为保留表
2.驱动表和被匹配表不能互换

示例

下面的语句中,驱动表:emp_xxx;被匹配表:dept_xxx,结果集中包括有部门的员工和没有部门的员工:

select e.empno , ename , d.deptno , d.dname , d.location from dept_xxx d right outer join emp_xxx e
on e.deptno = d.deptno ;

full outer join 全外连接

全外连接语法结构:

1 full outer join2 on 条件

1.全外连接左右两张表互为驱动表和被匹配表,即两张表都会遍历一遍
2.全外连接可以把两个表中的记录全部查出来。左右两张表的记录全部都保留,即两张表都是保留表
3.全外连接的结果集 = 内连接的结果集 + 两张表找不到匹配数据的记录(对应的被匹配表的字段为空值)

示例

select e.empno , e.ename , d.deptno , d.dname
from emp_xxx e full outer join dept_xxx d on e.deptno = d.deptno ;

外连接总结

1.如果驱动表在被匹配表中找不到匹配记录 , 则匹配一行空行
2.外连接的结果集 = 内连接的结果集 + 驱动表在被匹配表中匹配不上的记录(对应被匹配表的字段都是空值)
3.外连接的本质是驱动表中的数据一个都不能少
4.写外连接的习惯:

a.先写内连接

from1 join2 on 条件

b.再确定谁做驱动表,从而决定写 left、right、full
关键是确定谁做驱动表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值