交叉连接(Cross join)
自然连接(Natural join)
使用Using子句建立连接
使用On子句建立连接
外连接(outer join):左外连接、右外连接、全外连接
cross join
结果产生笛卡尔集:
select empno,ename,sal,emp.emptno,dname from emp cross join dept;
natrual join,基于两个表中全部同名列建立连接:
从两个表中选出同名列的值均对应相等的所有行
如果两个表中同名列的数据类型不同,则出错
不允许在参照列上使用表名或者别名作为前缀
select empno,ename,sal,deptno,dname from emp natrual join dept;
select empno,ename,deptno,dname from emp join dept using(deptno); --使用同名列deptno进
行等值连接
select empno,ename,sal,emp.deptno,dname from emp join dept on(emp.deptno=dept.deptno);
--可以使用任意连接条件,可以是相同列或不同列,可以是等值连接也可以是不等值连接
外连接(outer join):
inner join与outer join:
inner join只返回满足条件的数据
select employee_id,last_name,salary,department_id,department_name from employees join
departments using(department_id);
outer join:
左外连接:返回满足条件的行和左表中不满足条件的行
select employee_id,last_name,salary,department_id,department_name from employees left
join departments using(department_id);
右外连接:返回满足条件的行和右表中不满足条件的行
select employee_id,last_name,salary,department_id,department_name from employees right
join departments using(department_id);
满外连接(Full Outer Join):返回所有满足条件的行与所有不满足条件的行
select employee_id,last_name,salary,department_id,department_name from employees full
outer join departments using(department_id);
求部门平均薪水的等级
注意连接的写法
select deptno, grade from
(select deptno,avg(sal) avg_sal from emp group by deptno ) t
left join salgrade on t.avg_sal between salgrade.losal and salgrade.hisal
根据一个表建一个新表
create table emp2 as select * from emp;
选出薪水第五到第十高的员工
这个用sqlserver 就很简单了,orcl有点复杂 主要是因为rownum不能用 >
select * from
(
select *
from
(
select *
from
(
select empno,ename,sal from emp
order by sal desc
) t
where rownum<=10
) order by sal asc
) where rownum <=6