(5)函数查询

1、函数

  • Oracle中的函数是用来处理和修饰数据的一个方法
  • 只是在临时表中处理数据,不会改变原有的值
  • dual:虚表,用来显示数据的临时表

2、分类

  1. 单行函数:是对一行记录进行操作,返回一个结果
  2. 多行函数:是对多行记录进行操作,返回一个结果
  3. 总结:不管单行函数还是多行函数最终结果就是一个

3、单行函数

  • 数值函数 用来处理数值的
  • 字符函数 用来处理字符的
  • 日期函数 用来处理日期的
  • 转换函数 数据类型相互转换
  • 通用函数

3.1数值函数

  • round(小数):四舍五入
  • round(小数, 精确的位数):精确到小数点第几位,并且四舍五入
  • round(小数, 0):舍弃小数位置,并且会四舍五入
  • round(小数, 负数):小数点前一位,四舍五入,不进位取0填补
  • trunc():截取函数,舍弃小数点不四舍五入
  • trunc(m, n):n:保留小数点后几位
  • mod(值1, 值2):取余数
  • abs(值):绝对值
  • ceil():向上取整
  • floor():向下取整
  • sqrt():开方

案例:

--函数:用来处理和修饰书的一个方法
--round(小数):四舍五入
select round(3.6)
from dual; --dual:虚表--round(小数,精确的位数):精确到小数点第几位,并且四舍五入
select round(5.66666666,1)
from dual;--round(小数,0):舍弃小数位置,四舍五入
select round(5.465456,0) from dual;--round(小数,负数):小数点前两位,四舍五入,不进位取0填朴
select round(526.66666666,-2) from dual;select round(-979.1212,-2) from dual;--案例:查询员工部门10 或 20 的员工的年工资(精确到百位)
select round((sal+nvl(comm,0))*12,-2) 年薪 from emp
where deptno in (10,20);--trunc(m,n)  n:保留小数点后几位
--截取函数,舍弃小数,不四舍五入
select trunc(4.73531,2) from dual;--4.73select trunc(473.73534,-2) from dual;--400--mod(值1,值2):取余数
select mod(10,3) from dual;--abs(值1):绝对值
select abs(-10) from dual;--ceil():向上取整
select ceil(2.3) from dual;select ceil(-2.3) from dual;--floor():向下取整
select floor(3.8) from dual;select floor(-3.1) from dual;--sqrt():开方  取()里数的根号
select sqrt(25) from dual;

3.2字符函数

  • upper():小写转大写
  • lower():大写转小写
  • initcap():首字母大写,其他字母变为小写

3.3截取函数:

  • substr(字符, m):从第m个位置截取到最后
  • substr(字符, m, n):从第m个位置开始,截取n个字符
  • substr(字符, -m, n):-m:倒数第几位,n:截取几位(向后截取)
  • length():字符串长度

3.4拼接函数:

  • concat(字符1, 字符2),可以嵌套

3.5包含函数:

  • instr(字符1, 字符2):判断字符2是否在字符1当中,在返回所在位置,不在返回0
  • lpad(字符, 总长度, 填充内容):左填充 总长度 = 字符串长度+填充内容的长度
  • rpad(字符, 总长度, 填充内容):右填充 总长度 = 字符串长度+填充内容的长度
  • replace(字符, 旧字符串, 新字符串):替换函数
  • trim():去掉两端空格
  • trim(字符 from 字符):去掉两侧的单个字符
  • ltrim(字符, 字符):去掉左侧的单个字符
  • rtrim(字符, 字符):去掉右侧的单个字符

实例:

