第三章——单行行数 单行函数指的是对单行进行计算,也就是说会对结果集中每一条记 录计算一次,每一条记录返回一个结果。
一、字符类型
1.大小写转换 例:把’I Love YOU’转换成全大写,全小写和首字符大写的形式
select upper(‘I Love YOU’),lower(‘I Love YOU’),initcap(‘I Love YOU’) from dual;

2.concat(列|表达式,列|表达式):连接字符串
例:把’I Love’和’You’连接起来 select concat(‘I Love’,‘You’) from dual;
例:把’I’,'Love’和’You’连接起来 select concat(concat('I ', 'Love '), ‘You’) from dual;
函数嵌套,是由最内层向外层一次计算的,且单行函数可以无限嵌套

3.substr(列|表达式,m,n)
注:把源字符串中从第m位开始,截取n个字符,如果不写n,默认试试截取到字符串的 末尾
例:select substr(‘I Love You’,3,4) from dual;
例:将字符串’Hi, I am TOM, I am 15 years old, I Love YOU’中"YOU"截取出来(m 可以取负数)
select substr(‘Hi, I am TOM, I am 15 years old, I Love YOU’, -3, 3) from dual;(从倒数第三个开始截取三位)
select substr(‘Hi, I am TOM, I am 15 years old, I Love YOU’, -3) from dual;(从倒数第三位开始截取到字符串的最后一个字符)

4.length(列|表达式):取长度
select length(‘Hi, I am TOM, I am 15 years old, I Love YOU’) from dual;

5.instr(源字符串,子串,m,n)
注:返回子串在源字符串中从第m个字符开始,第n次出现的位置,m,n默认值都 是1。
select instr(‘I Love You’,‘o’) from dual;(表示第一次出现‘o’在第几位)
select instr(‘I Love You’,‘o’,5) from dual;(表示从字符串的第5位开始,第1次 出现‘o’的位置)
select instr(‘I Love You’,‘o’,5,1) from dual;(表示从字符串的第5位开始,第1 次出现‘o’的位置)

例:使用字符函数查询employees表的员工姓名,职位,以及工资,条件是:
1、员工 职位的最后三个字母是man 2、员工姓名中至少含有一个字母e
select last_name,job_id,alary from employees where lower(substr(job_id, -3))=‘man’ and instr(lower(last_name),‘e’)>0;

6.lapd(列|表达式,n,‘子串’):将源串用子串在左边填充成n个字符长度
rapd(列|表达式,n,‘子串’):将源串用子串在右边填充成n个字符长度
注:n指的是填充完的字符串的总长度,而不是填充多少个字符
例:将I Love You的左右分别用填充到15个字符
select lpad(‘I Love You’, 15, '
’), rpad(‘I Love You’, 15, ‘*’) from dual;

