Oracle 基本函数-数值、字符、 Instr()、日期、转换、SQL 操作符、trunc 截断
目录
SQL 操作符 与 单双引号
Oracle 函数概述
多行函数
数值函数
字符函数
字符串查找函数 Instr()
日期函数
转换函数
通用函数
忽略大小写查询字符串
trunc 截断数字和日期
~~~ 准备员工表与部门表测试数据
SQL 操作符 与 单双引号
1、SQL 操作符的优先级从高到低顺序:算术操作符->连接操作符->比较操作符->NOT->AND->OR
算术操作符:加(+)、减(-)、乘(*)、除(/),其中除号(/)的结果是浮点数。求余运算只能借助函数:MOD(x,y):返回x除以y的余数。 | +、-、×、÷ |
比较操作符 |
=、!=、<、>、<=、>=、BETWEEN…AND、IN、LIKE 和 IS NULL等 |
区间查询 |
between …… and …… |
关键字集合查询 | in |
模糊查询 | like |
判断是否为空 | is null 或 is not null |
逻辑操作符 //select * from emp t where t.sal is not null and t.comm is not null; |
与(AND)、或(OR)、非(NOT) |
连接操作符号。用于将两个或多个字符串合并成一个字符串,或将一个字符串与一个数值合并在一起 select t.empno,t.ename || '_' || t.sal from emp t ; |
两根竖杠 "||",用于将多个字符串或数据值合并成一个字符串 |
2、Oracle 单双引号
1、Oracle 中字符串用单引号,别名用双引号。
--拼接的字符必须是单引号,别名没有空格时,可以不带引号,有空格时,必须使用引号,且必须是双引号
select t.*,'0000' || 'A' as "编 码" from emp t where t.job = 'MANAGER';-- 两个单引号可以用于转义,如 is ''':第一个是普通的单引号,第二个是对第三个进行转义
SELECT distinct
'comment on column bas_person_log.' || t.COLUMN_NAME ||' is ''' || t.COMMENTS || ''';' as coms
FROM user_col_comments t where t.TABLE_NAME in ('BAS_AGENCY_INFO','BAS_AGENCY_EXT');
Oracle SQL 操作。
Oracle 函数概述
1、Oracle sqL 提供了用于执行特定操作的专用函数,这些函数大大增强了 SQL 语言的功能。函数可以接受零个或者多个输入参数,并返回一个输出结果。 Oracle数据库中主要使用两种类型的函数:
单行函数 对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果, |
常用的单行函数有: 字符函数:对字符串操作。 数字函数:对数字进行计算,返回一个数字。 转换函数:将一种数据类型转换为另外一种数据类型。 日期函数:对日期和时间进行处理。 |
聚合函数 | 聚合函数同时可以对多行数据进行操作,并返回一个结果。比如SUM(x) 返回结果集中ⅹ列的总合。 |
多行函数
1、对多行的某一列进行处理。常用的有 max()、min()、count()、avg()、sum() 等
select max(sal) from emp; --取最大值 select max(sal) as max_sal from scott.emp t where t.deptno = 100; |
--查询最高薪资。sal 为 null 的值会自动忽略。 --当 select 没有查询到数据时,max_sal会等于null,而不是无记录返回。 |
select max(to_number(code)) as code from gbm_bs_person_type t -- 如果字段是字符串类型的数字,则必须先转为数字,否则会出现 '9' 比 '888' 大. |
|
select min(sal) from emp; -取最小值 select min(sal) as min_sal from scott.emp t where t.deptno = 100; |
--查询最低薪资。sal 为 null 的值会自动忽略 --当 select 没有查询到数据时,min_sal 会等于null,而不是无记录返回。 |
select sum(sal) from emp; --求和 select sum(sal) as sum_sal from scott.emp t where t.deptno = 100; |
--统计员工薪资总和 --当 select 没有查询到数据时,sum_sal 会等于null,而不是无记录返回。 |
select sum(comm) from emp; | --统计员工奖金总和。为 null 的值会自动忽略 |
select count(*) from emp; --获取个数 | --统计员工总数. |
select count(1) as c from scott.emp t where t.deptno = 100; | --统计员工总数。建议使用常数代替 "*";当没有数据时,返回 0 |
select avg(comm) from emp; --求平均值 select avg(sal) as avg_sal from scott.emp t where t.deptno = 100; |
--统计平均奖金。当 comm 有 null 值,则计算结果是错误的。 --当 select 没有查询到数据时,avg_sal 会等于null,而不是无记录返回。 |
select sum(comm)/count(1) from emp; | --统计平均奖金。当 comm 有 null 值时,可以使用此种方式 |
数值函数
数值函数接受数字参数,这些参数可以是表中的列,也可以是一个字符串表达式。
select abs(-100) as val from dual; --求绝对值 | --输出 100 |
select ceil(3.14159) from dual; | --向上取整 |
select ename,job,ceil(sal) from emp; | --对所有用户的工资向上取整 |
select floor(3.14159) from dual; | --向下取整 |
select ename,job,floor(sal) from emp; | --对所有用户的工资向下取整 |
select round(2.14159,3) from dual; | --四舍五入。round(x,[y]),y缺省时默认为0 |
select ename,job,round(sal) from emp; | --对所有用户的工资四舍五入 |
trunc(number,number ) 用于截断浮点型数据,. |
|
select trunc(3.14159,3) from dual; | --截断小数点后面第3位,输出 3.141 |
select trunc(3.14159,1) from dual; | --截断小数点后面第1位,输出 3.1 |
select trunc(3.14159,0) from dual; | --截断小数点后面第0位,输出 3 |
select ename,job,trunc(sal,0) from emp; | --对薪资进行取整.截断是没有四舍五入的 |
select mod(10,3) from dual; --mod 求余函数 | --输出 1. |
select mod(10,4) from dual; | --输出 2. |
select mod(10,5) from dual; | --输出 0. |
select ename ,job, mod(sal,30) from emp; | --薪资除以30后的余数 |
Select power(2,10) 二的十次方 from dual; --求次方 |
-- power(a,b) :获取的 a 的 b 次方 |
select Sqrt(16) 十六的开方 from dual; --求平方 | -- sqrt(x) :获取 x 的 二分之一次方 |
字符函数
字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。
1、concat(字符串1,字符串2) —– 连接字符串,2 个参数
2、lower(str):字符串转小写,upper(str):字符串转大写
select concat('长沙','星城') as citi from dual; | --输出 长沙星城 |
select t.stuid,concat(t.stuname,'·'||t.gender),t.age,t.classno from student t; | --拼接用户的姓名与性别,同时中间使用 '·' 符号隔开 |
select lower('AbcD') from dual; | --输出 abcd |
select upper('AbcD') from dual; | --输出 ABCD |
select t.stuid,lower(t.stuname) from student t; | --查询学生学号与姓名,姓名中的英文字母转小写输出。 |
substr(str,startIndex,length):str 被截取的字符串,startIndex 从1开始,0也是表示1. | |
select substr('ZhangSan',0,3) from dual; | --输出 Zha |
select substr('ZhangSan',1,3) from dual; | --输出 Zha |
select substr('ZhangSan',2,3) from dual; | --输出 han |
select substr('ZhangSan',3,3) from dual; | --输出 ang |
select substr(ename,1,3) ,job from emp; | --截取员工姓名的前3个字符 |
select length('张无忌') from dual; | --输出3 length 函数用于求字符串长度 |
select length(' 张无忌 ') from dual; | --输出 7 |
select length(ename) from emp; | --输出所有员工姓名的长度 |
--ltrim():去左边空格,rtrim():去右边空格,trim():去两边空格 | |
select trim(' 张无忌 ') from dual; | --输出去掉收尾空格后的 "张无忌". trim() 函数用于去掉字符串首尾的空格 |
select length(trim(' 张无忌 ')) from dual; | --输出 3 |
select replace('赵敏','敏','敏敏特穆尔') from dual; -- 字符串替换函数 | --输出 "赵敏敏特穆尔" replase函数用于替换字符串中的指定字符 |
select replace(ename,'A','a') from emp; | --替换员工姓名中的大写字母"A" 为 'a' |
select ascii('a') as a ,ascii('A') as A,t.dname, ascii(t.dname) as dname from DEPT t; | ascii:返回与指定的字符对应的十进制数; |
select chr(65) as a ,chr(97) as A,t.deptno, chr(t.deptno) as deptno from DEPT t; |
chr:给出整数,返回对应的字符; |
select initcap('china') as a ,t.dname, initcap(t.dname) as dname from DEPT t; | initcap:返回字符串并将字符串的第一个字母变为大写,其余位置字母为小写; |
字符串查找函数 Instr()
1、Oracle 字符串查找函数 Instr() 语法:instr(string, substring [, start_position [, count ]])
1、string :要搜索的目标字符串,字符串可以是 char,varchar2,nchar,nvarchar2,clob 或 nclob 等类型。 2、substring : 要在目标字符串(string)中搜索的子字符串,子字符串可以是 char,varchar2,nchar,nvarchar2,clob 或 nclob 等类型。 3、start_position : 可选。开始检索的位置,目标字符串中第一个位置为 1,不写时默认为 1;如果 start_position 为负数,则表示从后往前检索,如 -1 表示倒数第 1 个字符。 4、count : 可选。substring 子串第 count 次出现的位置,省略时,默认为 1 5、返回值:返回子字符串在目标字符串中出现的位置,如果没有找到,则返回 0. |
select empno,ename,
case --职位(job) 以 'A' 开头的设置 html 红色,以 'B'开头的设置 html 蓝色
when instr(job,'A') = 1 then '<span style="color:red">'|| job || '</span>'
when instr(job,'C') = 1 then '<span style="color:blue">'|| job || '</span>'
else job end as job,
mgr,hiredate,sal,comm,deptno
from emp;--数字同样可以查找
select instr(1, 1),instr(1, 2) from dual;-- 输出 1,0
select instr(1, '1'),instr(1, '2') from dual;-- 输出 1,0
日期函数
select sysdate from dual; | --输出 Oracle 服务器系统的当前时间 |
select sysdate + 7 from dual; | --查询7天后的当前时间 |
select add_months(sysdate,3) from dual; select add_months(sysdate,-1) from dual; --负数表示减去,即上个月 |
--查询3个月后的当前时间 ADD_MONTHSI(d,n),在某一个日期d上,加上指定的月数n,返回计算后的新日期。 d表示日期,n表示要加的月数。 |
select sysdate - hiredate from emp; | --查询员工入职的天数。 |
select round(sysdate - hiredate) from emp; | --查询员工入职的天数。对结果进行四舍五入。 |
select ceil((sysdate - hiredate)/7) from emp; | --查询员工入职的周数。结果向上取整 |
select months_between(sysdate , hiredate) from emp; | --查询员工入职的月数 |
select months_between(sysdate , hiredate)/12 from emp; | --查询员工入职的年数 |
--LAST_DAY(d) select sysdate,last_day(sysdate) from dual; |
返回指定日期当月的最后一天。 |
select next_day(sysdate,'星期二') from dual; | --查询紧邻指定日期最近的下一个星期几 |
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values (7854, '张三', 'salesman', 9598, sysdate, 1300.00, 320.00, 30); |
--插入数据,日期使用 sysdate 设置 |
select sysdate,(sysdate) + 30 / (24 * 60 * 60) from dual t;--当前时间加 30秒:2021/9/5 17:13:02 2021/9/5 17:13:32 select sysdate,(sysdate) + 30 / (24 * 60) from dual t;--当前时间加 30分钟:2021/9/5 17:13:38 2021/9/5 17:43:38 select sysdate,(sysdate) + 3 / 24 from dual t;--当前时间加 3小时:2021/9/5 17:14:29 2021/9/5 20:14:29 |
|
转换函数
1、转换函数将值从一种数据类型转换为另外一种数据类型,通用的类型转换可以使用 cast 函数数据类型转换
select 100 + to_number('50') from dual; --字符串转数值 | --输出 150。to_number(str):字符串转数值 |
select 100 + '50' from dual; | --输出150。默认也会自动转换的。 |
--to_char(date,'pattern'):日期转字符串 | |
select to_char(sysdate,'yyyy-mm-d hh:mi:ss') from dual; --日期转字符串 | --格式化日期为指定格式的字符串。默认为 12小时制 |
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; | --格式化日期为指定格式的字符串。指定为 24小时制 |
select to_char(sysdate,'yyyy') from dual; | --输出年份,如 2019 |
select to_char(sysdate,'mm') from dual; | --输出月份,如 05 |
select to_char(sysdate,'dd') from dual; | --输出日期,如 28 |
select to_char(sysdate,'hh24') from dual; | --输出小时(24小时制),如 15 |
select to_char(sysdate,'mi') from dual; | --输出分钟,如 04 |
select to_char(sysdate,'ss') from dual; | --输出秒钟,如 40 |
select to_char(sysdate,'dd') from dual; | --表示一个月中的第几天 |
select to_char(sysdate,'ddd') from dual; | --表示一年中的第几天 |
select empno,ename,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp; | --格式化日期输出 |
select to_char(sysdate,'d') from dual; | --表示一个星期中的第几天,1表示星期天,2表示星期1,以此类推 |
select to_char(sysdate,'day') from dual; | --输出当前是星期几,比如:星期五 |
--to_date('str','pattern'):字符串转日期 | |
select to_date('2019-08-25 09:25:33','yyyy-mm-dd hh:mi:ss') from dual; | --输出 2019/8/25 9:25:33。 12小时制时,小时数不能超过12,否则报错。 |
select to_date('2019-08-25 19:25:33','yyyy-mm-dd hh24:mi:ss') from dual; | --输出 2019/8/25 19:25:33。 24小时制 |
select to_date('2019-08-25 09:25','yyyy-mm-dd hh:mi') from dual; | --输出 2019/8/25 9:25:00 |
select * from emp where hiredate between to_date('1981-06','yyyy-mm') and to_date('1982-07','yyyy-mm'); | --查询 1981年6月 到 1982年7月入职的员工 |
--对当前时间只取 年-月-日 select to_date(to_char(sysdate,'YYYY-MM-DD'),'YYYY-MM-DD') as sydate from dual; |
通用函数
1、nvl(param1,param2):如果 param1 等于 null,则返回 param2,否则返回 param1 自身。
2、nvl2(param1,param2,param3):如果 param1 等于 null,则返回 param3,否则返回 param2。
3、nullif(param1,param2):如果 param1 等于 param2 ,则返回 null,否则返回 param1.
4、decode(表达式,值1,结果1,[值2,结果2...][,否则]:select 中实现 if else 功能。
5、coalesce(expression1, expression2, ... :
返回列表中第一个非null表达式的值,如果所有表达式求值为null,则返回 null,比如 expression1 结果不为 null 时,则返回它,否则判断expression2结果是否为null,不为 null 时,则返回expression2,依此类推。
千万注意:Oracle 中值为 null 的字段是不能做算术运算的,比如加减乘除、它的结果会恒为 null,此时可以借助 nvl 函数。
update temp set f8 = f1 + f2 + f3 where id = 2;--只要 f1,f2,f3 中有一个值为 null,则 f8 会恒为 null
select nvl(null,'is null') from dual; | --输出 is null |
select nvl('Hi','is null') from dual; | --输出 Hi |
select nvl2(null,100,200) from dual; | --输出 200 |
select nvl2('Hi',100,200) from dual; | --输出 100 |
select ename,job,nvl(comm,50) from emp; | --没有奖金的员工统一加上 50 |
select ename,job,nvl2(comm,comm+50,150) from emp; | --没有奖金的员工统一加上 150,有奖金的再加上 50 |
select nullif(100,100) from dual; | --输出 null |
select nullif(100,120) from dual; | --输出 100 |
select t.*,decode(t.job,'MANAGER','经理','CLERK','办事员','SALESMAN','推销员','普通员工') as personRank from emp t; | |
select EMPNO,ENAME,JOB,MGR,HIREDATE,sal,coalesce(COMM,0) as COMM,DEPTNO from emp; -- 如果奖金为 null,则输出0 | |
忽略大小写查询字符串
1、当想要忽略大小写查询字符串时,可以通过如下方式进行查询
-- 方式1:参数与数据库值统一转为大写进行查询
SELECT T.* FROM emp t where upper(t.ename) = upper('Scott');
-- 方式2:参数与数据库值统一转为小写进行查询,
SELECT T.* FROM emp t where lower(t.ename) = lower('Scott');
-- 方式2 initcap 函数,将字符串的第一个字母变为大写,其余位置字母为小写
SELECT T.* FROM emp t where initcap(t.ename) = initcap('Scott');
trunc 截断数字和日期
1、TRUNC 函数用于对值进行截断,通常用于截断数字和日期
2、格式:TRUNC(suorce, length),source 表示被截断的数字,length 表示保留小数位数,或者是日期的格式项 yyyy,mm,dd hh,hh24,mi,ss 。
3、trunc 截断小数时不会四舍五入。
4、length 为空时,默认截断所有小数位,为负数时表示截取整数,截断的整数用0替代。
5、length 为空时,默认截断日期的年月日,舍弃时分秒。
截断数字示例:
select trunc(3.14159) from dual;--3
select trunc(3.14159,0) from dual;--3
select trunc(3.14159,1) from dual;--3.1
select trunc(3.14159,3) from dual;--3.141
select trunc(314159.67767,-3) from dual;--截取整数 314000
select ename,job,trunc(sal,0) from emp;--对薪资进行取整.截断是没有四舍五入的
截断日期示例:
select sysdate,trunc(sysdate,'yyyy') from dual;-- 截取到年:2021/9/5 16:48:05 2021/1/1
select sysdate,trunc(sysdate,'mm') from dual;-- 截取到月:2021/9/5 16:48:05 2021/9/1
select sysdate,trunc(sysdate,'dd') from dual;-- 截取到天:2021/9/5 16:48:05 2021/9/5
select sysdate,trunc(sysdate,'hh24') from dual;-- 截取到时:2021/9/5 16:48:05 2021/9/5 16:00:00
select sysdate,trunc(sysdate,'mi') from dual;-- 截取到分:2021/9/5 16:48:05 2021/9/5 16:48:00
select sysdate,trunc(add_months(sysdate,-1),'mm') from dual;-- 获取上月第一天 2021/9/5 16:48:05 2021/8/1
select sysdate,trunc(sysdate) from dual;-- 获取今天的日期:2021/9/5 16:48:05 2021/9/5
select sysdate,trunc(sysdate,'d') from dual;-- 获取当前星期的第一天(星期天) 2021/9/5 16:48:05 2021/9/5
Oracle 基本函数-数值、字符、 Instr()、日期、转换、SQL 操作符、trunc 截断相关推荐
- oracle 日期改字符格式_oracle怎么把数值型日期转换成日期字符型
展开全部 oracle把数值型日期转换bai成日期字符du型的操作方法和详细步骤zhi如下: 1.首先dao,将字符串类型版转换为权数字类型. 此方法使用to_number()直接进行转换. 具体语法 ...
- oracle 日期改字符格式_oracle 日期转换格式
在网上看见不少oracle新学者对oracle的时间格式很烦,经常是设计了一个带时间字段的表之后,向表插入数据失败.回想起自己刚开始学习oracle时,也对这个时间格式摸不着头脑,虽然是小小的问题,高 ...
- 20,sql 测试 : 1.4g 文件的 sql 运行测试,表关联,日期转换,字符编码,乱码解决,程序的 shell 执行,字符串转数字,三个隐式转换,用列分区,输出,sum over
一 ,基础操作 : 1 ,表关联 : select stock.area,goods.smallLei,goods.typeColorId,weekofyear(to_date(stock.sellD ...
- Oracle SQL实现日期转换时间戳时间戳转化日期
Oracle SQL实现日期转换时间戳时间戳转化日期 -- 日期转换为毫秒级时间戳 24*60*60 *1000 SELECT (to_date('2019/4/11 14:45:43' ...
- oracle 日期转换成毫秒数,ORACLE:毫秒与日期的相互转换,获取某天的信息
毫秒转换为日期 SELECT TO_CHAR(1406538765000 / (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY- ...
- sql to_char 日期转换字符串
sql to_char 日期转换字符串 1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具 ...
- oracle 并接去掉字符串,ORACLE删除字符-TRIM字符截取-substr查找字符-instr
TRIM函数,最简单的功能就是来去除字符串的行首和行尾的空格,返回值类型是varchar2; 1.TRIM函数的完整语法描述 TRIM([{{LEADING | TRAILING | BOTH} [ ...
- oracle 天转换成月函数_oracle 日期转换格式 函数
1 oracle对时间格式的数据存贮 oracle数据库中存放时间格式的数据,是以oracle特定的格式存贮的,占7个字节,与查询时显示的时间格式无关,具体哪个字节表示什么,我不太清楚,请高手补充.存 ...
- SQL 日期转换函数
SqlServer日期(convert函数,getdate函数) 函数GETDATE()的返回值在显示时只显示到秒.实际上,SQL Sever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒 ...
- 字符转换to_char函数与日期转换to_date函数
字符转换to_char函数与日期转换to_date函数 多种日期表示格式: YYYY:四位表示的年份 YYY,YY,Y:年份的最后三位.两位或一位,缺省为当前世纪 MM,mm:0112的月份编号 MO ...
最新文章
- 人工智能赋能智慧停车 准确预订车位
- 跟我学,轻松安装开源ERP软件Open ERP
- 普通 项目打包包含第三方jar包
- 跨域资源请求(除jsonp以外)的方法
- anaconda3+pytorch踩坑
- 【解决方案 二十五】如何对Excel表数据进行彻底转置
- MI(mutal information)and Entropy
- 为什么计算机休眠风扇还转,Win10电脑睡眠但风扇还在转怎么办
- aardio - 仿安装界面进行窗口高度调节的方法
- 手把手教你使用Python抓取QQ音乐数据!
- 【罗塞塔石碑】—My Lover(One.iso)
- ESP32自定义分区表
- 支付业务名词及释义大全
- 大数据技术之_17_Storm学习_Storm 概述+Storm 基础知识+Storm 集群搭建+Storm 常用 API+Storm 分组策略和并发度
- mysql显示服务器地址,怎样查看mysql服务器所在地址
- 基于函数回调方法对qsort()进行修改,使用冒泡排序实现对不同类型数据的排序
- office哪个版本最好用、占用资源最少?
- 单位元转换万元怎么转_金额单位元,改成万元,这样的数据有上百个,怎么办?...
- oracle分页改写为mysql_mysql和oracle分页
- 永磁无刷直流电机与永磁同步电机比较和分析
热门文章
- 漫谈 Clustering (追忆篇): Regularized GMM
- 拓端tecdat|Matlab正态分布、历史模拟法、加权移动平均线 EWMA估计风险价值VaR和回测Backtest标准普尔指数 SP500时间序列
- java递归实现汉字组词穷举_Javascript迭代、递推、穷举、递归常用算法实例讲解...
- python实现池化操作
- 计算机存储地址如何,计算机内存地址只有5种表现形式吗,为什么?
- 华科c语言作业,华中科技大学标准c语言程序设计及应用习题答案
- php pacs,PACS系统
- 遥感数据集_最新高光谱遥感数据集
- Caffe各版本与源码全透析
- Linux一些最基本命令