--字符函数
--大小写转换
--upper():小写转大写
select upper('oracle') from dual;--lower():大写转小写
select lower('ORACLE')  from dual;--iniTCAP():首字母大写
select initcap('oraCLE') from dual;--案例: 查询员工表中smith 的信息
select * from emp where ename = upper('smith');--截取函数
--substr(字符,m):从第m个位置截取到最后
select substr('abcdefg',3) from dual;--substr(字符,m,n):从第m个位置截取n个字符
select substr('abcdefg',3,2) from dual;--substr(字符,-m,n):-m倒数第 m 位,n截取几位(向后截取)
select substr('abcdefgsdaf',-3,3) from dual;--案例:截取员工表中每个员工姓名的后三位
select substr(ename,-3)员工姓名后三位 from emp;--length():字符串长度
select length('今天星期六') from dual;--lengthb():字符串字节长度
--编码不同,汉字所占字节不同
select lengthb('今天星期六') from dual;--案例:查询员工表中姓名长度位5的员工信息
select *  from emp
where length(ename)=5;--拼接函数
select concat('你好','世界') from dual;select '你好' || '世界' from dual;--函数嵌套格式
select concat(concat('你好','世界'),'oracle') from dual;--包含函数
--instr(字符1,字符2):判断字符2是否在字符1当中,若在返回所在位置,若不在返回0
select instr('班长迟到了,一会唱歌','真好') from dual;--案例:查询员工姓名中是否包R的员工
select * from emp
where ename like '%R%';select  * from emp
where instr(ename,'R')>0;select * from emp
where instr(ename,'R')!=0;--左填充:lpad(字符,总长度,填充内容)
select lpad('hello',8,'*') from dual;--右填充:rpad(字符,总长度,填充内容)
--总长度=字符串长度+填充内容的长度
select rpad('hello',8,'*') from dual;--案例:每个员工姓名后面添加3个***
select ename,sal,rpad(ename,length(ename)+3,'*') from emp;--replace(字符, 旧字符 ,新字符)
--案例:将姓名里带A的替换成*
select replace(ename,'A','*') from emp; --trim():去掉两端空格
select 'hello' || trim('   abc    ') || 'world' from dual;--trim(字符 from 字符)去掉两侧的单个字符
select trim('h' from 'hhhhhahdikjhhhhh') from dual;--ltrim(字符,字符):去掉左边的字符
select ltrim('想学习想学习想学习想学习想学习zheng想学习','想学习') from dual;--rtrim(字符,字符):去掉左边的字符
select rtrim('想学习想学习想学习想学习想学习zheng想学习','想学习') from dual;

3.6日期函数

  • SYSDATE:系统当前时间
  • 日期的相关计算:
  1. 日期 - 日期 = 天数
  2. 日期 + 数字 = 日期
  • months_between(日期1, 日期2):两个月份之间相隔了多少个月
  • add_months():返回指定月份后的日期
  • last_day():返回指定月份的最后一天
--日期函数
--系统当前时间
select sysdate from dual;--日期的相关计算
--日期-日期=天数
--查询员工入职了多少天
select ename,floor(sysdate-hiredate) from emp;--查询员工入职了多少年
select ename,floor((sysdate - hiredate)/365) from emp;--日期+天数=日期--查询3天后的日期
select sysdate +3 from dual;--日期函数
--moths_between(日期1,日期2):两个月份之间相隔了多少个月
select months_between (to_date('2021-03-17','yyyy-mm-dd'),to_date('2021-01-17','yyyy-mm-dd')) from dual;
select months_between (to_date('2021-03','yyyy-mm'),to_date('2021-01','yyyy-mm')) from dual;--查询员工入职了多少年
select ename,floor((sysdate - hiredate)/365) from emp;
select ename ,round(months_between(sysdate,hiredate)/12)已入职年 from emp ;--add_months():返回指定月份后的日期
--查询6个月之后的日期是哪一天
select add_months(sysdate,6) from dual;select add_months(to_date('4','mm'),6) from dual;--案例:查询1981-02-23日四个月之后入职的员工
select ename,add_months(to_date('1981-02-23','yyyy-mm-dd'),4) from emp;--last_day():返回指定月份的最后一天
select last_day(sysdate) from dual;select last_day(to_date('1981-02','yyyy-mm')) from dual;

3.7转换函数

  • to_number(字符):字符类型转数字类型
  • to_char(数值/日期):将数值与日期转字符类型
  • to_char(123456789, '9999,9999,9999')
  • to_char(123456789, '0000,0000,0000'),不够的位数用0填补
  • to_char(123456789, 'L9999,9999,9999')
  • to_char(123456789, '$9999,9999,9999')

①9:数字 ②0:零 ③$:美元 ④L:¥ ⑤. :小数点

  • to_char(日期, 'yyyy-mm-dd'):把日期类型转为字符串

常用格式:

  1. yyyy-mm-dd
  2. yyyy/mm/dd
  3. yyyy"年"mm"月"dd"日"
  • to_date(日期,'yyyy-mm-dd'):字符转日期格式

常用格式:

  1. yyyy-mm-dd
  2. yyyy/mm/dd
  • 隐式类型转换

    select * from emp where sal > '2000';--自动类型转换为数字 to_number()
