ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

表的连接

2026/9/21 12:21:01 拓冰建站 浏览量
表的连接

目录

内连接实现效果

使用左外连接,将所有的员工信息都显示出来,即便他没有对应的部门

使用右外连接,将所有的部门信息都显示出来

查询每个员工的编号、姓名、职位,以及所在各部门的领导姓名、领导职位

确定所需要的数据表

 确定已知的关联字段


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(+)” ,得到了想要的结果