【oracle】-表连接类型:内连接,外连接...

一、数据准备


1、emp表

delete from emp;
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800.00, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600.00, 300.00, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250.00, 500.00, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, to_date('02-04-1981', 'dd-mm-yyyy'), 2975.00, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250.00, 1400.00, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, to_date('01-05-1981', 'dd-mm-yyyy'), 2850.00, null, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, to_date('09-06-1981', 'dd-mm-yyyy'), 2450.00, null, 10);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, to_date('09-12-1982', 'dd-mm-yyyy'), 3000.00, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981', 'dd-mm-yyyy'), 5000.00, null, 10);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, to_date('08-09-1981', 'dd-mm-yyyy'), 1500.00, 0.00, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, to_date('12-01-1983', 'dd-mm-yyyy'), 1100.00, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950.00, null, 30);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000.00, null, 20);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300.00, null, 10);

insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (8000, 'mercury', 'hh', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300.00, null, 50);

2、dept表

delete from dept;
insert into dept (DEPTNO, DNAME, LOC)
values (10, 'ACCOUNTING', 'NEW YORK');

insert into dept (DEPTNO, DNAME, LOC)
values (20, 'RESEARCH', 'DALLAS');

insert into dept (DEPTNO, DNAME, LOC)
values (30, 'SALES', 'CHICAGO');

insert into dept (DEPTNO, DNAME, LOC)
values (40, 'OPERATIONS', 'BOSTON ');

insert into dept (DEPTNO, DNAME, LOC)
values (60, 'test', 'test');




二、oracle连接操作


​ 有5种类型的连接:inner,outer,natural,cross连接,自连接。

1、交叉连接(笛卡尔积,cross join)

  • 说明

    返回的是被连接的两个表的所有数据行的笛卡尔积


  • 写法
select e.*,d.* from emp e cross join dept d;

等价于:
select e.*,d.* from emp e,dept d;

  • 查询结果



2、内连接(inner join)

  • 说明

    返回与连接条件匹配的数据行。(即两表都要存在)

    其中查询条件分为等值连接(比如:=)和不等连接(比如: >、>=、<=、<、!>、!<和<>)。


  • 写法
select e.*,d.* from emp e inner join dept d on e.deptno = d.deptno;

等价于:
select e.*,d.* from emp e join dept d on e.deptno = d.deptno;

  • 查询结果



3、外连接(outer join)

【1】左外连接(left join)

  • 说明

    返回左表所有数据和满足连接条件的右表数据


  • 写法
select e.*,d.* from emp e left join dept d on e.deptno = d.deptno; 

  • 查询结果

    其中左表为emp表



【2】右外连接(right join)

  • 说明

    返回右表中所有数据和满足连接条件的表数据


  • 写法
select e.*,d.* from emp e right join dept d on e.deptno = d.deptno; 

  • 查询结果

    其中右表为dept表



【3】全连接(full join)

  • 说明

    返回左表和右表中全部数据和满足连接条件的表数据(即为左外连接和右外连接之和)


  • 写法
select e.*,d.* from emp e full join dept d on e.deptno = d.deptno; 

  • 查询结果



4、自连接

  • 说明

    连接的表是同一张表,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。(即自己关联自己)


  • 写法
select e.*,e2.* from emp e,emp e2 where e.empno = e2.empno and e.ename=e2.ename; 

  • 查询结果



5、自然连接

  • 说明

    自然连接是把两张表中数据类型和名字都相同的字段自动连接起来,返回的字段不会重复(比如原来表a和表b都有字段c,那么只会显示一遍)


  • 写法
select * from emp e  natural join dept d  ; 

注意:不能有限定符,比如:

select e.*,d.* from emp e  natural join dept d  ; 

  • 查询结果

    ​ deptno只显示了一遍

原文地址:https://www.cnblogs.com/mercurytan/p/13380621.html