为什么要连表?
因为要查的数据在两张表,但是又想显示在一个结果集中。
表连接语法
表连接分为两种语法,
1)一种为1992;
2)另一种为1999;
1.1992语法
1)笛卡尔积(无过滤条件)
select * from emp,dept;
2)等值连接
select * from emp,dept where emp.deptno=dept.deptno;
3)非等值连接
select * from emp e,salgrade s where e.sal between s.losal and s.hisal;
4)自连接:(特殊的等值连接) 列来自于同一张表,不同角度看待表
select e1.ename ||'的上级领导是''||e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;
5)外连接: 在等值基础上,确保一张表(主表)的记录都存在 从表满足则匹配,不满足补充null
--1、左外:(+)放等号左边表示左外连接(左外则表示左边表格全显示,右边没有的补空)
select * from emp e,dept d where d.deptno = e.deptno(+);
--2、右外:(+)放等号左边表示右外连接
select * from emp e,dept d where d.deptno(+) = e.deptno;
2.1999语法
1).cross join 交叉连接(交叉连接就是笛卡尔积)
select * from emp cross join dept
2).natural join 自然连接 子句基于两个表中列名完全相同的列产生连接
/*
特点:两个表有相同名字的列
数据类型相同
从两个表中选出连接列的值相等的所有行
*/
select * from emp natural join dept;
3).[inner] join 内连接 == 等值连接 如果不加inner关键字,那么默认就是内连接 ,内连接必须有on关键字
--on关键字表示连接条件
select * from emp e inner join dept d on e.deptno = d.deptno;
4).left/right [outer] join 左/右外连接 外链接也需要on关键字 left左边的表多数据 right右边的表多数据
select * from emp e left join dept d on e.deptno = d.deptno;
select * from dept d left join emp e on e.deptno = d.deptno;
select * from emp e right join dept d on e.deptno = d.deptno;
select * from dept d right join emp e on e.deptno = d.deptno;
5).full [outer] join 全外连接 左右两张表都补null
select * from dept d full outer join emp e on e.deptno = d.deptno;