oracle常用语法汇总(持续更新)

oracle常用语法汇总(持续更新)

1、取随机数

select dbms_random.random from dual -- 可正可负

select MOD(DBMS_RAMDOM.RAMDOM,100) FROM DUAL;--产生一个100以内的随机整数

mod(m,n)函数返回m/n的余数

select trunc(DBMS_RAMDOM.RANDOM.VALUE(M,N),0);--产生一个M,N之内的随机整数

trunc(m,n)截取数据,m代表要截取的数字,n代表保留位数

SELECT DBMS_RAMDOM.STRING('P',20);--P代表可打印的字符,20代表字符串长度

2、decode

decode主要用于简化SQL,增加可读性,作用类似于if..else

select decode(condition,result1,return1,result2,return2...) from dual

可以理解为:

if(condition=result1) return1

else if(condition=result2) return2

3、start with... connect by ...

这个语法的作用是实现类似于树结构的嵌套查询。
比如有这么一个表结构:单位(id,单位编号dept_no,上级单位编号p_dept_no,单位名dept_name),一直某一个单位的编号,想要查询出它和它的直接附属单位,以及它的附属单位的附属单位(查询出该单位下的所有单位),可以这么写

select * from dept start with dept_no = '123' connect by prior dept_no = p_dept_no

类似于自连接子查询(不相同)

select a.* from dept a ,dept b where a.dept_no='123' and a.p_dept_no = b.dept_no

不相同是因为start with connect by 的作用更强,它能够查询到树根,而子查询仅仅能查询到直接的父节点
如果想查询该单位和该单位的直接上级单位以及它的上级单位的上级单位,只需要改变prior的位置

select * from dept start with dept_no = '123' connect by dept_no = prior p_dept_no

关于prior什么情况下应该写到什么地方,需要这么理解:
如果是要查叶子结点及其子节点,prior应该出现在=的左边,否则出现在=右边;

4、exists

exists作为条件过滤器,与其他where的条件一同发生作用,不会产生短路的效应。
如果exists返回值不为空,那么查询条件不会被执行。
应用场景一般是对返回结果集的过滤:A在B表中有记录,那么就查询所有A中的相应的记录

select * from A where exists(select 1 from A where A.org_no = B.org_no)

exists和in的比较:

如果A记录数<<B的记录数,exists的效率比较高

如果A记录数>>B的记录数,in的效率比较高

5、instr()

俗称字符查找函数,返回目标字符的位置

instr(str1,str2)

str1代表原字符串,str2代表目标字符串

instr(str1,str2,start,nth_appear)

start代表开始查找的位置,nth_appear代表第n次出现目标字符str2

猜你喜欢

转载自www.cnblogs.com/masTerpie/p/11973978.html