目录
内连接实现效果
使用左外连接,将所有的员工信息都显示出来,即便他没有对应的部门
使用右外连接,将所有的部门信息都显示出来
查询每个员工的编号、姓名、职位,以及所在各部门的领导姓名、领导职位
确定所需要的数据表
确定已知的关联字段
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.dname
2 from emp e,dept d
3 where e.deptno=d.deptno;
EMPNO ENAME DEPTNO DNAME
---------- -------------------- ---------- ----------------------------
7839 KING 10 ACCOUNTING
7782 CLARK 10 ACCOUNTING
7934 MILLER 10 ACCOUNTING
7902 FORD 20 RESEARCH
7369 SMITH 20 RESEARCH
7566 JONES 20 RESEARCH
7900 JAMES 30 SALES
7844 TURNER 30 SALES
7654 MARTIN 30 SALES
7521 WARD 30 SALES
7499 ALLEN 30 SALES
此时,没有部门的员工以及没有员工的部门信息都没有出现,因为nul 的判断不满足
使用左外连接,将所有的员工信息都显示出来,即便他没有对应的部门
SQL> select e.empno,e.ename,d.deptno,d.dname
2 from emp e,dept d
3 where e.deptno=d.deptno(+);
EMPNO ENAME DEPTNO DNAME
---------- -------------------- ---------- ----------------------------
7782 CLARK 10 ACCOUNTING
7839 KING 10 ACCOUNTING
7934 MILLER 10 ACCOUNTING
7369 SMITH 20 RESEARCH
7566 JONES 20 RESEARCH
7902 FORD 20 RESEARCH
7499 ALLEN 30 SALES
7521 WARD 30 SALES
7654 MARTIN 30 SALES
7698 BLAKE 30 SALES
7844 TURNER 30 SALES
7900 JAMES 30 SALES
8989 HELLO
此时没有部门的员工出现了,也就是说左表的数据全部显示了
使用右外连接,将所有的部门信息都显示出来
SQL> select e.empno,e.ename,d.deptno,d.dname
2 from emp e,dept d
3 where e.deptno(+)=d.deptno;
EMPNO ENAME DEPTNO DNAME
---------- -------------------- ---------- ----------------------------
7839 KING 10 ACCOUNTING
7782 CLARK 10 ACCOUNTING
7934 MILLER 10 ACCOUNTING
7902 FORD 20 RESEARCH
7369 SMITH 20 RESEARCH
7566 JONES 20 RESEARCH
7900 JAMES 30 SALES
7844 TURNER 30 SALES
7654 MARTIN 30 SALES
7521 WARD 30 SALES
7499 ALLEN 30 SALES
7698 BLAKE 30 SALES
40 OPERATIONS
此时没有员工的部门出现了,也就是说右表的数据全部显示了
通过这几个范例可以看出,内连接指的是所有满足关联条件的数据出现,不满足的不出现。外连接是指定一张数据表中的全部内容都显示,但是没有对应的其他表数据,内容为 null
在 Oracle 里面使用“(+)”来控制连接方式
● 左外连接:关联字段 1= 关联字段 2(+)
● 右外连接:关联字段 1(+)= 关联字段 2
一般都只考虑内连接,但是当你发现所需要的数据不全的时候就可以考虑外连接。现在再来看一个范例,从而加深对外连接的认识
查询每个员工的编号、姓名、职位,以及所在各部门的领导姓名、领导职位
确定所需要的数据表
emp 表(员工信息) :编号、姓名、职位
memp 表(领导信息) :领导姓名、领导职位
确定已知的关联字段
员工和领导: emp.mgr=memp.empno。
第一步:查询出每个员工的编号、姓名、职位
SQL> select e.empno,e.ename,e.job
2 from emp e;
EMPNO ENAME JOB
---------- -------------------- ------------------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7566 JONES MANAGER
7654 MARTIN SALESMAN
7698 BLAKE MANAGER
7782 CLARK MANAGER
7839 KING PRESIDENT
7844 TURNER SALESMAN
7900 JAMES CLERK
7902 FORD ANALYST
7934 MILLER CLERK
8989 HELLO
此时只显示数据表 emp 中每个员工的编号、姓名和职位
第二步:加入领导信息,需要引入自身关联,而后消除笛卡尔积
SQL> select e.empno,e.ename,e.job,m.ename,m.job
2 from emp e,emp m
3 where e.mgr=m.empno;
EMPNO ENAME JOB ENAME JOB
---------- -------------------- ------------------ -------------------- ------------------
7902 FORD ANALYST JONES MANAGER
7499 ALLEN SALESMAN BLAKE MANAGER
7521 WARD SALESMAN BLAKE MANAGER
7654 MARTIN SALESMAN BLAKE MANAGER
7844 TURNER SALESMAN BLAKE MANAGER
7900 JAMES CLERK BLAKE MANAGER
7934 MILLER CLERK CLARK MANAGER
7566 JONES MANAGER KING PRESIDENT
7698 BLAKE MANAGER KING PRESIDENT
7782 CLARK MANAGER KING PRESIDENT
7369 SMITH CLERK FORD ANALYST
第三步:发现 emp 表(员工信息)数据不完整,因为不满足于等值关联判断,所以要想让员工信息显示完整,则必须使用外连接控制
SQL> select e.empno,e.ename,e.job,m.ename,m.job
2 from emp e,emp m
3 where e.mgr=m.empno(+);
EMPNO ENAME JOB ENAME JOB
---------- -------------------- ------------------ -------------------- ------------------
7902 FORD ANALYST JONES MANAGER
7499 ALLEN SALESMAN BLAKE MANAGER
7521 WARD SALESMAN BLAKE MANAGER
7654 MARTIN SALESMAN BLAKE MANAGER
7844 TURNER SALESMAN BLAKE MANAGER
7900 JAMES CLERK BLAKE MANAGER
7934 MILLER CLERK CLARK MANAGER
7566 JONES MANAGER KING PRESIDENT
7698 BLAKE MANAGER KING PRESIDENT
7782 CLARK MANAGER KING PRESIDENT
7369 SMITH CLERK FORD ANALYST
7839 KING PRESIDENT
8989 HELLO
此时使用了左外连接“e.mgr=m.empno(+)” ,得到了想要的结果