目录

交叉连接

实现交叉连接

自然连接

实现自然连接(实际上就是内连接)

ON和USING

使用自然连接时要求两张表的字段名称相同,但是如果不相同或者两张表中有两组字段是重名,这时就要利用 ON 子句指定关联条件,利用 USING 子句设置关联字段

利用 USiNG 子句设置关联字段实现自然连接

利用 ON 子句设置关联条件

外连接

左外连接

全外连接


Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645

对于数据表的连接操作,从实际使用来说,各个数据库都是支持的,但是外连接使 用“ (+) ”是 Oracle 自带的,其他数据库是不支持的。所以对所有的数据库,进行表连接最好的做法是利用以下的语法完成

select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] , ...from 表 1 [ 别名 ]   [cross join 表 2 [ 别名 ]]   [natural join 表 2 [ 别名 ]]   [join 表 2 [ 别名 ] on ( 条件 ) | using( 关联字段 )]   [left | right | full outer join 表 2[ 别名 ] on( 条件 )] ;

在进行表连接的时候,如果是内连接,则使用等值判断;

如果是外连接,则使用 left、outer、full等操作。

而上面语法中的 cross join、natural join、join很少使用。

不过我们也简单看 一下如何操作它们

交叉连接

目的是产生笛卡尔积

语法如下

select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] , ...from 表 1 [ 别名 ] cross join 表 2 [ 别名 ] ;

实现交叉连接

select *from emp cross join dept;

执行有很多行,这里我就不示范了,等同于

select *from emp,dept;

大家可以试试

自然连接

利用关联字段,自己进行笛卡尔积的消除(只要字段名称相同即可,系统会自动匹配)

select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] , ...from 表 1 [ 别名 ] natural join 表 2 [ 别名 ] ;

实现自然连接(实际上就是内连接)

select *from emp natural join dept;

上面代码等同于前面所介绍的查询语句

select *from emp,deptwhere emp.deptno=dept.deptno;

大家可以自己试试

ON和USING

使用自然连接时要求两张表的字段名称相同,但是如果不相同或者两张表中有两组字段是重名,这时就要利用 ON 子句指定关联条件,利用 USING 子句设置关联字段

利用 USiNG 子句设置关联字段实现自然连接

SQL> select *2from emp join dept using(deptno);DEPTNOEMPNO ENAMEJOB MGR HIREDATESAL COMM DNAME LOC---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------------------------- --------------------------10 7839 KING PRESIDENT 17-11月-81 5000ACCOUNTING NEW YORK10 7782 CLARKMANAGER7839 09-6月 -81 2450ACCOUNTING NEW YORK10 7934 MILLER CLERK7782 23-1月 -82 1300ACCOUNTING NEW YORK20 7902 FORD ANALYST7566 03-12月-81 3000RESEARCH DALLAS20 7369 SMITHCLERK7902 17-12月-80800RESEARCH DALLAS20 7566 JONESMANAGER7839 02-4月 -81 2975RESEARCH DALLAS30 7900 JAMESCLERK7698 03-12月-81950SALES CHICAGO30 7844 TURNER SALESMAN 7698 08-9月 -81 15000 SALES CHICAGO30 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 SALES CHICAGO30 7521 WARD SALESMAN 7698 22-2月 -81 1250500 SALES CHICAGO30 7499 ALLENSALESMAN 7698 20-2月 -81 1600300 SALES CHICAGODEPTNOEMPNO ENAMEJOB MGR HIREDATESAL COMM DNAME LOC---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------------------------- --------------------------30 7698 BLAKEMANAGER7839 01-5月 -81 2850SALES CHICAGO已选择 12 行。

利用 ON 子句设置关联条件

SQL> select *2from emp e join dept d on(e.deptno=d.deptno); EMPNO ENAMEJOB MGR HIREDATESAL COMM DEPTNO DEPTNO DNAMELOC---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------7839 KING PRESIDENT 17-11月-81 500010 10 ACCOUNTINGNEW YORK7782 CLARKMANAGER7839 09-6月 -81 245010 10 ACCOUNTINGNEW YORK7934 MILLER CLERK7782 23-1月 -82 130010 10 ACCOUNTINGNEW YORK7902 FORD ANALYST7566 03-12月-81 300020 20 RESEARCHDALLAS7369 SMITHCLERK7902 17-12月-8080020 20 RESEARCHDALLAS7566 JONESMANAGER7839 02-4月 -81 297520 20 RESEARCHDALLAS7900 JAMESCLERK7698 03-12月-8195030 30 SALESCHICAGO7844 TURNER SALESMAN 7698 08-9月 -81 15000 30 30 SALESCHICAGO7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALESCHICAGO7521 WARD SALESMAN 7698 22-2月 -81 1250500 30 30 SALESCHICAGO7499 ALLENSALESMAN 7698 20-2月 -81 1600300 30 30 SALESCHICAGO EMPNO ENAMEJOB MGR HIREDATESAL COMM DEPTNO DEPTNO DNAMELOC---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------7698 BLAKEMANAGER7839 01-5月 -81 285030 30 SALESCHICAGO已选择 12 行。

同样,上面代码效果等同于前面所介绍的查询语句

select *from emp,deptwhere emp.deptno=dept.deptno;

不过显示结果的时候,deptno 字段只显示一次,而前面介绍的方法会显示两次

外连接

select [distinct] * | 列 [ 别名 ] , 列 [ 别名 ] , ...from 表 1 [ 别名 ] left | right | full outer join 表 2 ;

左外连接

select *from emp e left outer join dept d on(e.deptno=d.deptno);

上面代码等同于前面所介绍的查询语句

select *from emp e,dept dwhere e.deptno=d.deptno(+);

全外连接

SQL> select *2from emp e full outer join dept d on(e.deptno=d.deptno); EMPNO ENAMEJOB MGR HIREDATESAL COMM DEPTNO DEPTNO DNAMELOC---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------7369 SMITHCLERK7902 17-12月-8080020 20 RESEARCHDALLAS7499 ALLENSALESMAN 7698 20-2月 -81 1600300 30 30 SALESCHICAGO7521 WARD SALESMAN 7698 22-2月 -81 1250500 30 30 SALESCHICAGO7566 JONESMANAGER7839 02-4月 -81 297520 20 RESEARCHDALLAS7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALESCHICAGO7698 BLAKEMANAGER7839 01-5月 -81 285030 30 SALESCHICAGO7782 CLARKMANAGER7839 09-6月 -81 245010 10 ACCOUNTINGNEW YORK7839 KING PRESIDENT 17-11月-81 500010 10 ACCOUNTINGNEW YORK7844 TURNER SALESMAN 7698 08-9月 -81 15000 30 30 SALESCHICAGO7900 JAMESCLERK7698 03-12月-8195030 30 SALESCHICAGO7902 FORD ANALYST7566 03-12月-81 300020 20 RESEARCHDALLAS EMPNO ENAMEJOB MGR HIREDATESAL COMM DEPTNO DEPTNO DNAMELOC---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------7934 MILLER CLERK7782 23-1月 -82 130010 10 ACCOUNTINGNEW YORK8989 HELLO40 OPERATIONSBOSTON已选择 14 行。

此时把没有员工的部门和没有部门的员工的信息都显示出来了