7.trim([leading|trailing|both]字符From源串):截去源串头|尾的 字符–默认是both,头尾都截
例:select trim('l’from ‘level’) from dual;——头尾都截
select trim(leading ‘l’ from ‘level’) from dual;——只截头部
select trim(trailing ‘l’ from ‘level’) from dual;——只截尾部

trim 的第二种用法:trim(列|表达式) ——去掉字符串头尾的 空格
例:select ’ mike ’ 源串, trim(’ mike ')截后 from dual;

8.replace(源字符串,s1,s2):将源字符串中的s1都替换成s2
例:将‘I Love You’中的‘You’替换成‘Her’
select replace(‘I Love You’,‘You’,‘Her’) from dual;

二、数字函数
1.round(列|表达式[,n]):将数字四舍五入到小数点后n位,n默认试0
例:select round(654.31,1) from dual; 四舍五入到小数点后一位
select round(654.31,-1) from dual; 四舍五入到小数点前一位
select ronnd(654.31) from dual; 四舍五入到0位小数

2.trunc(列|表达式[,n]):将数字截取到小数点后n位,n默认是0
例:select trunc(654.31,1) from dual; 截取到小数点后一位
select trunc(654.31,-3) from dual; 截取到小数点前三位

3.mod(m,n):计算m除以n后的余数
例:select mod(1000,400) from dual; 1000除以400=2*400+200,所以余数为200

4.abs(m):取绝对值
例:select abs(-654) from dual; 取-654的绝对值为654

三、日期函数
1.sysdate:返回当前系统(Oracle服务器)时间
例:select sysdate from dual;

2.months_between(date1,date2):返回两个日期之间相差的月数
例:查询employees中的员工至今为止已经在公司里工作了多少年了
select last_name,hire_date,round(months_between(sysdate,hire_date)/12,1) from employees;

练习:计算自己的年龄,四舍五入到小数点后两位
select round(months_between(sysdate,‘17-3月-98’)/12,2) 年龄 from dual;

3.add_months(date1,n):在指定日期基础上加上 相对应的月数
例:select add_months(sysdate,1) from dual;

如果给定的日期是一个月的最后一天的话,加上对应月数,结果也是那个月的最后一 天
例:select add_months(‘28-2月-2019’,1) from dual;

4.next_day(date1, ‘星期×’|n):返回给定日期后一周之内的下一 个星期×的日期
注:是下一个星期几,不是下个星期几,比如今天星期四,next_day星期 五就是明天
例:select next_day(sysdate,‘星期二’)from dual;
select next_day(sysdate,‘星期五’) from dual;
select next_day(sysdate,‘星期四’) from dual;
select next_day(sysdate,6 from dual;
– 星期日是一周的第一天,星期一是2,以此类推

  1. last_day(date1):返回指定日期当月最后一天的日期
    例:select last_day(sysdate) from dual;例:select last_day(sysdate) from dual;

  2. round(date1, ‘fmt’): 对给定日期进行四舍五入fmt叫做格式 字符串,定了四舍五入到日期的哪一位代表年YYYY 表月 MM 代表日 DD
    例:上半个月来,工资按全月发放,下半个月来,工资按下个月一号开始发放查询 employees表中员工从什么时间开始拿工资 select last_name,hire_date,round(hire_date,‘mm’) from employees;
    – 1~15日为上半个月,不管这个月有多少天。
    select round(to_date(‘15-2-2000’, ‘dd-mm-yyyy’), ‘mm’) from dual;

  3. trunc(date1, ‘fmt’): 对给定日期进行截断,fmt叫做格式字符 串,规定了截断到日期的哪一位 例:不管上半个月或下半个月,工资全按全月发放。
    select last_name,hire_date,trunc(hire_date,‘mm’) from employees;select last_name,hire_date,trunc(hire_date,‘mm’) from employees;

  4. extract(year|month|day from date1) : 从指定的日期中抽取出 年,月或日的信息
    – year|month|day 都是关键字,不是字符串
    – 是oracle 9i版本提供的,不建议大家使用
    例:select extract(year from sysdate) from dual; 抽出年份
    select extract(month from sysdate) from dual; 抽出月份

9.日期的数学运算 注:在日期上加上或者减去一个数字,结果仍为日期。
两个日期相减返回日期之间相差的天数(日期不允许做加法运算)。
可以用数字除以24来向日期中加上或者减去天数。
例:查询90号部门员工的姓名和到现在工作了多少个星期
select last_name,(sysdate-hire_date)/7 as weeks from employees where department_id = 90;

四. 类型转换
1、 隐式的类型转换
select * from employees where department_id = ‘10’;
select * from employees where department_id = 10;
select * from employees where hire_date = ‘17-12月-1981’;

(‘DD-MON-YYYY’)
– oracle是可以进行隐式类型转换的
– 隐式类型转换是有规则的 -

  • 不建议大家使用隐式类型转换
  • – 1. 代码可读性差;
  • – 2. 使用隐式类型转换,代码的效率差;
  • – 3. Oracle并没有承诺在下一个版本中不修改隐式类型转换的规则。

2、 显式的类型转换

  1. to_char(date1|number1,‘fmt’) : 将日期或数字转换成字符,fmt是格 式字符串,规定了转换的格式
    – 常用的日期格式
    – fm 去掉前导0
    练习:输出当前系统日期,如 2011/4/11 星期一
    select to_char(sysdate,‘fmYYYY/MM/DD DY’) from dual;

– 常用的时间格式
练习:输出当前系统时间,如 下午 3:24:33
select to_char(sysdate,‘fmAM HH12:MI:SS’) from dual; 获取到下午 几点几分几 秒

– 如果在格式中需要加入字符串,那么这个字符串应该写在双引号中
练习:输出当前系统日期,如 2011年4月11日
select to_char(sysdate,‘fmYYYY"年"MM"月"DD"日"’) from dual;

– RR和YY的问题
– YY始终认为时间是当前世纪的时间
– RR更符合世纪之交人类的正常的思维习惯,有世纪转换。
select to_char(sysdate,‘WW’) from dual;当前时间是今年的第几周

– Q :代表季度
– W: 当月的第几周
– WW:当年的第几周
– 代表数字的格式字符串
– 9 : 代表一位数字;
– 0 : 代表一位数字或前导零;
– $ : 代表美元符号;
– L : 根据语言区域动态的显示本地的货币符号;
– . : 小数点;
– , : 千位分隔符;
例:查询employees表中King的姓名和工资,工资的格式要求有美元符号,带有千位分 隔符,而且保留两位小数。
select last_name, to_char(salary,’$9,999.00’) salary from employees where initcap(last_name) = ‘King’;

例子:查询employees表中King的姓名和工资,工资的格式要求有人民币符号,带有千 位分隔符,而且保留两位小数。(汇率是6)
select last_name, to_char(salary*6, ‘L99,999,999.00’) salary from employees where initcap(last_name) = ‘King’;

– 在数字向字符型转换的时候,整数位一定要足够长,否则的话结果出错 ‘17-12 月-1981’
select * from employees where hire_date= to_date(‘12-17-1980’, ‘MM-DDYYYY’);

五. 其他函数

  1. NVL (表达式1, 表达式2),两个参数的数据类型要一致。对第一个参数进行判断,如果为空,则返回第二个参数的值,如果不为空,返回第 一个参数
    练习:查询employees表中员工姓名,工资以及年薪
    select last_name,salary,(salary + nvl(commission_pct,0))* 12 from employees;

  2. nvl2(p1, p2, p3) : 对第一个参数进行判断,如果第一个参数不为 空的话,则返回第二个参数的值,如果为空的话,返回第三参数的值
    练习:查询employees表中员工姓名,工资以及年薪
    select last_name,salary,nvl2(commission_pct,salary + commission_pct , salary)*12 from employees;

练习:查询employees表中员工姓名,工资以及年薪
select last_name,salary,nvl2(commission_pct,salary + commission_pct , salary)*12 from employees;

  1. NULLIF(表达式1, 表达式2): 函数主要是完成两个参数的比较。当 两个参数不相等时,返回值是第一个参数值;当两个参数相等时,返回值 是空值。

  2. Coalesce(p1, p2…):参数的数量没有限制,返回第一个不为空 的参数
    练习:查询employees表中员工姓名,工资以及年薪
    select last_name,salary,coalesce(salary + commission_pct,salary,0) * 12 from employees;

  3. Case:作条件分支的判断 Case 列|表达式 When 取值1 Then 返 回值1 When 取值2 Then 返回值2…When 取值N Then返回值N Else默认返回值End 练习:查询employees表中员工的姓名,部门编号以及部门名称(10 - 部门1)
    select last_name,department_id,
    (case department_id
    when 10 then ‘部门1’
    when 20 then ‘部门2’
    else ‘部门3’
    end)部门名称
    from employees;

  4. decode : case表达式的简便写法 – decode函数的参数也是不限数量的 decode(列|表达式, 取值1, 返 回值1, 取值 2, 返回值2,…取值N, 返回值N, 默认返回值)

练习:查询公司在1995-1998年之间,每年雇用的人数 to_char count
select count(*) total,
sum(decode(to_char(hire_date,‘yyyy’),1995,1,0))“1995”,
sum(decode(to_char(hire_date,‘yyyy’),1996,1,0))“1996”,
sum(decode(to_char(hire_date,‘yyyy’),1997,1,0))“1997”,
sum(decode(to_char(hire_date,‘yyyy’),1998,1,0))“1998”
from employees;

用 group by 和having来写
select to_char(hire_date,‘yyyy’) 年份,count(employee_id) 人数
from employees
group by to_char(hire_date,‘yyyy’)
having to_char(hire_date,‘yyyy’) in (1995,1996,1997,1998);

用case when then else end来写
select count(*) as total, count
(case when to_char(hire_date,‘yyyy’)=1995 then 1995 else null end) “1995”
,count(case when to_char(hire_date,‘yyyy’)=1996 then 1996 else null end) “1996”
,count(case when to_char(hire_date,‘yyyy’)=1997 then 1997 else null end) “1997”
,count(case when to_char(hire_date,‘yyyy’)=1998 then 1998 else null end) “1998”
from employees;

Oracle基础知识——单行函数相关推荐

  1. oracle:oracle基础知识(二)

    oracle基础知识(二)笔记:高级查询 文章目录 分组查询 多属性分组语法: 过滤查询 group by 语句增强 sqlplus报表功能 多表查询 等值连接 外连接 自连接 子查询 子查询中的空值 ...

  2. oracle:oracle基础知识(一)

    oracle基础知识(一) oracle基础入门学习笔记:视频链接 文章目录 数据库登录角色及表结构 表空间 创建表空间 认识表 管理表 列的增,删.改 表的重命名 删表 向表中插入数值 复制表 表中 ...

  3. Oracle 基础知识——客户端连接oracle数据库服务端的四种方法

    Oracle基础知识 Oracle Database 11g 快捷版 (Oracle Database XE) 是一款基于 Oracle Database 11g 第 2 版代码库的小型入门级数据库, ...

  4. Oracle数据库之单行函数

    oracle安装参照: Oracle数据库之安装教程 Oracel数据库总结: Oracle数据库之基本查询 Oracle数据库之单行函数 Oracle数据库之多行函数 Oracle数据库之多表查询 ...

  5. oracle基础知识文档,Oracle 基础知识分享PPT

    因测试组需求,所以把Oracle基础知识整理成了PPT,并讲解了一下(PPT无风格,简约派吐舌头). Oracle 是以高级结构化查询语言(SQL)为基础的大型关系数据库,通俗地讲它是用方便逻辑管理的 ...

  6. Oracle基础知识之synonym(同义词)、database link(数据库链接)、数据完整性

    Oracle基础知识之同义词.数据库链接.数据完整性 一.同义词 (一)概念 (二)分类 1.私有同义词 2.公共同义词 3.远程同义词 (三)作用 二.数据库链接 (一)概念 (二)分类 1.私有数 ...

  7. ORACLE基础知识(2--5)章节

    ORACLE知识总结 第二章--过滤与排序 一.SQL 的分类 1.DQL语句 (data quary language) select 2.DML语句 (数据操作语句)insert update d ...

  8. oracle基础知识过一遍(原创)

    用户.角色.权限.表空间 create tablespace test1_tablespace datafile 'test1file.dbf' size 10m; create temporary  ...

  9. Oracle基础知识总结

    ORACLE 基础 ORACLE 数据库具有以下特点: 支持多用户.大事务量的事务处理 数据安全性和完整性控制 支持分布式数据处理 可移植性 ORACLE 体系结构 数据库 实例 数据文件(dbf) ...

最新文章

  1. 对大龄程序员的五大误解
  2. Linux系统基础知识整理
  3. apache配置反向代理以及实现url重写,防盗链
  4. SDN/NFV 网络技术系列文章
  5. 用Python爬取Bilibili上二次元妹子的视频
  6. 怎么安装红旗Linux5,如何用硬盘安装红旗LINUX5_0.doc
  7. strchr与strstr函数
  8. echarts中国地图描绘
  9. Bailian1833 POJ1833 排列【全排列】
  10. python实现一个简单的图片浏览器
  11. layer关闭当前窗口并刷新父窗口
  12. java搜索引擎: lucene学习笔记 3
  13. 分享一个检测用户是否用手机(Mobile)访问网站的 PHP 类
  14. InsecureProgramming-master——abo2
  15. MIT团队开发用脑电波和手势控制机器人的系统
  16. python给乘风破浪的姐姐制作词云打call图
  17. 三分钟,如何说好自我介绍?
  18. 适合python的vim设置
  19. 滚动条兼容火狐浏览器
  20. 支付宝,你在憋什么大招?

热门文章

  1. rp魔兽那个服务器人最多,魔兽世界怀旧服rp服务器什么意思
  2. 带城市标注的地图——R软件
  3. Vue EventBus事件侦听($on、$emit、$off、$once)
  4. C/C++编程学习 - 第12周 ④ 奇数在前 偶数在后
  5. ES6代码转为ES5代码的在线转换工具以及运行工具
  6. 关闭linux退格键和vi发出的嘟嘟声
  7. 闭包,lambda以及倆牛叉BIF
  8. 劳务派遣公司是怎么盈利的?
  9. 如何在 FlowUs、Notion 等笔记软件中使用电子白板工具?
  10. 两台服务器之间数据库同步