设为首页 加入收藏

TOP

oracel总结(三)
2014-11-21 17:08:56 来源: 作者: 【 】 浏览:71
Tags:oracel 总结
.deptno = d.deptno); (左外连接:会把左边这张表的多于的数据,也就是不能和另外一张表产生连接的数据取出来,这个时候KINK就能拿出来。)
eg:select ename,dname from emp e right join dept d on (e.deptno = d.deptno); (右外连接:同上:会把右边这张表的多于的数据,也就是不能和另外一张表产生连接的数据取出来,这个时候就会把OPEATIONS拿出来,不写右外连接这 个字段是拿不出来的。)
eg:select ename,dname from emp e full join dept d on (e.deptno = d.deptno); (全外连接:会把左右两边不能产生连接的数据都拿出来。sql1992的语法,不支持这个。)
六、求:部门平均薪水的等级:(这个是先求平均薪水,之后再求平均薪水的等级)
select deptno,avg_sal,grade from
(select deptno,avg(sal) avg_sal from emp group by deptno)t
join salgrade s on (t.avg_sal between s.losal and s.hisal);
求:部门平均的薪水等级:(这个是先求薪水等级,再平均)


select deptno,avg(grade) from (select ename,deptno,grade from emp join salgrade s on
(emp.sal between s.losal and s.hisal))t group by deptno;
注:当group by deptno时,deptno这个字段必须是表中存在的字段,也就是t表中必须有deptno这个字段,不存在就会报错: “DEPTNO”: 标识符无效。
eg:select * from emp group by deptno; 注:group by 时,emp这张表里必须有deptno这个字段。
七、oracle练习题:
1、雇员中有哪些人是经理人 (解释:就是在雇员编号里出现了经理编号的那个雇员就是经理人)
select ename from emp where empno in (select distinct mgr from emp);
2、不准用组函数,求薪水的最高值(面试题)
select sal from emp where sal not in


(select distinct e1.sal from emp e1 join emp e2 on (e1.sal < e2.sal)); 理解(思想):做自连接e1.sal < e2.sal,把e1里的sal能和e2里的sal做连接的取出来,而那些不能和e2做自连接的,就是sal的最大值,再想办法把最大值取出来,就是不在这些能做自连接之内的贝。
3、求平均薪水最高的部门的部门编号
select avg_sal ,deptno from (select avg(sal) avg_sal,deptno from emp group by deptno)
where avg_sal =
(select max(avg_sal) from (select avg(sal) avg_sal,deptno from emp group by deptno));
理解:先求平均薪水,再求平均薪水最大的值,重点:把一个子查询看成一张表,另一个子查询看成一个值。
4、求平均薪水最高的部门的部门名称
select avg_sal,dname from (我的写法)
(select avg_sal ,deptno from
(select avg(sal) avg_sal,deptno from emp group by deptno)
where avg_sal =
(select max(avg_sal) from (select avg(sal) avg_sal,deptno from emp


group by deptno)))t join dept on (t.deptno = dept.deptno);
老马的写法:就是把已经取出来的deptno当做一个值,也就是数据过滤条件,去dept表里取dname。
select dname from dept where deptno =
(
select deptno from
( select avg(sal) avg_sal,deptno from emp group by deptno)
where avg_sal =
(select max(avg_sal) from
(select avg(sal) avg_sal,deptno from emp group by deptno)
)
)
5、求平均薪水最高的部门的部门编号


select deptno,avg_sal from
(select avg(sal) avg_sal,deptno from emp group by deptno)
where avg_sal =
(select max(avg(sal)) from emp group by deptno) 注释:这里用到了一个组函数的嵌套max(avg(sal)),一个组函数输出的是一组值,嵌套两个组函数只能
输出一个值,所以组汉数只能嵌套两层。 6、求平均薪水的等级最低的部门名称


select grade,dname,t1.deptno,avg_sal from
(
select avg_sal,deptno,grade from
(select avg(sal) avg_sal,deptno from emp group by deptno)t
join salgrade s on (t.avg_sal between s.losal and s.hisal)t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
select min(grade) from
(
select avg_sal,deptno,grade from
(select avg(sal) avg_sal,deptno from emp group by deptno)t
join salgrade s on (t.avg_sal between s.losal and s.hisal)
)
) 注释:当出现未明确定义列时,可能就是要取的字段,oracle无法判断应该从哪张表里往外取,所以就
t1.deptno,明确是从哪张表里取出来的。(我总犯这个错误,下回要记住,要明确要从那张表取数 据)。t1.grade这里也是明确那张表里的grade。 select avg_sal,deptno,grade from
(select avg(sal) avg_sal,deptno from emp group by deptno)t
join salgrade s on (t.avg_sal between s.losal and s.hisal)
这个例子中,这张表可以看成一个视图!!


7、视图:


创建视图时:权限不足,原因:就是以scott/tiger身份登陆进来,scott这个用户没有创建视图的权限。
conn sys/bjsxt as sysdba 以dba身份登陆。 grant create table, create view to scott; 授权scott用户,创建表和视图的权限。


创建一个视图,记住视图的创建格式。
create view v$_dept_avg_sal_info as
select avg_sal,deptno,grade from
(select avg(sal) avg_sal,deptno from emp group by deptno)t
join salgrade s on (t.avg_sal between s.losal and s.hisal);


select dname,grade,avg_sal,t1.deptno from v$_dept_avg_sal_info t1
join dept on (t1.deptno = de

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据库选择题 下一篇如何用JavaScript启动bat文件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: