设为首页 加入收藏

TOP

oracel总结(二)
2014-11-21 17:08:56 来源: 作者: 【 】 浏览:68
Tags:oracel 总结
,只要
取出的结果符合子句的限制就可以。在这里也就是说:只要主句从emp这张表里,取出的sal是3000、2850、5000
中的一个即可,所以说取的结果很有可能不准,很有可能把不是每个部门最高的值,取出来。
从另一方面说:就是子句对主句的限制,不够严密!


子查询的整个语句需要拆开来理解,不能放到一起理解!


注:in是在什么里,也就是说我们所取出来的sal是在这些值之中的一个。
子句的意思是,把个部门里薪水最高的取出来。
错误:如果10部门里,还有一个薪水是3000的,也会被取出来,见下面(自己插入一条做下试验):
也就是说当数据多时,上面这条sql就不准了!!
(不理解这里面内部怎么执行的!为什么把3000这条记录也取出来了,它内部是怎么取的??)
ENAME SAL DEPTNO
BLAKE 2850 30
FORD 3000 20
SCOTT 3000 20
DAFEI 3000 10
KING 5000 10 还是利用子查询解决这个问题,这个子查询放到from里。
select max(sal),deptno from emp group by deptno;
下面这个是,取出来的结果,看起来这个结果,很象一张表,有字段名,有数据,我们可以把它
当成一张表,从中往外取数据!
MAX(SAL) DEPTNO
2850 30
3000 20
5000 10
1 select ename,sal from emp
2 join (select max(sal) max_sal,deptno from emp group by deptno) t
3 on (emp.sal = t.max_sal and emp.deptno = t.deptno);
这回10部门,3000,这条记录就取不出来了!!也就是说:这会子句对主句的限制比较严密。


注:max(sal) max_sal 把max(sal)看成一个字段,并重命名了一下。
t 把子句取出来的结果,看成一张表,并重命名为t。4、求每个部门的平均薪水,并求出平均薪水的等级是多少?即每个部门的平均薪水的等级。(自己做!)
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);
注:以后自己写都用sql1999的语法,不用1992的看着不舒服,有点乱!!
select deptno,avg_sal,grade,dname from
(select deptno,avg_sal, grade from
(select deptno,avg_sal,grade from
(select deptno,avg(sal) avg_sal from emp group by deptno)t,salgrade s where t.avg_sal between s.losal and s.hisal))m join dept using (deptno);


为什么这么写不对?错误:未明确定义列?
select deptno,avg_sal,grade,dname from (select deptno,avg_sal, grade from
(select deptno,avg_sal,grade from
(select deptno,avg(sal) avg_sal from emp group by deptno)t,salgrade s where t.avg_sal between s.losal and s.hisal))m join dept on (m.deptno = dept.deptno);
eg:求每个部门中哪些人的薪水最高。
select ename,sal from emp join (select max(sal) max_sal,deptno from emp group by deptno)t on (emp.sal = t.max_sal and
emp.deptno = t.deptno) ;
注:是求每个部门中薪水最高的人,不是求所有部门薪水最高的人,前者是多个值,后者只有一个值。
以后用sql1999的语法,where语句里只能写数据过滤条件,不能写表连接条件,养成好的习惯。
5、把这个人的名字,及他的经理人的名字。(自连接:一张表起两个别名,当成两张表用,进行多表连接!)select e1.ename,e2.ename from emp e1 ,emp e2 where e1.mgr =e2.empno;
五、sql1999为了把连接条件和过滤条件分开来,看的清楚。
eg:select ename,dname,grade from emp e,dept d,salgrade s
where e.deptno = d.deptno and grade between s.losal and s.hisal (连接条件)
and job <> ‘CLERK’; (过滤条件) sql1992 的写法 eg:select ename,dname,from emp,dept; sql1992的写法 取的是56行,笛卡尔乘积


select ename,dname,from emp cross join dept; cross join:交叉连接 sql1999的写法(以后用新的写法)


eg:select ename,dname from emp,dept where emp.deptno = dept.deptno; (sql1992 连接条件写在where语句里) select ename,dname from emp join dept on (emp.deptno = dept.deptno); (sql1999 新的语法:连接条件不写在where语句里,where语句里只写数据过滤条件!!!,on里面写连接条件)
select ename,dname from emp join dept using (deptno); (sql1999 等值连接简单的写法,不等值连接就得象上面那样写,但不推荐使用,原因:using是假设emp表和dept表都有deptno这个字段,并且字段的类型 必须相同,如果把deptno这个字段删了,就会报些奇怪的错误,不好找!)
eg:select ename, grade from emp e join salgrade s on (e.sal between s.losal and s.hisal); (sql1999 的不等值连接,连接条件数据过滤条件区分的很明显)
eg:select ename,dname,grade from
emp e join dept d on (e.deptno = d.deptno) (emp表和dept表连接)
join salgrade s on (e.sal between s.losal and s.hisal) (emp表和salgrade表连接)
where ename not like ‘_A%’; (where语句里写数据过滤条件)
注:此语句是三张表的连接(可以写很多表的连接,按照这样的写法),和哪张表连接,看的非常清楚,并且数据过滤条件也看的非常清楚。 eg:select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno); (用sql1999写自连接,这个时候KINK这个字段是拿不出来的,原因:KINK是e1的一个字段,它和e2的字段不能进行连接,所以拿不出来。)
eg:select ename,dname from emp e left join dept d on (e

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

评论

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