oracle 函数REGEXP_SUBSTR使用字段时为什么变慢了
TABLE S (subject mark)vio_operate_check有多行,dual只有一行 ,这是递归调用,行多就慢
oracle递归函数_oracle递归向上汇总
oracle递归函数_oracle递归向上汇总
常用的有:
你的条只有一条Sql代码记录当然快了...
第二条慢是正常的,而且还有树形查询..
可以看看
在ORACLE中,函数的调用方式分别是哪几种?
connect_by_root函数用来列的前面 记录的是当前的根的内容在ORACLE中,函数的调用方式有位置表示法调用函数、命名表示法调用函数、混合使用位置表示法和命名表示法调用函数、排除表示法、ql调用表示法 --混合表示法。
a liu wang甲骨文股份有限公司(Oracle)是全SELECT 球大型数据库软件公司,总部位于美国加州红木城的红木岸。在2008年,甲骨文股份有限公司是继Microsoft及IBM后,全球收入第三多的软件公司。Oracle数据库产品为财富排行榜上的前1000家公司所采用,许多大型网站也选用了Oracle系统。甲骨文股份有限公司于正式进入,在、上海、广州和成都均设立了分支机构。
Oracle数据库作时如何使用LOWER()、UPPER()函数
a jin shuOracle LOWER() 和 UPPER()函数WITH tmp AS的使用方法一列返回行不区分大小写 这是常见的做法,使列不区分大小写,以确保您所希望返回所有行。 SELECT FROM COURSES WHERE LOWER(education_delivery_mod) = 'classroom' 您可以使用Oracle的UPPER() or LOSELECT sectype.thekey, sectype.name, sectype.thellWER() 函数来在你的SQL选择格式列SELECT UPPER(FIRSTNAME) AS "FIRSTNAME", LASTNAMEFROM STUDENTS WHERE RowNum < 11 格式一列使用上下功能 它可以使用与串()一起下的Oracle UPPER() or LOWER()函数函数来完成不同类型的格式。 SELECT UPPER(SUBSTR(LASTNAME,1,1)) || LOWER(SUBSTR(LASTNAME,2,29)) FROM STUDENTS WHERE RowNum < 11更新一组行的变化情况 它可以使用一个更新语句Oracle的 UPPER() or LOWER()函数一起使用,以改变“案“的一组行。 UPDATE STUDENTS SET LASTNAME = UPPER(LASTNAME)
oracle 如何查看所有函数
1、安装oracle后,运行程序,输入用户名等信息登录。
2、下面演示sysdate的用法,这个是oracle的,取当前时间。
3、下面介绍to_ch18、select round(789.536) from dual; 四舍五入,舍去小数Sql代码ar()函数的用法,将时间转化为特定的格式。
4、下面介绍一种将时间转化为汉字形式的时间格式及显示出星期。
5、下面演示to_date函数的使用方法,将字12、select initcap('kuka') from dual; 将首字母大写符串转换为标准的时间格式。
oracle里用递归查询的同时可否直接关联其他表
列出当前的根oracle11g递归查询的同时可否直接关联其他b lin ying表对查询结果进一步判断?
oracle两表关联查询可用以下语句。
有以下两张表:
现在要通过deptno字段,在查询中显示emp表中全部内容和dept表中的dname字段。
可用如(SELECT 下语句:
1select a.,b.dname from emp a,dept b where a.deptno=b.deptno;
Oracle树查询及相关函数
27、select add_months(sysdate,4) from dual; 在日期上加上月数以我做过的一个项目中的表为例 表结构如下
FROM flflCREATE TABLE FLFL
(ID NUMBER NOT NULL
MC NVARCHAR ( )
FLJB NUMBER
SJFLID NUMBER
)FLJB是作为树的级别 在很多查询中可以加快SQL的查询效率 在下面演示的功能基本上不使用这个关键字
SJFLID存储的是上级ID 如果是父 该SJFLID为null(得补充一句 当初的确是这样设计的 不过现在知道 表中别有null记录 这会引起全文扫描 建议改成 代替)
我们从最基本的作 逐步列出树查询中常见的作 所以查询出来的以家族中的辈份作比方
查找树中的所有父(辈份最长的人) 设这个树是个目录结构 那么个作总是找出所有的 再根据该找到其下属
SELECT FROM flfl WHERE sjflid IS NULL;
这是个引子 没用到树型查询
查找一个的直属子(所有儿子) 如果查找的是直属子类 也是不用用到树型查询的
这个可以找到ID为 的直属子类
查找一个的所有 直属子(所有后代)
SELECT FROM flfl START WITH ID = CONNECT BY sjflid = PRIOR ID;
这个查找的是ID为 的下的所有直属子类 包括子辈的和孙子辈的所有直属
查找一个的直属父(父亲) 如果查找的是的直属父 也是不用用到树型查询的
SELECT b FROM flfl a JOIN flfl b ON a sjflid = b ID WHERE a ID 查询一个的父的同级(族叔) = ;
这个找到的是ID为 的的直属父 要用到同一张表的关联了
查找一个的所有直属父(祖宗)
SELECT FROM flfl START WITH ID = CONNECT BY PRIOR sjflid = ID;
这里查找的就是ID为 的所有直属父 打个比方就是找到一个人的父亲 祖父等 但是值得注意的是这个查询出来的结果的顺序是先列出子类再列出父类 姑且认为是个倒序吧
上面列出两个树型查询方式 第 条语句和第 条语句 这两条语句之间的区别在于prior关键字的位置不同 所以决定了查询的方式不同 当sjflid = PRIOR ID时 数据库会根据当前的ID迭代出sjflid与该ID相同的记录 所以查询的结果是迭代出了所有的子类记录 而PRIOR ID = sjflid时 数据库会跟据当前的sjflid来迭代出与当前的sjflid相同的id的记录 所以查询出来的结果就是所有的父类结果
以下是一系列针对树结构的更深层次的查询 这里的查询不一定是的查询方式 或许只是其中的一种实现而已
查询一个的兄弟(亲兄弟)
SELECT a
FROM flfl a
WHERE EXISTS (SELECT
WHERE a sjflid = b sjflid AND b ID = );
这里查询的就是与ID为 的同属一个父的了 就好比亲兄弟了
查询与一个同级的(族兄弟) 如果在表中设置了级别的字段 上表中的FLJB 那么在做这类查询时会很轻松 同一级别的就是与那个同级的 在这里列出不使用该字段时的实现!
(SELECT a LEVEL lev
FROM flfl a
CONNECT BY a sjflid = PRIOR a ID)
WHERE lev = (SELECT lev
WHERE ID = )
这里使用两个技巧 一个是使用了LEVEL来标识每个在表中的级别 还有就是使用with语法模拟出了一张带有级别的临时表
查询一个的父的的兄弟(伯父与叔父)
(SELECT flfl LEVEL lev
CONNECT BY sjflid = PRIOR ID)
SELECT b
FROM tmp b
WHERE ID = AND lev = ) a
WHERE b lev =
UNION ALL
WHERE sjflid = (SELECT DISTINCT x ID
FROM tmp x
tmp y
WHERE ID = AND lev > ) z
WHERE y ID = z sjflid AND x ID = y sjflid);
这里查询分成以下几步 首先 将第 个一样 将全表都使用临时表加上级别 其次 根据级别来判断有几种类型 以上文中举的例子来说 有三种情况 ( )当前为 即查询出来的lev值为 那么它没有上级 不予考虑 ( )当前为 级 查询出来的lev值为 那么就只要保证lev级别为 的就是其上级的兄弟 ( )其它情况就是 以及以上级别 那么就要选查询出来其上级的上级(祖父) 再来判断祖父的下级都是属于该的上级的兄弟 就是使用UNION将查询出来的结果进行结合起来 形成结果集
(SELECT a LEVEL lev
FROM flfl a
CONNECT BY a sjflid = PRIOR a ID)
WHERE lev = (SELECT lev
WHERE ID = )
只需要做个级别判断就成了
基本上 常见的查询在里面了 不常见的也有部分了 其中 查询的内容都是的基本信息 都是数据表中的基本字段 但是在树查询中还有些特殊需求 是对查询数据进行了处理的 常见的包括列出树路径等
补充一个概念 对于数据库来说 根并不一定是在数据库中设计的 对于数据库来说 根就是start with开始的地方
下面列出的是一些与树相关的特殊需求
名称要列出名称全部路径
这里常见的有两种情况 一种是是从列出 直到当前的名称(或者其它属性) 一种是从当前列出 直到的名称(或其它属性) 举地址为例 国内的习惯是从省开始 到市 到县 到居委会的 而国外的习惯正好相反(老师说的 还没接过国外的邮件 谁能寄个瞅瞅 )
从顶部开始
SELECT SYS_CONNECT_BY_PATH (mc / )
WHERE ID =
从当前开始
SELECT SYS_CONNECT_BY_PATH (mc / )
START WITH ID =
CONNECT BY PRIOR sjflid = ID;
在这里我又不得不放个牢骚了 oracle只提供了一个sys_connect_by_path函数 却忘了字符串的连接的顺序 在上面的例子中 个SQL是从根开始遍历 而第二个SQL是直接找到当前 从效率上来说已经是千万别 更关键的是个SQL只能选择一个 而第二个SQL却是遍历出了一颗树来 再次PS一下
sys_connect_by_path函数就是从start with开始的地方开始遍历 并记下其遍历到的 start with开始的地方被视为根 将遍历到的路径根据函数中的分隔符 组成一个新的字符串 这个功能还是很强大的
在前面说过 根就是start with开始的地方
SELECT CONNECT_BY_ROOT mc flfl
START WITH ID =
CONNECT BY PRIOR sjflid = ID;
列出当前是否为叶子
这个比较常见 尤其在动态目录中 在查出的内容是否还有下级时 这个函数是很适用的
connect_by_isleaf函数用来判断当前是否包含下级 如果包含的话 说明不是叶子 这里返回 反之 如果不包含下级 这里返回
oraclerank()函数总结
where T rk<= ;首先 要了解rank在英语的意思 等级 也就是说这是一个给数据确定等级的函数
正确的说法是,TRUNCATE命令用于删除表中的所有数据,它会释放表空间,从而使得表可以重新插入新的数据。需要注意的是,TRUNCATE命令是一个DDL(数据定义语言)命令,而不是DML(数据作语言)命令,它直接对表进行作,而不是通过SQL语句。以销售为例 有地区 年 月 销售员 销售额 记录这五个字段 我们可以按地区 年 月 销售额对销售员进行排序 这样对销售员来说就相当于有一个等级概念了 名就是销售的 如果我们要找出每个地区 年 月 销售额的前三名销售员 SQL如何写?
SELECT area_code YEAR MONTH saleroom saler
RANK () OVER (PARTITION BY area_code year month ORDER BY area_code year month saleroom ) RANK
FROM t_sale
SELECT
RANK( SHENZHEN ) WITHIN GROUP
(ORDER BY area_code year month saleroom) Rank
FROM T_SALE
上面这个SQL就可以搞定了 要注意的是 Rank()里的参数必须为常数 或常值表达式 里面参数的个数 类型也要和order by后字段的类型相对应
上面就是Rank函数的两个用法 另外还有一个dense_rank() 它的用法和rank()一样 只是计算等级的方式不同 例如上面的
用dense_rank() 就是
其实现在Oracle对于rank和dense_rank已经支持合计功能 不过这次我仅仅使用了其分析功能 具体语法如下 RANK ( ) OVER ( [query_partition_clause] order_by_clause )
下面给出一些来自网上的示例
现在我想要的结果是 每门科目的前 名的分数
那么语句就这么写
select from (select rank() over(partition by subject order by mark desc) rk S from S) T
dense_rank与rank()用法相当 但是有一个区别 dence_rank在处理相同的等级时 等级的数值不会跳过 rank则跳过 row_number() 补充
例如 表
A B C
a liu wang
a jin shu
a cai kai
b yang du
b lin ying
b yang
例如 当rank时为
select m a m b m c rank(WITH tmp AS) over(partition by a order by b) liu from test m
A B C LIU
a cai kai
b yang du
b yang
而如果用dense_rank时为
select m a m b m c dense_rank() over(partition by a order by b) liu from test m
A B C LIU
a cai kai
b yang du
b yang
而如果用row_number()时为
select m a m b m c row_number() over(partition by a order by b) liu from test m
A B C LIU
a cai kai
b yang du
b yang
现在RANK 就是 有了这个字段 就很容易得到前三名的销售员了
ORACLE 递归与多表查询 的效率问题
lishixinzhi/Article/program/Oracle/201311/11193简单分析了一下sql的结构,你的sql效率的问题在于对每个b子查询中的记录都要start with遍历一次。
正则表达式本来就是一个效率比较低的东西,但是功能强大虽然没弄清楚你的表结构,但你可以尝试一下使用下面的方案解决;
1,将记录整理成如下形式
部门,科室,职位,人员
2, 然后使用
select 部门,科室,职位,count(人员)
group by rollup(部门,科室,职位)
SELECT
id,pid,name
FROMSTART WITH a sjflid IS NULL
staff
WHERE
start with id='头的ID'
connect by prior id=pid
求Oracle 常用命令!
学习时整理的 Oracle 1、set linesize 100; 设置长度
2、set pagesize 30; 设置每页显示数目
3、em a.sql 打开记事本
4、@ a 执行文件a中的代码,可指定文件的路径 @d:a.txt
5、conn 用户名/密码 根据用户名和密码连接数据库 如果连接超级(sys) 则应加上as sysdba;
7、select from tab; 得到当前用户下的所有表
8、desc temp; 查看表结构
9、/ 继续执行上一个查询语句
clear scr; 清屏字符函数
10、select upper('coolszy') from dual; 将小写字母转换成大写,dual 为一虚表
11、select lower('KUKA') from dual; Sql代码将大写字母转换成小写
13、select concat('Hello',' world') from dual; 连接字符串,但没有||好用select concat('Hello','world') from dual;
14、select substr('hello',1,3) from dual; 截取字符串
15、select length('hello') from dual; 求字符串长度
16、select replace('hello','l','x') from dual; 替换字符串
17、select b yao caisubstr('hello',-3,3) from dual; 截取后三位数值函数
19、select round(789.536,2) from dual; 保留两位小数
20、select round(789.536,-1) from dual; 对整数进行四舍五入
21、select trunc(789.536) from dual; 舍去小数,但不进位
22、select trunc(789.536,2) from dual;
23、select trunc(789.536,-2) from dual;
24、select mod(10,3) from dual; 返回10%3的结果日期函数
25、select sysdate from dual; 返回当前日期
26、select months_between(sysdate,'16-6月 -08') from dual; 返回之间的月数
28、select next_day(sysdate,'星期一') from dual; 求下一个星期一
29、select last_day(sysdate) from dual; 求本月的一天
30、select to_char(sysdate,'yyyy') year,to_char(sysdate,'mm'),to_char(sysdate,'dd') from dual;
31、select to_char(sysdate,'yyyy-mm-dd') from dual;
32、select to_char(sysdate,'fmyyyy-mm-dd') from dual; 取消月 日 前面的0
33、select to_char('20394','99,999') from dual; 分割钱 9表示格式
34、select to_char('2034','L99,999') from dual; 加上钱符号
36、select to_date('1988-07-04','yyyy-mm-dd') from dual; 通用函数
37、select nvl(null,0) from dual; 如果为null,则用0代替
38、select decode(1,1,'内容是1',2,'内容是2',3,'内容是3') from dual; 类似于 switch...case...事务处理
39、commit; 提交事务
40、rollback; 回滚事务
41、select rownum from table; 在没一列前面显示行号
42、drop table 表名 cascade constraint
on delete casecade 当父表中的内容被删除后,子FROM flfl b表中的内容也被删除43、desc表名 显示表的结构
44、create user [username] identified by [password] 创建新的用户
ex:grant create session to [username] 此时只能连接到数据库
grant connect,resource to [username] 此时权限能满足要求
46、alter user [username] identified by [password] 修改用户密码
47、alter user [username] password expired 下次登录时提示修改密码
48、alter user [username] account lock 锁住用户
49、alter user [username] account unlock 解锁锁用户
50、grant select,delete on scott.emp to [username] 把scott下emp表的两个权限给用户
51、revoke select ,delete on scott.emo from [username] 回收权限
网上很多 BAIDU找找吧 这也有:
在ORACLE中,函数的调用方式分别是哪几种?
或者:select object_name from user_objects where object_type='PROCEDURE' ;1、在SQL语句中直接调用,如:x0dx0aselect sysdate from dual;x0dx0ax0dx0a2、在PL/SQL代码中赋值给某个变量,如:x0dx0adeclarex0dx0a dt date :=null;x0dx0abeginx0d在Oracle数据库中,Truncate命令还可以用于删除分区表的分区数据。truncate指的是一种计算机语言函数,使用方法是truncate table table_name。x0a dt := sysdate;x0dx0a ...x0dx0aend;x0dx0a/x0dx0ax0dx0a3、以上说的是Oracl数学e内置函数,如果是自定义函数,则根据入口参数、出口参数的不同,调用方式不尽相同。
oracle 用递归层次查询 怎么只查询层的?
转换函数相信你知道ll在递归查询中的意思,除了ll之外,还有一个伪列:CONNECT_BY_ISLEAF。你可以在3)数据的共享性输出的列中间加上CONNECT_BY_ISLEAF这个列,将会发现CONNECT_BY_ISLEAF为1的全是叶子,也就是你说的层。
例如:select a, max(b) from table group by a;