目录
交叉连接
实现交叉连接
自然连接
实现自然连接(实际上就是内连接)
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;
大家可以自己试试
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 行。
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 行。
此时把没有员工的部门和没有部门的员工的信息都显示出来了