黑马程序员-Oracle(第五讲)
2014-05-02 19:47
176 查看
黑马程序员-Oracle(第五讲)
1、group by
求出每个部门的平均薪水
![](https://img-blog.csdn.net/20140502194101687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140502194116296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这就是按照deptno和job分组,就是将deptno和job一样的分为一组
2、子查询
现在我要查询emp表中sal最高的那个人的名字,着能用子查询,总不能这么写吧
![](https://img-blog.csdn.net/20140502194130468?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
子查询:
![](https://img-blog.csdn.net/20140502194145718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
现在要查询每组中sal最高的人的姓名,薪水
![](https://img-blog.csdn.net/20140502194201375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
修改:
![](https://img-blog.csdn.net/20140502194212984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
对比上面两条SQL执行结果:可得出结论
select的字段如果没有出现在组函数里面,必须出现在group by子句中
3、having 对分组进行限制
例如我们现在要求出每个部门的平均薪水:
![](https://img-blog.csdn.net/20140502194326750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后求出每个部门中平均薪水大于2000的部门
![](https://img-blog.csdn.net/20140502194340859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
好好理解,感觉挺不好理解的:
![](https://img-blog.csdn.net/20140502194356890?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4、需求:求出有哪些人的工资位于所有人的平均工资之上
![](https://img-blog.csdn.net/20140502194409718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
需求:求出按部门进行分组之后,每组中薪水最多的那个人的姓名,薪水,部门编号
![](https://img-blog.csdn.net/20140502194429625?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
那么把等号改成in呢?
![](https://img-blog.csdn.net/20140502194444250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
结果出来了,结果貌似正确,注意这种写法其实是有问题的,
想想,假如10部门中还有个3000的人,他会不会被选出来呢?答案是肯定的
此时,我们就要用到数据库中的连接:
先看个列子:
![](https://img-blog.csdn.net/20140502194517609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其实这个查询出来的还是一张表,现在再来理解下面这个SQL
![](https://img-blog.csdn.net/20140502194530515?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
刚刚演示的时候,多写了个deptno,结果错了:
![](https://img-blog.csdn.net/20140502194542843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
分析一下:因为最后查询的时候,是从两个连接后的总表中进行查询的,由于两个表中都有deptno,所以总表中应该有两个deptno,所以现在应该指定选择哪个表中的deptno,
验证:
![](https://img-blog.csdn.net/20140502194640234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
验证结果正确
现在不是有两张表么,我要求出emp表按部门分组后的薪水的平均值,然后,查出这个薪水是哪个等级(在salgrade表中)
![](https://img-blog.csdn.net/20140502194711765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hpdGVwb255/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
还有一种方法:
1、group by
求出每个部门的平均薪水
这就是按照deptno和job分组,就是将deptno和job一样的分为一组
2、子查询
现在我要查询emp表中sal最高的那个人的名字,着能用子查询,总不能这么写吧
子查询:
现在要查询每组中sal最高的人的姓名,薪水
修改:
对比上面两条SQL执行结果:可得出结论
select的字段如果没有出现在组函数里面,必须出现在group by子句中
3、having 对分组进行限制
例如我们现在要求出每个部门的平均薪水:
然后求出每个部门中平均薪水大于2000的部门
好好理解,感觉挺不好理解的:
4、需求:求出有哪些人的工资位于所有人的平均工资之上
需求:求出按部门进行分组之后,每组中薪水最多的那个人的姓名,薪水,部门编号
那么把等号改成in呢?
结果出来了,结果貌似正确,注意这种写法其实是有问题的,
想想,假如10部门中还有个3000的人,他会不会被选出来呢?答案是肯定的
此时,我们就要用到数据库中的连接:
先看个列子:
其实这个查询出来的还是一张表,现在再来理解下面这个SQL
刚刚演示的时候,多写了个deptno,结果错了:
分析一下:因为最后查询的时候,是从两个连接后的总表中进行查询的,由于两个表中都有deptno,所以总表中应该有两个deptno,所以现在应该指定选择哪个表中的deptno,
验证:
验证结果正确
现在不是有两张表么,我要求出emp表按部门分组后的薪水的平均值,然后,查出这个薪水是哪个等级(在salgrade表中)
还有一种方法:
相关文章推荐
- 黑马程序员 OracleSQL编程
- 黑马程序员之ORACLE数据库学习笔记:如何实现连接池及连接池的优缺点
- 黑马程序员_学习Oracle总结
- 黑马程序员-Oracle 触发器的一些知识
- 黑马程序员 OraclePL-SQL编程
- 黑马程序员 Oracle约束、索引、权限
- 黑马程序员-Oracle 当中的锁
- 黑马程序员-Oracle(第三讲)
- 黑马程序员-Oracle(第八讲)
- 黑马程序员--Oracle学习_day01
- 黑马程序员-Oracle(第四讲)
- 黑马程序员-Oracle(第六讲)sql1992
- 黑马程序员_jsp+oracle分页实现
- 黑马程序员--Oracle学习_day03
- 黑马程序员-Oracle数据结构
- 黑马程序员 Oracle权限图解
- 黑马程序员--Oracle学习_day05
- 黑马程序员-浅谈个人理解,oracle procedure-存储过程、Function-函数、 package-包
- 黑马程序员_Oracle 数据库分页功能原理
- 黑马程序员Oracle基础之管理图解