oracle查询语句中select from where group by having order by的解释与应用(二)

2014-11-24 12:39:13 · 作者: · 浏览: 1
过表达式运算出的结果和几个单独的值列表进行
比较,例如
select * from emp where sal in (2850,3000,5000);
like运算符,like运算符后面的表达式可以有几种情况
'%ab' 列的值最后两个字母是ab
'%ab%'列的值中包含ab,注意ab是一体的
'ab%' 列的值最开始两个字母是ab
'_ab%'列的值第二三个字母是ab,其中_为占位符,一个_占一位
select * from emp where ename like '_MI%';
case表达式,简单的语法格式如下图
例如
select ename ,case deptno
when 10 then '10部门'
when 20 then '20部门'
when 30 then '30部门'
when 40 then '40部门'
else '没有该部门'
end
from emp;
case的第二种表达式如下图
select ename,deptno,sal,
case www.2cto.com
when sal between 1000 and 2000 then '工资比较低'
when sal >2000 and sal<3000 then '工资还可以'
when not sal <3000 then '工资比较高'
else '工资太低啦'
end as salary
from emp order by sal;
group by
group by 与不带group by的查询语句的区别在于:不带group by的
情况下我们select跟的表达式无论是什么,都只是对满足where条件一行数据进行操做,利用group by根据某列内容对数据进行分组后我们可以对该组进行一些数据的统计与查询,例如统计该组的总数,查询该组的最大值平均值等内容
利用group by是有限制的,即select后面跟的列只能是两种情况
一是按照该列分组,而是对该列使用了分组函数(count sum max min avg median stats_mode stddev variance)
select count(*),avg(sal),deptno from emp group by deptno;
结果如下
COUNT(*) AVG(SAL) DEPTNO
---------- ---------- ----------
6 1566.66667 30
5 2175 20
3 2916.66667 10
having
group by 将数据按照某列进行分组后,有的组并不是我们想要的,这个时候可以通过having对组进行过滤,例如想得到部门员工数大于5人的部门,则可以
select count(ename) ,deptno from emp group by deptno having count(ename)>5;
结果如下 www.2cto.com
COUNT(ENAME) DEPTNO
------------ ----------
6 30
只显示了员工人数大于5的部门,having将人数小于等于5的部门过滤掉了
where与having的区别
虽然都是起着过滤的作用,但是where针对的是一行数据,having针对的是一组数据,where可以决定返回哪个行,having可以决定返回哪一组,同时在where子句中不允许使用分组函数,但是在having子句中可以使用非分组函数
select deptno ,count(*) from emp group by deptno having deptno>20;
但是这样的语句执行效率低于下面的写法
select count(*) ,deptno from emp where deptno>20 group by deptno;
作者 wudiisss