Oracle_02查询函数
(5)函数查询
1、函数
- Oracle中的函数是用来处理和修饰数据的一个方法
- 只是在临时表中处理数据,不会改变原有的值
- dual:虚表,用来显示数据的临时表
2、分类
- 单行函数:是对一行记录进行操作,返回一个结果
- 多行函数:是对多行记录进行操作,返回一个结果
- 总结:不管单行函数还是多行函数最终结果就是一个
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:系统当前时间
- 日期的相关计算:
- 日期 - 日期 = 天数
- 日期 + 数字 = 日期
- 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'):把日期类型转为字符串
常用格式:
- yyyy-mm-dd
- yyyy/mm/dd
- yyyy"年"mm"月"dd"日"
- to_date(日期,'yyyy-mm-dd'):字符转日期格式
常用格式:
- yyyy-mm-dd
- 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查询函数相关推荐
- MapInfo中常用查询函数及用法
MapInfo中常用查询函数及用法: 函数用途 语法 备注 图层中选点 Str$(obj)="point": Str(String)表示字符串:point表示点: 图层中选线 St ...
- php mysql 时间戳查询_mysql中时间查询函数(包括时间戳)
mysql中时间查询函数(包括时间戳) 这些函数都是MySQL自带的,可以直接使用在PHP写的MySQL查询语句中哦 1-CURDATE()或CURRENT_DATE()和CURTIME()或CURR ...
- 说说WordPress的主查询函数-query_posts()
今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循 ...
- Hive _偏门常用查询函数(三)附带实例(Rank)
接上两篇博客 Hive _偏门常用查询函数(一)附带实例 https://blog.csdn.net/qq_41946557/article/details/102904642 Hive _偏门常用查 ...
- Hive _偏门常用查询函数(二)附带实例(列转行、窗口函数)
接上篇博客: Hive _偏门常用查询函数(一)附带实例 https://blog.csdn.net/qq_41946557/article/details/102904642 列转行 1.函数说明 ...
- 模糊匹配查询_必须掌握的6个查询函数应用技巧,办公必备,收藏备用!
在Excel中,有一类函数被称为查找和引用函数,今天,小编给大家分享6个查询函数(Choose.Lookup.Hlookup.Vlookup.Match.Index)的应用技巧,可以收藏备用哦! 一. ...
- excel函数与公式实战技巧精粹_excel函数技巧:两个查询函数的用法比较 下
编按:今天是VLOOKUP与LOOKUP双雄战的第三回合.在前两个回合中,VLOOKUP旗开得胜,连胜两局.第三回合是交叉查询,LOOKUP能否展开反击止住颓势呢? ----------------- ...
- mysql的空间查询函数_MYSQL空间查询函数
数据写入 插入时使用ST_GeomFromText,也可使用GeomFromText INSERT INTOt_customers ( lon_lat_point )VALUES( GeomFromT ...
- mysql 空间查询_MYSQL空间查询函数
数据写入 插入时使用ST_GeomFromText,也可使用GeomFromText INSERT INTOt_customers ( lon_lat_point )VALUES( GeomFromT ...
最新文章
- UNDO表空间损坏,爆满,ORA-600[4194]/[4193]错误解决
- JDK自带监控工具 jps、jinfo、jstat、jmap、jconsole
- Web 高效开发必备的 PHP 框架
- Intel Media SDK H264 encoder GOP setting
- jpa 根据主键生成策略获取id_如何在使用JPA和Hibernate时选择id生成策略
- 【JSP】web.xml配置JavaWeb项目首页
- Hibernate 一对一关联查询
- 【clickhouse】ClickHouse 在实时场景的应用和优化-字节跳动技术沙龙第6期 笔记
- ModuleNotFoundError: No module named 'tensorflow.python.saved_model.model_utils'
- 问题 H: Search Problem (V)
- oracle查询空的时间,ORACLE 查看用户密码修改时间
- 阿里Java面经大全(整合版)
- PPT小技巧:拆解汉字!
- 计算机本地组策略编辑器在哪里,win7系统本地组策略编辑器在哪的操作方法
- 八数码问题c语言,启发式搜索算法解决八数码问题(C语言)
- 句子结构 ------中文句子结构分析
- 【数据结构】—— 树状数组
- 医院招聘计算机人员面试经典问题,医院收费员常见面试题目
- 虚拟串口软件VSPD的使用
- IE系列兼容性hack大全