函数

  • 单行函数:一个输入一个输出
  • 多行函数:多个输入一个输出
  • lower(a):a转小写
  • upper(a):a转大写
  • substr(a,b):在a中,取从b位开始到结尾的子串
  • initcap():首字母大写
  • length():字符长度
  • lengthb():字节长度
  • instr(a,b):在a中查找b,找到返回从1开始的下标,找不到返回0
  • lpad('abcd', 10, ''): 在abcd的左填充 ,一共10位,即****abcd,rpad()为右填充
  • trim():去掉前后指定的字符,select trim('H' from 'Hello WorldH') from dual; -- ello World
  • replace('Hello', '', 'l'):用替换‘Hello’中的‘l’
  • round(45.926, 2): 45.93,四舍五入
  • round(45.926, 0): 46
  • round(45.926, -1): 50
  • round(45.926, -2): 0
  • trunc(45.926, 2): 45.92, 舍去
  • mod(1600, 300): 100,取余

日期

  • 系统时间:oracle: sysdate, mysql: now()函数
  • select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
  • select ename, hiredate, (sysdate - hiredate) 天, (sysdate-hiredate)/7 星期, (sysdate-hiredate)/30 月 from daul; -- 计算员工工龄
  • 日期 +/- 一个数字 => +/- 天数,结果仍为日期
  • 两个日期相减返回两者之间相差的天数,日期之间相加无意义
  • 可用数字除以24,来向日期 +/- 小时数
  • months_between(sysdate, hiredate): 相差月数
  • add_months(): 向指定日期加上若干个月数
  • next_day(): 指定日期的下一个日期
  • last_day(sysdate): 本月的最后一天
  • round(sysdate, 'month'):
  • round(sysdate, 'year'):
  • trunc(sysdate, 'year')
  • select next_day(sysdate, '星期二') from dual; -- 下个星期二的日期

显式类型转换

		 to_number()  <<<                >>>  to_date()  
number <=================>  character  <=================> date
		   to_char()  >>>				 <<<  to_char()
  • select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss "今天是" day ') from dual;
  • select to_char(sal, 'L9,999.99') from dual; -- ¥4.800.00, L本地货币单位 ‘,’表千位分隔符, 9表一位数字, ‘.’表小数点

通用函数

  • nvl(a, b): a为null,返回b,否则返回a
  • nvl2(a, b, c): a为null,返回c,否则返回b
  • select sal*12 + nvl2(comm,comm,0) from emp;
  • nullif(a,b): 当a=b,返回null,否则返回a
  • coalesce(expr1, ... ): 从左到右找到第一个不为null的值
  • select comm,sal, coalesce(comm, sal) from emp;

涨工资

	* select ename,job,sal 涨前,
		case job when 'PRESIDENT' then sal + 1000
				 when 'MANAGER' then sal + 800
				 else sal + 400
		end 涨后
	  from emp;
	* select ename, job, sal 涨前,
		decode(job, 'PRESIDENT', sal + 1000, 
					'MANAGER', sal + 800, 
								sal + 400) 涨后
	  from emp;

多行函数/组函数

  • avg(),count(),max(),min(),sum()
  • 组函数自动滤空,可以嵌套滤空函数来屏蔽自动滤空
  • group by子句:在select列表中所有未包含在组函数中的列都应该出现在group by子句中
  • group by deptno, job: 先按第一列分组,第一列相同在按第二列分组
  • select deptno, count(ename) from emp; 错误的,count为组函数,deptno不在group by子句中,即缺少group by子句
  • 不能在where子句中使用组函数,可以在having子句中使用组函数,其他情况可通用,但where比having效率高
  • group by rollup(a,b) <=> group by a,b + group by a + group by null.
  • break on deptno skip 2 --相同部门号只打印一次,且不同之间跳过2行
  • break on null --取消以上格式
  • select deptno,job,sum(sal) from emp group rollup(deptno,job) -- 做报表
  • wm_concat(varchar2) -- 行转列组函数
  • select deptno,wm_concat(ename) namelist from emp group by deptno;