--转换函数
--to_number(字符):字符类型转为数字类型select to_number('123')+100 from dual;--to_char(数值/日期):可以将数值与日期转为字符类型
select to_char(123) from dual;--999,999,999分组转换
--参数1的长度不能大于参数2的长度
--L:代表钱的符号
--$:代表美元符号
select to_char(123456789,'L9999,9999,9999') from dual;
--不够的位数用0填补
select to_char(123456789,'0000,0000,0000') from dual;--to_char(日期,'yyyy-mm-dd'):把日期类型转为字符串
--把员工表的入职日期已字符串类型显示
/*常用格式:yyyy-mm-ddyyyy/mm/dd yyyy"年"mm"月"dd"日"
*/
select to_char(hiredate) from emp;--17-12月-80select to_char(hiredate,'yyyy-mm-dd') from emp;select to_char(hiredate,'yyyy/mm/dd') from emp;select to_char(hiredate,'yyyy"年"mm"月"dd"日"') from emp;select to_char(hiredate,'yyyy-mm') from emp;--to_date(字符串,模板):字符串转日期格式
--常用格式:yyyy-mm-dd
--          yyyy/mm/dd
--查询入职日期在1982年之后入职的员工
select  *from emp where hiredate >to_date('1982','yyyy');--隐士转换
select * from emp where sal > '2000';--自动类型转换为数字to_number()

3.8通用函数

  • nvl(字段,值1):如果字段不为空,返回的是该字段原来的值,如果字段为空,返回值1
  • nvl2(字段,值1,值2):类似于三元运算符,如果当前字段不为空,返回值1,如果为空返回值2
  • decode(字段,值1,返回值1,值2,返回值2,值3,返回值3...):类似于switch...case...default 匹配判断
  • case ... when ... then ... [else] ... end : 分支判断语句
--通用函数
--nvl(字段,值1):如果字段不为空,返回的是该字段原来的值,如果字段为空,返回值
select ename,empno,sal+nvl(comm,0) from emp;--nvl2(字段,值1):类似于三目表达式,如果当前字段不为空,返回值1,如果为空返回值2
select ename,job,nvl2(comm,sal+comm,sal) from emp;--decode(条件,值1,返回值1,值2,返回值2...):类似于swith...case...default语句,匹配判断
select ename,job,decode(job,'MANAGER','经理','ASLESMAN','销售','PRESTDENT','董事长','普通员工')
from emp;--case...when ...then:分支判断语句
--案例:判断工资的级别:大于3000高工资  1000~3000:一般工资  小于1000低工资
select ename,sal,
case when sal>3000 then '高工资'when sal between 1000 and 3000 then '一般工资'when sal<1000 then '低工资'
end
from emp;    select ename,sal,
case salwhen 3000 then '高工资'when 2000 then '一般工资'when 1000 then '低工资'else           '其他'
end
from emp;     

4.多行函数

  • max():获取最大值
  • min():获得最小值
  • sum():求和函数
  • avg():平均值函数
  • count():获取字段总记录个数

注意:单行函数与多行函数不能一起写(不符合逻辑)
          若要一起写需要用分组函数

--多行函数
--处理多行数据,返回一个结果--max():获取最大值
--案例:查询工资最高的员工
select max(sal) from emp;--min():获得最小值
select min(sal) from emp;--sum():求和函数
--获取总工资
select sum(sal) from emp;--avg():平均值函数
select round(avg(sal)) from emp;--count():获取字段总记录个数
select count(ename) from emp;select * from emp ;
--整张表的记录数
select count(*) from emp;--多少人有奖金
select count(comm) from emp;--获取员工表中一共有多少个不同岗位
select count(distinct job) from emp;--单行函数与多行函数不能一起写(不符合逻辑)
--若要一起写需要用分组函数

5、分组函数

select 多行函数,分组字段from 表名where 条件group by 分组字段order by 排序

执行顺序:from -->where -->group by -->select -->order by

--分组函数--查询每个部门的最高工资
--group by
select  *from emp;
/*语法:select 多行函数,分组字段from 表名where 条件group by 分组字段order by 排序注意:select关键字后只能写多行函数,只能写group by 后面的字段
*/
select deptno,max(sal) 最高工资
from emp
group by deptno;--执行顺序:from -->where -->group by -->select -->order by--查询不同工作岗位的人数
select job,count(*) from emp
group by job;--查询不同部门的不同工作岗位的人数
select deptno,job,count(*)
from emp
group by deptno,job
order by deptno;--查询每个部门的工作岗位大于1人的部门和岗位都是什么,再按照部门降序排序
select deptno,job,count(*)
from emp
where count(*)>1
group by deptno,job
order by deptno desc;--错误写法select deptno,job,count(*) from emp
group by  deptno,job
having count(*) > 1
order by deptno desc;--正确写法--不分组不可以用having--案例:查询部门大于10的每个部门的每个岗位的人数
--结论:当where和having条件相同是,where 的执行效率会更高
select deptno,job,count(*)
from emp
where deptno>10
group by deptno,job
--having deptno>10
order by deptno desc;

