目录
交叉连接
实现交叉连接
自然连接
实现自然连接(实际上就是内连接)
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,dept
where emp.deptno=dept.deptno;
大家可以自己试试
ON和USING
使用自然连接时要求两张表的字段名称相同,但是如果不相同或者两张表中有两组字段是重名,这时就要利用 ON 子句指定关联条件,利用 USING 子句设置关联字段
利用 USiNG 子句设置关联字段实现自然连接
SQL> select *
2 from emp join dept using(deptno);
DEPTNO EMPNO ENAME JOB MGR HIREDATE SAL COMM DNAME
LOC
---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------------------------- --------------------------
10 7839 KING PRESIDENT 17-11月-81 5000 ACCOUNTING
NEW YORK
10 7782 CLARK MANAGER 7839 09-6月 -81 2450 ACCOUNTING
NEW YORK
10 7934 MILLER CLERK 7782 23-1月 -82 1300 ACCOUNTING
NEW YORK
20 7902 FORD ANALYST 7566 03-12月-81 3000 RESEARCH
DALLAS
20 7369 SMITH CLERK 7902 17-12月-80 800 RESEARCH
DALLAS
20 7566 JONES MANAGER 7839 02-4月 -81 2975 RESEARCH
DALLAS
30 7900 JAMES CLERK 7698 03-12月-81 950 SALES
CHICAGO
30 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 SALES
CHICAGO
30 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 SALES
CHICAGO
30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 SALES
CHICAGO
30 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 SALES
CHICAGO
DEPTNO EMPNO ENAME JOB MGR HIREDATE SAL COMM DNAME
LOC
---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------------------------- --------------------------
30 7698 BLAKE MANAGER 7839 01-5月 -81 2850 SALES
CHICAGO
已选择 12 行。
利用 ON 子句设置关联条件
SQL> select *
2 from emp e join dept d on(e.deptno=d.deptno);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME
LOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------
7839 KING PRESIDENT 17-11月-81 5000 10 10 ACCOUNTING
NEW YORK
7782 CLARK MANAGER 7839 09-6月 -81 2450 10 10 ACCOUNTING
NEW YORK
7934 MILLER CLERK 7782 23-1月 -82 1300 10 10 ACCOUNTING
NEW YORK
7902 FORD ANALYST 7566 03-12月-81 3000 20 20 RESEARCH
DALLAS
7369 SMITH CLERK 7902 17-12月-80 800 20 20 RESEARCH
DALLAS
7566 JONES MANAGER 7839 02-4月 -81 2975 20 20 RESEARCH
DALLAS
7900 JAMES CLERK 7698 03-12月-81 950 30 30 SALES
CHICAGO
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 30 SALES
CHICAGO
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALES
CHICAGO
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 30 SALES
CHICAGO
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 30 SALES
CHICAGO
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME
LOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 30 SALES
CHICAGO
已选择 12 行。
同样,上面代码效果等同于前面所介绍的查询语句
select *
from emp,dept
where 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 d
where e.deptno=d.deptno(+);
全外连接
SQL> select *
2 from emp e full outer join dept d on(e.deptno=d.deptno);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME
LOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------
7369 SMITH CLERK 7902 17-12月-80 800 20 20 RESEARCH
DALLAS
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 30 SALES
CHICAGO
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 30 SALES
CHICAGO
7566 JONES MANAGER 7839 02-4月 -81 2975 20 20 RESEARCH
DALLAS
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALES
CHICAGO
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 30 SALES
CHICAGO
7782 CLARK MANAGER 7839 09-6月 -81 2450 10 10 ACCOUNTING
NEW YORK
7839 KING PRESIDENT 17-11月-81 5000 10 10 ACCOUNTING
NEW YORK
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 30 SALES
CHICAGO
7900 JAMES CLERK 7698 03-12月-81 950 30 30 SALES
CHICAGO
7902 FORD ANALYST 7566 03-12月-81 3000 20 20 RESEARCH
DALLAS
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME
LOC
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ---------- ---------- ---------------------------- --------------------------
7934 MILLER CLERK 7782 23-1月 -82 1300 10 10 ACCOUNTING
NEW YORK
8989 HELLO
40 OPERATIONS
BOSTON
已选择 14 行。
此时把没有员工的部门和没有部门的员工的信息都显示出来了