用户名:  密码:   
您当前的位置:首页 > SQL数据库 >  Oracle > 

第9讲 OR,AND,Order by,max,min,avg,sum,count,group by,having,与多表查询

上次修改时间: 2015-10-13 16:55:49      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\SQL数据库相关\Oracle数据库学习\韩顺平.玩转oracle教程笔记1_30讲\      下一页

OR,AND,Order by,max,min,avg,sum,count,group by,having,与多表查询

一、OR、And逻辑操作符的用法
查询工资高于500或岗位是MANAGER并且姓名的首字母为大写J的人员
select * from emp where (sal>500 or job='MANAGER') and ename like ‘J%’;

二、order by语句
select * from emp order by sal; //默认从底到高排
select * from emp order by sal order by sal desc; //从高到底排
按部门号升序,工资降序排列:select * from emp order by deptno[ asc], sal desc;
按部门号升序,入职时间降序排列:select * from emp order by deptno[ asc], hiredate desc;
按年薪排序:select ename,(sal+nvl(comm,0))*12 [as] "年薪" from emp order by "年薪";  //sal是工资,comm是奖金,而奖金有空需要使用nul来处理
注:因为没有“年薪”这个字段,所以需要使用别名as “年薪”,这里as可以省略。

三、分组函数:max(求列最大值),min(求列最小值),avg(求列平均值),sum(求列和),count(求列个数)
显示所有员工中最高工资和最低工资:select max(sal),min(sal) from emp; 
注:oracle的SQL语句中有一个是分组函数,其它也必需是分组函数
select  avg(sal) from emp; //查询平均工资

四、子查询,把一个SQL语句查询的值作另一个SQL的条件
查询最高工资的员工:select ename,sal from emp where sal=(select max(sal) from emp);
查询工资高于平均工资的员工信息:select * from emp where sal>(select avg(sal) from emp);

五、group by 和having子句
1.group by语句用于分组
查询每个部门的平均工资、最高工资并按部门分组:select avg(sal),max(sal),deptno from emp group by deptno;  // deptno必需出现在前面
查询每个部门的平均工资、最高工资并按部分和岗位分组:select avg(sal),max(sal),deptno,job from emp group by deptno,job;
查询每个部门的平均工资、最高工资,最低工资并按部分和岗位分组:select min(sal),avg(sal),max(sal),deptno,job from emp group by deptno,job;
2.having语句用于跟在group by后限制显示分组的结果
查询平均工资、最高工资并按部门分组,只显示平均工资低于2000:select  avg(sal),max(sal),deptno from emp group by deptno having avg(sal)>2000;
分组函数只能出现在选择列或having、order by语句中
在SQL语句中它们的顺序必需是group by,having,orderby,先分组,再设分组的条件,最后排序
查询平均工资、最高工资,按部门分组显示,但只显示平均工资高于2000的,再按平均工资升序排列
select  avg(sal),max(sal),deptno from emp group by deptno having avg(sal)>2000 order by avg(sal);

六、多表查询,
查询雇员名,工资,部门名,因为部门名保存在另一个表中,所以需要查询emp表的ename和’sal字段和dept表中的dname字段
select a1.ename, a1.sal, a2.dname from emp a1, dept a2 where a1.deptno=a2.deptno;
//查询a1表的ename和sal字段,a2表的dname字段,emp表为a1,dept表为a2,条件是a1和a2表中的deptno相等
//注:emp a1和dept a2间不能加as,否则出错

笛卡尔集与多表查询的条件个数不能小于所查询表的个数减1