外连接查询
特点:查询结果至少是一个表的所有记录
语法:select f1,f2,f3,....
from table1 left/right outer join table2
on 条件;
(1)左外连接
from table1 left outer join table2
驱动表 table1
匹配表 table2
查询结果是table1驱动表的所有记录
回顾:查询每个员工的姓名,职位和领导的姓名
使用内连接(自连接)的连接方式
分析:
表 t_employee e 员工表
t_employee m 领导表
关联条件 员工表.领导编号=领导表.员工编号
e.MGR=m.empno
select e.ename,e.job,m.ename
from t_employee e inner join t_employee m
on e.MGR=m.empno;
查询结果是13条数据,少了一条king的数据,king没有
上级领导,所以king这条数据没有显出出来。
内连接查询的特点:符合条件查询出来,不符合条件过滤掉。
使用左外连接查询
分析:
驱动表 t_employee e 员工表
匹配表 t_employee m 领导表
关联条件 e.MGR=m.empno
select e.ename,e.job,m.ename
from t_employee e left outer join t_employee m
on e.MGR=m.empno;
查询结果为14条数据,t_employee e员工表为驱动表,
查询结果显示驱动表中所有的数据。
t_employee员工表插入一条在50部门的员工信息。
在t_dept表中只有10,20,30,40部门,没有50部门。
insert into t_employee values
(7999,'xiaohong','clerk',7782,19811016,5200,null,50);
说明:
t_employee 员工表
15条数据,员工分别在10,20,30,50部门
t_dept 部门表
4条数据,有10,20,30,40部门
例子:查询每个员工的编号、姓名、职位、部门名称和位置
方式1:使用内连接查询的方式
分析:表 t_employee e 员工表
t_dept d 部门表
关联关系 员工表的部门编号=部门表的部门编号
e.deptno=d.deptno
select e.empno,e.ename,e.job,d.dname,d.loc
from t_employee e inner join t_dept d
on e.deptno=d.deptno;
查询结果是14条数据,内连接查询的特点是符合条件的
会查询出结果,不符合条件的会过滤掉。
xiaohong是50部门,在部门表中未匹配到50部门,过滤掉
operations是40部门,未匹配到有员工在40部门,过滤掉
方式2:使用左外连接查询的方式
分析:驱动表 t_employee e 员工表
匹配表 t_dept d 部门表
关联关系 e.deptno=d.deptno
查询的结果是驱动表中的所有数据
select e.empno,e.ename,e.job,d.dname,d.loc
from t_employee e left outer join t_dept d
on e.deptno=d.deptno;
查询结果是15条数据,查询结果是驱动表t_employee表中的全部数据,外连接查询的特点是符合关联条件的正常显示数据,如果不符合关联条件,查询不到数据,会使用null代替。
(2)右外连接
from table1 right outer join table2
驱动表 table2
匹配表 table1
查询结果是table2驱动表的所有记录
使用右外连接的方式
分析:
驱动表 t_dept d 部门表
匹配表 t_employee e 员工表
关联关系 d.deptno=e.deptno
select e.empno,e.ename,d.deptno,d.dname,d.loc
from t_employee e right outer join t_dept d
on e.deptno=d.deptno;
显示结果是15条数据,显示的结果是部门表的全部数据,部门表是4条数据,显示结果是15条,因为有的部门匹配到了多名员工的数据。
10部门20部门30部门都匹配到了多名员工的信息,40部门没有匹配到员工的信息,用null代替。