【1】交叉连接 cross join
select * from emp,dept; ---sql92select * from emp cross join dept; ---sql99
【2】自然连接 natural join
自然连接会自动查找两张表中所有的相同的字段,进行等值连接
select * from emp e, dept d where e.deptno = d.deptno; ---sql92 select * from emp e natural join dept d;
查询所有的员工名称,部门编号和部门名称
select e.ename,d.deptno,d.dnamefrom emp e, dept dwhere e.deptno = d.deptno; ---sql92select e.ename, deptno, d.dnamefrom emp e natural join dept d; ---sql99
【3】using:指定字段进行等值连接
select e.ename , deptno, d.dname --注意:deptno不区分是哪个表中的。from emp e inner join dept d --内连接:通常inner可以省略。using(deptno); 使用using指定列名,不区分在哪个表中。
【4】on子句;用于指定连接的条件
--查询30号部门员工的编号,姓名和部门的名称select e.empno,e.ename,d.dnamefrom emp e,dept dwhere e.deptno = d.deptno; ---sql92select e.empno,e.ename,d.dnamefrom emp e join dept d on e.deptno = d.deptnowhere d.deptno = 30; ---sql99 --查看10部门员工姓名,薪水 和薪水等级select e.ename, e.sal, s.gradefrom emp e join salgrade son e.sal between s.losal and s.hisalwhere e.deptno = 10; --sql99
【5】自连接
select e1.empno,e1.ename, e2.empno,e2.enamefrom emp e1 join emp e2on e1.mgr = e2.empno; --sql99---但是注意;少了KING这个用户,所以使用外连接。
【6】外连接
外连接有三种:左外连接,右外连接,全外连接
--[6] 外连接 [outer] join outer 可以省略 与 inner一样!-- 左外连接 left [outer] join -- 右外连接 right [outer] join-- 全外连接 full [outer] joinselect e1.empno,e1.ename,e2.empno,e2.enamefrom emp e1 left join emp e2 --e1 是可以看作员工表 e2可以看作领导表on e1.mgr = e2.empno;--查询所有部门的详细信息以及每个部门的平均工资,包含没有员工的部门select d.*,round(nvl(avg(sal),0)) avg_salfrom emp e1 right join dept d on e1.deptno = d.deptnogroup by d.deptno,d.dname,d.locorder by d.deptno;--按照部门编号排序--查询部门30员工编号,姓名,部门名称,薪水,薪水等级select e.empno,e.ename,d.dname,e.sal,s.gradefrom emp e join dept d on e.deptno = d.deptnojoin salgrade s on e.sal between s.losal and s.hisalwhere d.deptno = 30;