连接查询1992、1999

--查询部门名称SALES的员工信息
--两种方式
--sql 1992和sql 1999
 
--1992
--语法
/*
select table.column, table2.column
from table,table
where table.column = table2.column2
 
where后跟表的连接条件
 
连接类型
1.笛卡尔积
select * from emp e,dept d
2.等值连接(列=列)
select * from emp e,dept d where e.deptno = d.deptno
3.非等值连接(列!=列)
--查询员工的薪水等级
select e.ename,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal
4.自连接(表自己连接自己)
--查询员工上司的姓名:以“xxx的上司是xxx”
select e1.ename ||'的上司是'|| e2.ename emp e1,emp e2 where e1.mgr = e2.empno
5.外连接(在满足一张表的内容都显示的基础上,连接另外一张表,如果连接匹配则正常显示)
select * from emp e, dept d where e.deptno = d.deptno(+)
select * from emp e, dept d where e.deptno(+) = d.deptno
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno(+)
select e.ename,d.dname from emp e, dept d where e.deptno(+) = d.deptno
 
"(+)" 在右边,我们称这次查询为“左外连接查询”
 
"(+)" 在左边,我们称这次查询为“右外连接查询”
"(+)" 在等号哪一边,哪张表就补null
*/
select * from emp
select * from salgrade
--sql 1992 缺点一:表的连接条件和表的过滤放在了一起
--查询员工工资大于2000的部门名称
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno and e.sal>2000
 
--sql 1992 缺点:外连接不太容易识别
 
--sql 1999
/*
语法:
select a.column,b.column from 表A 连接类型 join 表B on 连接条件
连接类型
1.CROSS JOIN 交叉连接,就是笛卡尔积
select * from emp cross join dept
 
2.NATUAL JOIN 自然连接,找到两张表中具有相同名称列,进行等值连接
select * from emp natural join dept
 
3.INNER JOIN 内连接(inner关键字可以省略)
--等值连接
select e.ename,d.dnam e from emp e inner join dept d on e.deptno = d.deptno where e.sal>2000
select e.ename,d.dname from emp
--非等值连接
select e.ename,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal
--自连接
select e1.ename || '的上司是' || e2.ename from emp e1 inner join emp e2 on e1.mgr = e2.empno
 
--外连接(outer关键字可以省略)
4.left outer join
select * from emp e left outer join dept d on e.deptno = d.deptno
5.right outer join
select * from emp e right outer join dept d on e.deptno = d.deptno
6.full outer join
select * from emp e full outer join dept d on e.deptno = d.deptno
*/
 
 
 
--r如何进行多表连接
--查询员工的姓名、薪水、部门名称及工资等级
select e.ename, e.sal, d.dname, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal
 
select e.ename, e.sal, d.dname, s.grade
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
--子查询
--在where中使用的子查询
--查询部门名称为 RESEARCH 、SALES
select *
from emp
where deptno in
(select deptno from dept where dname in ('RESERCH', 'SALES'))
 
--查询有哪些人的薪水是在整个雇员的平均薪水之上的
select ename, empno, sal, sal + nvl(comm, 0)
from emp
where sal + nvl(comm, 0) > (select avg(sal + nvl(comm, 0)) from emp)
 
--查在雇员中有哪些人是经理人
select empno,ename from emp where empno in(select distinct mgr from emp);
 
--找出部门编号为20的所有员工中收入最高的职员
select * from emp where sal>=all(select sal from emp where deptno =20)and deptno =20
 
--在from 后面使用子查询
--我们要求每个部门平均薪水的等级
select t1.deptno, t1.savg, s.grade
from (select deptno, avg(sal) savg from emp group by deptno) t1
join salgrade s
on t1.savg between s.losal and s.hisal
 
--求每个部门薪水的平均等级
select t1.deptno, avg(t1.grade)
from (select e.deptno, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal) t1
group by t1.deptno
 
posted @ 2019-04-19 19:14  ki1616  阅读(65)  评论(0编辑  收藏  举报