文章目录
- 1、Oracle 11g 数据库支持中文的逗号
- 2、获取Oracle数据库的版本号
- 3、REGEXP_SUBSTR函数的使用(regexp_substr)
- 4、replace的使用
- 5、字符和日期类之间的转换
- 6、获取当前是星期几
- 7、使用to_char获取对应的星期格式
- 8、connect by
- 9、union和union all的区别
- 10、group by
1、Oracle 11g 数据库支持中文的逗号
2、获取Oracle数据库的版本号
--第一张图
SELECT * FROM V$VERSION;
--第二张图
SELECT * FROM PRODUCT_COMPONENT_VERSION
3、REGEXP_SUBSTR函数的使用(regexp_substr)
REGEXP_SUBSTR(source_char, pattern [, position [, occurrence [, modifier ]]])
source_char :需要进行正则处理的字符串
pattern :进行匹配的正则表达式
position :起始位置,从第几个字符开始正则表达式匹配(默认为1)
occurrence :标识第几个匹配组,默认为1
modifier :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)
测试:
--1、查询使用正则分割后的第一个值,也就是34
SELECT REGEXP_SUBSTR('34,56,-23','[^,]+',1,1,'i') AS STR FROM DUAL;
--结果是:34
--2、查询使用正则分割后的最后一个值,也就是-23
SELECT REGEXP_SUBSTR('34,56,-23','[^,]+',1,3,'i') AS STR FROM DUAL;
--结果是:-23
--3、获取一个多个数值的列,从而能够让结果以多行的形式展示出来
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=7;
--结果是:
--1
--2
--3
--4
--5
--6
--7
--4、将上面REGEXP_SUBSTR的occurrence关联
SELECT NVL(REGEXP_SUBSTR('34,56,-23', '[^,]+', 1, LEVEL, 'i'), 'NULLL') AS STR FROM DUAL CONNECT BY LEVEL <= 7;
--结果是:
--34
--56
---23
--null
--null
--mull
--null
--5、优化上面的SQL语句,让生成的行的数量符合实际情况
SELECT REGEXP_SUBSTR('34,56,-23', '[^,]+', 1, LEVEL, 'i') AS STR FROM DUAL
--
--获取到有几个数字
CONNECT BY LEVEL <= LENGTH('34,56,-23') - LENGTH(REGEXP_REPLACE('34,56,-23', ',', '')) + 1;
--结果是:
--34
--56
--23
4、replace的使用
regexp_replace与replace作用相同,但功能更加强大
repalce(str_source,str1,str2) 把 str_source 中 str1 字符串替换为 str2 字符串,当 str2 为 null 或'' 时,为剔除
replace(str_source,str1) 把str_source 中的 str1 字符串剔除
regexp_replace(str_source,pattern_str,rep_str) 支持正则表达式,用法类似于 replace,但功能更强大
regexp_replace(str_source,pattern_str) 把 str_source 中的 pattern_str 字符串剔除
测试:
--当我们想要剔除大小写的时候,我们可以在length的基础上使用大小写的转换,这样我们统计的字符就不用再去多余的做匹配
SELECT ROWNUM,
REGEXP_SUBSTR('klFjsdlfjlksdafkdjsaklfdsfhjsdhfjGFGHFJHJFjlfrtrfhhh', '[^f]+', 1, LEVEL, 'i')
FROM DUAL
CONNECT BY LEVEL <=
LENGTH('klFjsdlfjlksdafkdjsaklfdsfhjsdhfjGFGHFJHJFjlfrtrfhhh') -
LENGTH(REPLACE(LOWER('klFjsdlfjlksdafkdjsaklfdsfhjsdhfjGFGHFJHJFjlfrtrfhhh'),'f')) + 1
5、字符和日期类之间的转换
--打印当前的年月日时分秒。注意分钟要使用mi,否则会出现格式代码出现两次的错误(第一个图)
SELECT to_char(SYSDATE,'yyyy-mm-dd--HH24:mi:ss') FROM dual
with params as
(select '2019-04-04' begDate from dual)
--获取指定的参数,将其转换成对应的日期格式,并执行对应的月份操作,最终获取日期的年份(第二个图)
select to_char(add_months(to_date((SELECT begDate FROM PARAMS),'yyyy-mm-dd'),+12),'yyyy') from dual
6、获取当前是星期几
--后面的标识符使用d 即表示输出星期几
SELECT to_char(sysdate - 1, 'd') FROM dual
--结果:今天正常的是星期三
7、使用to_char获取对应的星期格式
select
--1、先获取到当前星期几
--2、在拿到我们这周的第一天
--3、利用rownum(行号1,2,3...)完成对日期的加减运算,达到计算出上一个星期的效果
sysdate - (to_number(to_char(sysdate - 1, 'd')) - 1) - (rownum - 1) * 7 as startDate,
sysdate + (7 - to_number(to_char(sysdate - 1, 'd'))) - (rownum - 1) * 7 as endDate,
--1、获取日期有iw和ww两种,iw为自然周,ww为以1月1日为起点的为一周
--2、依然利用行号完成星期的运算
to_number(to_char(sysdate, 'iw')) - rownum + 1 as weekIndex
from dual
connect by level<= 4;
8、connect by
--基本用法:可以对指定数据输出指定的行数
SELECT SYSDATE FROM dual
CONNECT BY LEVEL <5 --将level修改为rownum也可以。我可以将我需要的数据打印4行,数字5也可以是一个变量,方便我们修改数据
--高级用法:用来父子节点的嵌套输出数据
9、union和union all的区别
--UNION ALL不会合并相同的数据
--UNION 会合并相同的数据
SELECT SYSDATE FROM dual
UNION ALL
SELECT SYSDATE FROM dual
10、group by
--由于group by的意义为将数据分组,即我们查询出来的字段应该为一个集合数据,而非我们最初的单个数据
--即select后面只能跟group by后面的字段或者聚合函数字段
SELECT orddate,sum(intordid),avg(sysordid) FROM ttrd_otc_trade GROUP BY orddate