转换函数 to_char()字符串转换日期函数 --查询大于某个日期的员工信息 select * from emp where hiredate>to_date(‘1980-02-12‘,‘yyyy-mm-dd‘);
oracle自动转换 char===>number number===>char date=====>char char=====>date
--查询员工的薪水:两位小数,本地货币代码,千位符 SQL> select ename,to_char(sal,‘L9,999.99‘) from emp; WARD ¥1,250.00 JONES ¥2,975.00 MARTIN ¥1,250.00 BLAKE ¥2,850.00 CLARK ¥2,450.00 下面是在to_char函数经常使用的几种格式 9 数字 0 零 $ 美元符 L 本地货币符号 . 小数点 , 千位符 --将字符串‘¥1,250.00‘转成数字 SQL> select to_number(‘¥2,975.00‘,‘L9,999.99‘) from dual; TO_NUMBER(‘¥2,975.00‘,‘L9,999.99‘) ----------------------------------- 2975
通用函数
这些函数适用于任何数据类型,同时也适用于空值
NVL(expr1,expr2)
NVL2(expr1,expr2,expr3)
nvl2(a,b,c)当a=null返回c否则返回b
NULLIF(expr1,expr2)
nullif(a,b) 当a=b时,否则返回a
COALESCE(expr1,expr2,expr3....)
coalesce(a,b,c,...)从左到右,返回第一个不为空的表达式
case表达式(一般用于报表) 在SQL语句中使用IF-THEN-ELSE逻辑 使用两种方法 1.case表达式:SQL99的语法,类似Basic,比较繁琐 2.DECODE函数:oracle自己的语法,类似java,比较简单 decode(列名|表达式,search1,result1,search2,result2,...,default) --注意:默认值写在最后,可扩展参数列表
--给员工涨工资:总裁 1000 经理:800 其他涨500 前后工资给列出来 --方法一 select ename,sal 涨前工资, (case job when ‘PRESIDENT‘ then sal+1000 when ‘MANAGER‘ then sal+800 else sal+500 end) 涨后工资 from emp; ENAME 涨前工资 涨后工资 ---------- ---------- ---------- ton_abc 8000 8500 SMITH 800 1300 ALLEN 1600 2100 WARD 1250 1750 JONES 2975 3775 --方法二 select ename,job,sal 涨前工资, (decode(job,‘PRESIDENT‘,sal+1000,‘MANAGER‘,sal+800,sal+500)) 涨后工资 from emp;
分组函数
分组函数作用于一组数据,并对一组数据返回一个值。
group by子句必须在where之后
组函数类型
AVG
COUNT
MAX
MIN
SUM
--求员工的平均工资 SQL> select avg(sal) 平均工资1,sum(sal)/count(*) from emp; 平均工资1 SUM(SAL)/COUNT(*) ---------- ----------------- 2073.21429 2073.21429 --如果列中有空值,组函数能够自动过滤空值 --可以使用nvl()函数修正空值,使得组函数不过滤空值
分组数据 知识点1:可以使用group by子句将表中的数据分成若干组 --查询各部门的平均工资 SQL> select avg(sal) from emp group by deptno; select a,b,c from emp group by a,b,c,d --group by先对数据进行分组,然后在组上进行数据查询 --在使用分组函数时,在select中出现的a,b,c列,必须是group by 后面集合的子集。 --如果是组函数作为列,不需要在group by 后面集合的子集中 --在group by中没有出现的项,不能在select进行检索(group by是分组mselect查询的是分组之后各组的结果)
--查询各个部门中不同职位的平均工资 SQL> select avg(sal) from emp group by deptno,job;--先按部门进行分组,再按职位分组 SQL> select deptno,job,avg(sal) from emp group by deptno,job order by 1;(按select的第一个查询结果排序) DEPTNO JOB AVG(SAL) ------ --------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 3000 20 CLERK 950 20 MANAGER 2975 30 CLERK 950
知识点2:分组过滤(对数据分组之后,再增加检索条件) having --查询平均工资大于2000的部门 SQL> select deptno from emp group by deptno having avg(sal)>2000;
having和where子句 --查询10号部门的平均工资 方案一:先where查询10号部门,再计算平均工资 SQL> select avg(sal) from emp where deptno=10; 方案二:先分组查询每组的平均工资,再通过having过滤 SQL> select avg(sal) from emp group by deptno having deptno=10; 总结:sql优化②,这里先where过滤比较好 --注意:where子句中不可以使用分组函数,但是having可以
原文:http://www.cnblogs.com/zhanggaofeng/p/6259718.html