目录
内连接实现效果
使用左外连接,将所有的员工信息都显示出来,即便他没有对应的部门
使用右外连接,将所有的部门信息都显示出来
查询每个员工的编号、姓名、职位,以及所在各部门的领导姓名、领导职位
确定所需要的数据表
确定已知的关联字段
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
实际上对两张数据表进行多表查询时,消除笛卡尔积主要依靠连接模式处理,而对于表的连接模式,在数据库定义上有两种
● 内连接:之前都利用 where子句消除了笛卡尔积,这就属于内连接,只有满足条件的数据才会显示。
● 外连接:分为 3 种,左外连接、右外连接、全外连接
为了更好地观察连接的区别,在 dept 表中提供了一个没有员工的部门(40 部门) ,同时在 emp 表 中增加一个没有部门的员工
insert into emp(empno,ename,deptno) values(8989,'HELLO',null);
insert语句是向数据表中插入记录,在后面将重点介绍
大家执行之后会发现多了一行数据
新增的记录 deptno 字段没有部门编号
内连接实现效果
SQL> select e.empno,e.ename,d.deptno,d.dname2 from emp e,dept d3 where e.deptno=d.deptno;EMPNO ENAME DEPTNO DNAME
---------- -------------------- ---------- ----------------------------7839 KING 10 ACCOUNTING7782 CLARK 10 ACCOUNTING7934 MILLER 10 ACCOUNTING7902 FORD 20 RESEARCH7369 SMITH 20 RESEARCH7566 JONES 20 RESEARCH7900 JAMES 30 SALES7844 TURNER 30 SALES7654 MARTIN 30 SALES7521 WARD 30 SALES7499 ALLEN 30 SALES
此时,没有部门的员工以及没有员工的部门信息都没有出现,因为nul 的判断不满足
使用左外连接,将所有的员工信息都显示出来,即便他没有对应的部门
SQL> select e.empno,e.ename,d.deptno,d.dname2 from emp e,dept d3 where e.deptno=d.deptno(+);EMPNO ENAME DEPTNO DNAME
---------- -------------------- ---------- ----------------------------7782 CLARK 10 ACCOUNTING7839 KING 10 ACCOUNTING7934 MILLER 10 ACCOUNTING7369 SMITH 20 RESEARCH7566 JONES 20 RESEARCH7902 FORD 20 RESEARCH7499 ALLEN 30 SALES7521 WARD 30 SALES7654 MARTIN 30 SALES7698 BLAKE 30 SALES7844 TURNER 30 SALES7900 JAMES 30 SALES8989 HELLO
此时没有部门的员工出现了,也就是说左表的数据全部显示了
使用右外连接,将所有的部门信息都显示出来
SQL> select e.empno,e.ename,d.deptno,d.dname2 from emp e,dept d3 where e.deptno(+)=d.deptno;EMPNO ENAME DEPTNO DNAME
---------- -------------------- ---------- ----------------------------7839 KING 10 ACCOUNTING7782 CLARK 10 ACCOUNTING7934 MILLER 10 ACCOUNTING7902 FORD 20 RESEARCH7369 SMITH 20 RESEARCH7566 JONES 20 RESEARCH7900 JAMES 30 SALES7844 TURNER 30 SALES7654 MARTIN 30 SALES7521 WARD 30 SALES7499 ALLEN 30 SALES7698 BLAKE 30 SALES40 OPERATIONS
此时没有员工的部门出现了,也就是说右表的数据全部显示了
通过这几个范例可以看出,内连接指的是所有满足关联条件的数据出现,不满足的不出现。外连接是指定一张数据表中的全部内容都显示,但是没有对应的其他表数据,内容为 null
在 Oracle 里面使用“(+)”来控制连接方式
● 左外连接:关联字段 1= 关联字段 2(+)
● 右外连接:关联字段 1(+)= 关联字段 2
一般都只考虑内连接,但是当你发现所需要的数据不全的时候就可以考虑外连接。现在再来看一个范例,从而加深对外连接的认识
查询每个员工的编号、姓名、职位,以及所在各部门的领导姓名、领导职位
确定所需要的数据表
emp 表(员工信息) :编号、姓名、职位
memp 表(领导信息) :领导姓名、领导职位
确定已知的关联字段
员工和领导: emp.mgr=memp.empno。
第一步:查询出每个员工的编号、姓名、职位
SQL> select e.empno,e.ename,e.job2 from emp e;EMPNO ENAME JOB
---------- -------------------- ------------------7369 SMITH CLERK7499 ALLEN SALESMAN7521 WARD SALESMAN7566 JONES MANAGER7654 MARTIN SALESMAN7698 BLAKE MANAGER7782 CLARK MANAGER7839 KING PRESIDENT7844 TURNER SALESMAN7900 JAMES CLERK7902 FORD ANALYST7934 MILLER CLERK8989 HELLO
此时只显示数据表 emp 中每个员工的编号、姓名和职位
第二步:加入领导信息,需要引入自身关联,而后消除笛卡尔积
SQL> select e.empno,e.ename,e.job,m.ename,m.job2 from emp e,emp m3 where e.mgr=m.empno;EMPNO ENAME JOB ENAME JOB
---------- -------------------- ------------------ -------------------- ------------------7902 FORD ANALYST JONES MANAGER7499 ALLEN SALESMAN BLAKE MANAGER7521 WARD SALESMAN BLAKE MANAGER7654 MARTIN SALESMAN BLAKE MANAGER7844 TURNER SALESMAN BLAKE MANAGER7900 JAMES CLERK BLAKE MANAGER7934 MILLER CLERK CLARK MANAGER7566 JONES MANAGER KING PRESIDENT7698 BLAKE MANAGER KING PRESIDENT7782 CLARK MANAGER KING PRESIDENT7369 SMITH CLERK FORD ANALYST
第三步:发现 emp 表(员工信息)数据不完整,因为不满足于等值关联判断,所以要想让员工信息显示完整,则必须使用外连接控制
SQL> select e.empno,e.ename,e.job,m.ename,m.job2 from emp e,emp m3 where e.mgr=m.empno(+);EMPNO ENAME JOB ENAME JOB
---------- -------------------- ------------------ -------------------- ------------------7902 FORD ANALYST JONES MANAGER7499 ALLEN SALESMAN BLAKE MANAGER7521 WARD SALESMAN BLAKE MANAGER7654 MARTIN SALESMAN BLAKE MANAGER7844 TURNER SALESMAN BLAKE MANAGER7900 JAMES CLERK BLAKE MANAGER7934 MILLER CLERK CLARK MANAGER7566 JONES MANAGER KING PRESIDENT7698 BLAKE MANAGER KING PRESIDENT7782 CLARK MANAGER KING PRESIDENT7369 SMITH CLERK FORD ANALYST7839 KING PRESIDENT8989 HELLO
此时使用了左外连接“e.mgr=m.empno(+)” ,得到了想要的结果