oracle SQL高级使用总结


=====================================================================
正则表达式函数
---------------------------------------------------------------------------
元字符    字符含义
^    匹配字符串的开始位置(在[]中使用,此时它表示不接受该字符集合。
-    当使用在a-m表示范围;
当使用在第一个字符时表示
连字符串,如[-abc]
$    匹配字符结束位置
.    匹配除换行符 n之外的任何单字符。
?    匹配前面的子表达式零次或一次
*    匹配前面的子表达式零次或多次
+    匹配前面的子表达式一次或多次
()    标记一个子表达式的开始和结束位置
[]    标记一个中括号表达式
{m,n}    m= <出现次数 <=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
|    表示或者的关系。指明两项之间的一个选择
字符簇    字符含义
[[:alpha:]]     任何字母。
[[:digit:]]     [[:digit:]] 任何数字。
[[:alnum:]]     任何字母和数
[[:space:]]     任何白字符。
[[:upper:]]    任何大写字母。
[[:lower:]]     任何小写字母。
[[:punct:]]     任何标点符号。
[[:xdigit:]]     任何16进制的数字,相当于[0-9a-fA-F]。
---------------------------------------------------------------------------------
名称    语法    备注
REGEXP_LIKE    REGEXP_LIKE
(source_string,
pattern
[, match_parameter]
)    source_string:
源字符串
Pattern:
正则表达式
match_parameter:
匹配模式(i:不区分大小写;c:区分大小写;n:允许使用可以匹配任意字符串的操作符;m:将x作为一个包含多行的字符串。
REGEXP_REPLACE    REGEXP_REPLACE
(source_string,
pattern
[,replace_string]
[,position]
[,occurtence]
[,match_parameter]
)    replace_string:
用于替换的字符串
Position:
开始搜索的起始位置
occurtence
指定替换第n次出现字符串
其他同上。
REGEXP_SUBSTR    REGEXP_SUBSTR
(source_string, pattern
[,position
[,occurrence
[,match_parameter]]]
)    Position:
指定在字符串中准确位置,默认为1
Occurrence:
指定在源字符串匹配过程中相对其他字符串,哪个字符串应该匹配。例如
select regexp_substr('The zip code
80831 is for falcon, co',
'[[:alpha:]]{3,}', 1, 3)
from dual;
结果选择的是code而非The或zip。
REGEXP_INSTR    REGEXP_INSTR
(source_string,
pattern
[,start_position
[,occurrence
[,return_option
[,match_parameter]]]]
)    start_position:
开始搜索位置
Occurrence:
第n次出现pattern,默认为1
return_option:
0:pattern的起始位置
1:pattern下一个字符起始位置
默认为0
REGEXP_COUNT    REGEXP_COUNT
(source_string,
pattern
[[,start_position]
[,match_parameter]])    11g新增的函数,表示pattern在原字符串中出现的次数
start_position:
开始搜索的位置
----------------------------------------------------------------------------------------

select REGEXP_REPLACE('abc123dsdfo456dfaj78dsl','[^0-9]','') from dual
12345678

select REGEXP_REPLACE('abc123dAdfo456dfaj78dsl','[a-z|A-Z]','') from dual
12345678

select REGEXP_REPLACE('abc123dAdfo456dfaj78dsl','[0-9]','') from dual
abcdAdfodfajdsl

select regexp_count('w20a14as', '[^0-9]', 5) from dual
2

select regexp_substr('The zip code 80831 is for falcon, co', '[[:alpha:]]{3,}', 1, 4) from dual;
for

Regexp_substr('first filed, second filed, third filed', ', [^,]*,')    , second filed,

regexp_replace('aa bb cc','(.*) (.*) (.*)','\3 \2 \1')

regexp_replace('Jone   smith','( ){2,}',' ')

regexp_substr('the final test is is the implention','([[:alnum:]]+)([[:space:]]+)\1')   is  is

========================================================================================
窗口函数(oracle称分析函数)

select deptno,sal,row_number() over(partition by deptno order by t.sal desc) from scott.emp t;
=====================================================================================================
时间和字符串函数
select trunc(to_date(to_char(sysdate,'yyyymmdd'),'yyyymmdd'),'month') from dual;
=======================================================================================================

connect by 字句

select * from emp start with empno=7839 connect by  prior empno=mgr;
select * from emp  connect by  prior empno=mgr start with empno=7839;

select * from emp start with empno=7566 connect by  prior empno=mgr;
select level,t.* from emp t start with empno=7566 connect by   empno= prior mgr;
select level,t.* from emp t connect by  prior mgr=empno start with empno=7934;

SELECT t.empno EMPNO,RPAD(' ',LEVEL*3) ||ENAME EMPLOYEE,MGR
FROM EMP t
CONNECT BY PRIOR EMPNO=mgr
START WITH ENAME='KING';
 
select count(*) from
(SELECT level,LEVEL + to_date('2014' || '0101', 'yyyymmdd') - 1 daycd
                                           FROM   dual
                                           CONNECT BY LEVEL BETWEEN 0 AND (to_date('2015' || '0101', 'yyyymmdd') + 6 -
                                                      to_date('2014' || '0101', 'yyyymmdd')))
==============================================================================================================================
model 字句

select ArrValue,soeji
from (select 'abcdefghijklmn' as ArrValue,
        1 as soeji from dual)
model
dimension by(soeji)
measures(ArrValue)
rules(ArrValue[1] = 'Hello World');

model model语句的关键字,必须。
dimension by dimension维度的意思,可以理解为数组的索引,必须。
measures 指定作为数组的列
rules 对数组进行各种操作的描述。
                                                      
select ArrValue,soeji
from (select 'abcdefghijklmn' as ArrValue,
1 as soeji from dual)
model
dimension by(soeji)
measures(ArrValue)
rules(ArrValue[1] = 'Hello World',
ArrValue[2] = 'Hello model');

rules的缺省行为是存在就更新,不存在则追加
model语句里面,索引可以是不连续的。

select ArrValue,soeji
  from (select 'abcdefghijklmn' as ArrValue,
        1 as soeji from dual)
 model return updated rows
dimension by(soeji)
measures(ArrValue)
rules(ArrValue[4] = 'Hello CodeZine');
结果是:
ArrValue       soeji    
Hello CodeZine    4
 使用model return updated rows的话,被rules(可省略)更新或者插入的行才显示,没有更新过的行不再作为SQL的结果。

使用位置标记或符号标记之间有一个区别需要了解,即它们处理维度中空值的方式不同。
例如,sales_amount[null,2003]返回月份为空值、年份为2003的销量,
而sales_amount[month=null,year=2004]则不会访问任何有效的数据单元,因为null=null的返回值总是false。

BETWEEN和AND关键字可用于访问一段范围内的数据单元。例如,下面这个表达式将2004年1月的销量设置为2003年1月至3月销量的平均值取整:
Sales_amount[1,2004]=ROUND(AVG(sales_amount)[month between 1 and 3,2003],2)

可以用ANY和IS ANY谓词访问数组中所有的数据单元。ANY和位置标记合用,IS ANY和符号标记合用。
例如,下面这个表达式将2004年1月的销量设置为所有年份月份的销量之和取整:
Sales_amount[1,2004]=ROUND(SUM(sales_amount)[ANY,year IS ANY],2)

CURRENTV()函数用于获得某个维度的当前值。
例如,下面的表达式将2004年第一个月的销量设置为2003年同月销量的1.25倍。注意此处用CURRENTV()获得当前月份,其值为1
Sales_amount[1,2004]=ROUND(sales_amount[CURRENTV(),2003]*1.25,2)

可以通过FOR循环访问数据单元。
例如,下面这个表达式将2004年前三个月的销量设置为2003年相应月份销量的1.25倍。
注意其中使用了FOR循环,还通过INCREMENT关键字定义每一次循环迭代中month的增量:
Sales_amount[FOR month from 1 TO 3 INCREMENT 1,2004]=ROUND(sales_amount[CURRENTV(),2003]*1.25,2)

当数据单元指定的记录在MODEL子句执行之前存在,则IS PRESENT返回TRUE。例如:
Sales_amount[CURRENTV(),2003] IS PRESENT
如果Sales_amount[CURRENTV(),2003]存在,则返回TRUE。
下面的表达式将2004年前三个月的销量设置为2003年同期销量的1.25倍:
Sales_amount[FOR month from 1 TO 3 INCREMENT 1,2004]=
CASE WHEN Sales_amount[CURRENTV(),2003] IS PRESENT THEN
ROUND(sales_amount[CURRENTV(),2003]*1.25,2) ELSE 0 END


如果cell引用的记录在MODEL子句执行以前就存在,那么PRESENTV(cell,expr1,expr2)返回表达式expr1。如果这条记录不存在,则返回表达式expr2。例如:
PRESENTV(sales_amount[CURRENTV(),2003],ROUND(sales_amount[CURRENTV(),2003]*1.25,2),0)
如果sales_amount[CURRENTV(),2003]存在,上面的表达式返回取整后的销量;否则,返回0.下面这个查询展示了上述表达式的用法:
select prd_type_id,year,month,sales_amount
from all_sales
where prd_type_id between 1 and 2 and emp_id=21
model
partition by (prd_type_id)
dimension by (month,year)
measures (amount sales_amount)
(
Sales_amount[FOR month from 1 TO 3 INCREMENT 1,2004]=
PRESENTV(sales_amount[CURRENTV(),2003],ROUND(sales_amount[CURRENTV(),2003]*1.25,2),0)
)
Order by prd_type_id,year,month;


使用IGNORE NAV和KEEP NAV
IGNORE NAV的返回值如下:
空值或缺失数字值时返回0。
空值或缺失字符串值时返回空字符串。
空值或缺失日期值时返回01-JAN-2000。
其他所有数据库类型时返回空值。
KEEP NAV对空值或缺失数字值返回空值。注意默认条件下使用KEEP NAV。
下面这个查询展示了IGNORE NAV的用法:
select prd_type_id,year,month,sales_amount
from all_sales
where prd_type_id between 1 and 2 and emp_id=21
model IGNORE NAV
partition by (prd_type_id)
dimension by (month,year)
measures (amount sales_amount)
(
Sales_amount[FOR month from 1 TO 3 INCREMENT 1,2004]=ROUND(sales_amount[CURRENTV(),2003]*1.25,2)
)
Order by prd_type_id,year,month;


默认情况下,如果表达式左端的引用单元存在,则更新该单元。如果该单元不存在,就在数组中创建一条新的记录。
可以用RULES UPDATE改变这种默认的行为,指出在单元不存在的情况下不创建新纪录。
======================================================================================================
游标
where current of cursor_name


===============================
提取时间
select extract(day from to_date('20131231','yyyymmdd')) from dual;
select to_char(sysdate,'yyyy') from dual;

++++++++++++++++++++++++++++++
疑问
select name,type,source_size,parsed_size,code_size
from user_object_size
where code_size > &&1 * 1024
order by code_size desc



























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
精通 Oracle SQL 是指熟练掌握使用 Oracle 数据库的 SQL 语言进行数据查询、操作和管理的能力。 在实际应用中,Oracle SQL 可以用于创建和管理数据库对象,如表、索引、触发器等。可以使用 SQL 查询语句进行数据的增删改查操作,将数据存储到表中、更新已有数据、删除不需要的数据。同时,还可以使用 SQL 语句查询和统计数据库中的数据,包括单表查询、多表连接查询、子查询、分组聚合查询等,满足复杂的数据分析需求。 精通 Oracle SQL 的案例可以涉及以下几个方面: 1. 数据库表的创建和管理:通过 SQL 语句创建表,并使用各种约束(如主键、外键、唯一性约束等)保证数据的完整性和一致性。可以设计复杂的表结构,根据业务需求合理划分表,并建立索引提升查询性能。 2. 数据的增删改查:使用 INSERT、UPDATE、DELETE 语句对数据进行插入、更新和删除操作,保持数据的准确性和实时性。通过 SELECT 语句进行数据查询,包括简单的查询和复杂的多表连接查询,使用各种条件和函数进行数据筛选和分组。 3. 数据库性能调优:根据 Oracle 的优化器原理,编写高效的 SQL 语句,使用适当的索引、合理的查询条件和表连接方式,提高数据库的查询性能。了解并使用 Explain Plan 和 SQL Trace 等工具进行 SQL 语句的性能分析和调优。 4. 触发器和存储过程:根据实际需求,编写触发器和存储过程,实现复杂的业务逻辑,保证数据的完整性和一致性。可以结合 PL/SQL 编程语言,编写包含逻辑判断、循环、异常处理等的存储过程,实现更高级的功能。 5. 数据库备份和恢复:了解 Oracle 的备份和恢复机制,使用备份工具进行数据的定期备份,可以使用 SQL*Loader 或 Data Pump 等工具导入导出数据,实现数据库的迁移和复制。 总结来说,掌握 Oracle SQL 可以实现对 Oracle 数据库的全面控制和操作,能够高效地进行数据管理和查询,提供数据分析和决策支持。通过不断学习和实践,不断完善和提升自己的 SQL 技能,可以成为一名优秀的 Oracle 数据库开发人员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值