添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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数据库中主要使用两种类型的函数:

单行函数

对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,
比如:MOD(x,y)返回 x 除以 y 的余数 (x和y)可以是两个整数,也可以是表中的整数列)

常用的单行函数有:
字符函数:对字符串操作。
数字函数:对数字进行计算,返回一个数字。
转换函数:将一种数据类型转换为另外一种数据类型。
日期函数:对日期和时间进行处理。
聚合函数 聚合函数同时可以对多行数据进行操作,并返回一个结果。比如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 ) 用于截断浮点型数据,.
第二个参数表示截断小数点后面的第几位,不会进行四舍五入,number 默认为0。如果第一个参数是字符串,则报错。

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.

pl/sql示例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:返回字符串并将字符串的第一个字母变为大写,其余位置字母为小写;

lpad (目标内容, 目标长度,往左侧填充的内容) :在目标内容的左侧填充内容,直到达目标长度,未指定填充内容时,默认为空格。
rpad (目标内容, 目标长度,往右侧填充的内容) :在目标内容的右侧填充内容,直到达目标长度,未指定填充内容时,默认为空格。
特别注意 ,如果目标内容的长度小于目标长度,则会对目标内容进行截取,后面多余会直接舍弃。

-- 09 09 0
select lpad('9',2,'0'), lpad('09',2,'x'), lpad('09',1,'x') from dual;
--      Test
select lpad('Test', 10) from dual;
--生成2013年1到12月,如 201302、201310
select SUBSTR('2013xx', 1, 4) || lpad(level, 2, 0) ymd from dual connect by level<=12;

--查询编号为7839的员工,及其下属的员工,并标记级次(从1开始),并在名字前标记#号,是几级就加几个前缀#
--如 #KING、###SCOTT
select level, empno, rpad('#', level, '#') || ename ename  from emp start with empno = 7839 connect by prior empno = mgr;

字符串查找函数 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(number [,'格式']);
-- 注意事项1:'9' 表示如果存在数字则显示数字,不存在则显示空格。
-- 注意事项2:'0' 表示如果存在数字则显示数字,不存在则显示0,即占位符。
-- 注意事项3:'$'  表示金额符号
-- 注意事项4:格式中的位数不能小于 number 的位数,否则结果就是 ################
-- 注意事项5:'x' 表示十六进制.
-- 注意事项6:'FM' 表示删除因为'9'带来的空格。

-- 纯数字转字符串:88877.2561
select to_char(88877.2561) from dual;
-- 纯数字转字符串:.2561
select to_char(0.2561) from dual;

-- 如果小于1,必须加0:-0.860
select trim(to_char(-0.8596,'0.999')) from dual;
-- 如果小于1,必须加0: 0.187
select trim(to_char(0.18654,'0.999')) from dual;
-- -485.000
select trim(to_char(-485, '999999999.000')) from dual;
-- 148.500
select trim(to_char(148.5,'999999999.000')) from dual;
-- 转为10位整数(小数部分舍弃),不足的前面补0:0000088455
select trim(to_char(88455,'0999999999')) from dual;
-- 转为10位整数,小数部分保留3位(四舍五入),不足的前面补0:0000088455.256
select trim(to_char(88455.2556,'0999999999.000')) from dual;
-- 每三位用逗号分隔(小数部分舍弃):8,545,150,212
select trim(to_char(8545150212.2557,'999,999,999,999')) from dual;
-- 每三位用逗号分隔,小数部分保留3位(四舍五入):8,545,150,212.256
select to_char(8545150212.2557,'FM999,999,999,999.000') from dual;
-- 金额格式转换:$8,545,150,212.256
select trim(TO_CHAR(8545150212.2557,'$999,999,999,999.999')) from dual;
-- 10进制转化为16进制(小数部分不会转):b267
select trim(to_char(45671,'xxxxxxxxx')) from dual;
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;

doc/oracle 中 to_char用法 - 普罗米修斯y - 博客园.pdf · 汪少棠/material - Gitee.com

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中如果删除了表中的某一条数据,还可以通过回滚操作(rollback)进行回滚,假如想清空一张表的数据,但是又不想使其能进行回滚操作,就可以立刻释放资源,这时就需要使用截断表了。它的主要功能就是彻底删除数据,使其不能进行回滚。这里我打个比方大家就立刻能明了它的作用。大家众所周知,当我们在自己的PC(person computer)上删除某一个文件,它并没有彻底删除而是进入了回收站,你... 为了做备份,需要将服务器上的11g的用户的完整数据导出来。机器上的客户端是oracle10g的。用命令:exp ***/***@*** file=****.dmp为了做备份,需要将服务器上的11g的用户的完整数据导出来。机器上的客户端是Oracle10g的。用命令:exp ***/***@*** file=****.dmp full=y执行后,系统提示:EXP-00008:遇到ORACLE错误14... ​ 截断所有的数据 ,如果截断的是主表,结构不能存在外键关联,截断数据同时从结构上检查 --truncate 与 delete 的区别 --共同点: 都能作为删除数据 --不同点: -- 1. truncate是DDL,有关表结构,不会开启事务,不能回滚 -- delete是DML,执行会开启事务,可以回滚 -- 2. truncate 截断所有的数据,即删除一张表的所有数据 -- delete 可以删除全部 或者 部分 1. 区别: '截断(删除)的位置不同、指定字符个数不同' (1) trim() :截断 '左、右' 两边出现的任何指定字符,最多只能指定 '一个字符' (2) ltrim():截断 '左' 边出现的任何指定字符,可指定 '多个字符' (3) rtrim():截断 '右' 边出现的任何指定字符,可指定 '多个字符' -- 若无给定字符,默认 '空格' 2. 不足:'无法截断(删除)中间位置的字符',可通过其它替代方案 在本教程中,您将学习如何使用Oracle TRUNCATE TABLE语句更快更有效地从表中删除所有数据(也叫截断表)。Oracle TRUNCATE TABLE语句简介如果要从表中删除所有数据,可以使用不带WHERE子句的DELETE语句,如下所示:DELETE FROM table_name;对于有少量行记录的表,DELETE语句做得很好。 但是,当拥有大量行记录的表时,使用DELETE语句删... Oracle查询结果表中,我们想将包含特定字符串的某字段转换为其他字符串进行显示,其作用类似于代码中常见的条件分支语句case when。其实,Oracle中也有相应的条件分支case when语法,结合字符串判断语方法instr,即可达到相应目的。 如下示例: select t.id,t.f_flowtaskid,t.f_name, 日期转换字符串:"TO_CHAR" (SYSDATE, 'yyyy-MM-dd') 字符转换日期:TO_DATE (str,'yyyy-mm-dd hh24:mi:ss') 但是这里有个要求str 的格式是要 2020-01-01 00:00:00的,斜杆 / 这种是不可以的 如果str长度到日 比如:'2020-01-01' ,是不能转换为 yyyy-mm的 只能转换不能截取,这里和mysql不同。如果想要到月为止,就只能在通过substring截取。 格式1解释 :instr(源字符串, 目标字符串) 格式2:instr( string1, string2, start_position, nth_appearance) 格式2解释:instr(源字符串, 目标字符串, 起始位置, 匹配序号) 格式1实例 select instr('helloworld','l') from table --返回结果:3 默认第... 1:整数到时间的转换:create or replace function inttotime(in_number NUMBER) return date is  begin   return(TO_DATE('19700101','yyyymmdd') + in_number/86400 +TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24)...