Oracle_02查询函数相关推荐

  1. MapInfo中常用查询函数及用法

    MapInfo中常用查询函数及用法: 函数用途 语法 备注 图层中选点 Str$(obj)="point": Str(String)表示字符串:point表示点: 图层中选线 St ...

  2. php mysql 时间戳查询_mysql中时间查询函数(包括时间戳)

    mysql中时间查询函数(包括时间戳) 这些函数都是MySQL自带的,可以直接使用在PHP写的MySQL查询语句中哦 1-CURDATE()或CURRENT_DATE()和CURTIME()或CURR ...

  3. 说说WordPress的主查询函数-query_posts()

    今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循 ...

  4. Hive _偏门常用查询函数(三)附带实例(Rank)

    接上两篇博客 Hive _偏门常用查询函数(一)附带实例 https://blog.csdn.net/qq_41946557/article/details/102904642 Hive _偏门常用查 ...

  5. Hive _偏门常用查询函数(二)附带实例(列转行、窗口函数)

    接上篇博客: Hive _偏门常用查询函数(一)附带实例 https://blog.csdn.net/qq_41946557/article/details/102904642 列转行 1.函数说明 ...

  6. 模糊匹配查询_必须掌握的6个查询函数应用技巧,办公必备,收藏备用!

    在Excel中,有一类函数被称为查找和引用函数,今天,小编给大家分享6个查询函数(Choose.Lookup.Hlookup.Vlookup.Match.Index)的应用技巧,可以收藏备用哦! 一. ...

  7. excel函数与公式实战技巧精粹_excel函数技巧:两个查询函数的用法比较 下

    编按:今天是VLOOKUP与LOOKUP双雄战的第三回合.在前两个回合中,VLOOKUP旗开得胜,连胜两局.第三回合是交叉查询,LOOKUP能否展开反击止住颓势呢? ----------------- ...

  8. mysql的空间查询函数_MYSQL空间查询函数

    数据写入 插入时使用ST_GeomFromText,也可使用GeomFromText INSERT INTOt_customers ( lon_lat_point )VALUES( GeomFromT ...

  9. mysql 空间查询_MYSQL空间查询函数

    数据写入 插入时使用ST_GeomFromText,也可使用GeomFromText INSERT INTOt_customers ( lon_lat_point )VALUES( GeomFromT ...

最新文章

  1. UNDO表空间损坏,爆满,ORA-600[4194]/[4193]错误解决
  2. JDK自带监控工具 jps、jinfo、jstat、jmap、jconsole
  3. Web 高效开发必备的 PHP 框架
  4. Intel Media SDK H264 encoder GOP setting
  5. jpa 根据主键生成策略获取id_如何在使用JPA和Hibernate时选择id生成策略
  6. 【JSP】web.xml配置JavaWeb项目首页
  7. Hibernate 一对一关联查询
  8. 【clickhouse】ClickHouse 在实时场景的应用和优化-字节跳动技术沙龙第6期 笔记
  9. ModuleNotFoundError: No module named 'tensorflow.python.saved_model.model_utils'
  10. 问题 H: Search Problem (V)
  11. oracle查询空的时间,ORACLE 查看用户密码修改时间
  12. 阿里Java面经大全(整合版)
  13. PPT小技巧:拆解汉字!
  14. 计算机本地组策略编辑器在哪里,win7系统本地组策略编辑器在哪的操作方法
  15. 八数码问题c语言,启发式搜索算法解决八数码问题(C语言)
  16. 句子结构 ------中文句子结构分析
  17. 【数据结构】—— 树状数组
  18. 医院招聘计算机人员面试经典问题,医院收费员常见面试题目
  19. 虚拟串口软件VSPD的使用
  20. IE系列兼容性hack大全

热门文章

  1. 虚幻四蓝图实战(下车减速人物加速蓝图接口通信)
  2. 康奈尔大学的计算机专业怎么样,美国名校康奈尔大学计算机专业介绍
  3. c#通过串口及CAN模块实现上位及下位机通讯
  4. Icon和Ico图片的区别
  5. 用户体验报告——石墨文档
  6. 百度地图导航的接入(包含三种选择方式驾车、公交、步行)
  7. shell学习四十三天----临时性文件的建立与使用
  8. 永久免费的抠图软件分享
  9. android点赞取消赞功能吗,Android 仿微博的点赞上报功能,持续点赞再取消
  10. Redis 面试面面观