Oracle数据库查询十个小技巧(三)

Oracle数据库查询十个小技巧(三),第1张

第八个技巧 慎用Like等通配符

Like关键字 从技术上来说 是一个非常友善的通配符 利用这个通配符 我们可以实现很多模糊查询 如现在在一个人事档案系统中 用户想知道身份z号码以 开头的人事信息 此时 就可以利用Like语句实现 我们可以利用下面的条件语句 实现我们的需求 where 身份z号码 like % 通过这个条件语句 可以查到所有身份z以 开头的号码

但是 当用户在一张大表中采用这个LIKE语句的话 就会发现这个查询语句的运行效率非常的慢 这是什么原因造成的呢其实 不管是Like 关键字 若采用MATCHES关键字的话 若在大量数据中查找符合条件的记录 则其运行效率也比较低 这主要是其技术特性所造成的

Like与Matches两个关键字 其支持通配符匹配 在有些专业书籍上把这个叫做 正规表达式 不过由于在利用这些关键字查询的时候 数据库系统不是通过索引来查询 而是采用顺序扫描的方式来查询 显然 真是这种技术特性 造成了Like与Mateches两个关键字查询效率的低下 特别是在复杂查询或者大表查询中 用户可以明显感觉到速度比较慢

索引是数据库中的一个重要的数据结构 索引如果利用的合理的话 可以大幅度的提升数据库的查询性能 一般情况下 我们在数据库设计的时候 要充分的利用索引 来提高数据库的运行效率 如对于一些经常需要用到的查询功能 我们需要为没有指定外键的列建立索引;如有查询大表数据 而且又需根据好几个字段的值对其进行排序 也需要在这些列上建立复合索引 特别是在一些应用系统上 往往可以按以下字段的名称 就会对这个字段进行排序 遇到这种情况的话 更加需要在这些频繁进行排序的列上建立索引 以提高重新排序的效率 可见 若在查询的时候 若不能利用索引提高查询效率的话 则就好像跑车失去四轮驱动 速度会大受影响

所以 在数据库系统设计中 要尽量避免采用Like或者Matche关键字 有时候 我们可以利用其他运算符号来代替 如我们可以利用〉(大于)或者<(小于)符号来达到类似的需求 若真的要采用这两个关键字的话 则就需要做好查询优化方面的工作 如不要在基础表中直接利用这个两个关键字 而是通过报表视图 或者临时表等来查询 以减少其不良影响

第九个技巧 利用注释提高查询语句的可读性

在数据库设计中 有一个非常奇怪的现象 一些专家级的数据库设计人员 在写查询语句的时候 非对语句进行详细的注释 有时会 注释的内容大大超过了查询代码本身的篇幅 可是 往往一些入门不久的数据库设计人员 不喜欢写注释语句 这是一个很反常的现象

笔者刚开始接触数据库的时候 也不喜欢写注释语句 觉得写注释语句太浪费时间 但是 一个偶然的事件让笔者改掉了这个坏习惯 那时笔者在观摩一个专家设计数据库的时候 被其密密麻麻的注释惊呆了 看了其代码之后 笔者可以非常轻松的阅读完其所有的代码 不愧为是专家级的人物 看了他的注释之后 在看看自己编写的代码注视 那真是大巫见小巫了 从此之后 笔者也在慢慢培养自己编写代码的习惯 现在笔者在数据库设计的时候 注释已经写的很详细了 至少笔者的同事在看到我的注释之后 不用看源代码就知道笔者要实现的目的了

在编写注释的时候 要注意几个问题

一是注释越详细越好 其实 注释最多牺牲一点磁盘空间 而不会对数据库的性能产生任何不良的影响 相反 注释详细的话 对于后续数据库维护与管理 系统二次开发的等等 都会提供很大的帮助

二是最好采用英文注释 若采用中文注释的话 有时候数据库语言设置不当 在数据库实例安装的时候 不会把中文的注释带过去 所以 作为数据库管理员 要有一定的英语基础 学会利用英语写注释 其实 这也不是很难 只要多看看别人设计的数据库注释 把他们常用的注释复制下来 通过选择合适的进行复制 粘贴就可以完成任务

三是不仅在写查询语句的时候 要做好代码的注释工作 在编写其他代码的时候 如过程 函数等等 也要添加详细的代码 以增加这些复杂功能的可读性

四是注释的内容 一般注释应该包含如下几方面的内容 一是这段代码要实现的功能;二是这段代码需要调用的参数;三是这段代码输出的结果 若是多表关联查询的话 最好能够说明表之间的对应关系 若在查询语句中 直接调用了函数的话 则最好能够注明这个函数的功能;等等 终止一个原则就是 让其他人看到这个注释 不再需要去查询其他的资料 就可以明白这段代码的含义

详细的注释内容 不仅不会降低数据库的运行性能 而且还可以提高数据库的管理与维护的效率;同时也可以加快前台应用程序开发设计的速度 又因为查询语句是系统中利用的最多的语句 也是引用的最频繁的语句 故在查询语句中 更加需要做好相关的注释

第十个技巧 必要的时候 限制用户所使用的行

在使用一些大型管理系统的时候 如ERP系统 我们若查询产品信息 默认的情况下 若记录比较多的时候 其不会把所有的记录都查询出来 如在ERP系统的数据库中 其有 个产品信息 而端子类的产品信息就占据到 个 此时 我们在查询条件中 若产品类别限制为 端子 的话 则其查询出来的结果也可能不是所有的端子 默认显示的话 可能只有前面的 个端子类产品 若用户需要看到全部的产品信息 就需要点击 显示全部 按钮 才可以显示出全部的信息

其实 不管是一些应用程序如此设计 在Oracle数据库中 本身也有这方面的限制 如直接在PL/SQL客户端中查询数据的话 其显示的记录默认情况下也是有限制的 而不会把所有符合条件的语句查询出来 若用户需要查询所有符合条件的记录 则需要点击 继续 按钮 以让数据库显示所有的记录

为什么要做类似的限制呢这主要就是为了提高数据库查询的性能 我们直接在数据库服务器上 在几百万条记录中查询的话 显示几百条记录跟现实几千条记录所花费的时间明显不同 前者可能只需要 秒即可 而后者可能需要 分钟 所以 为了减少用户等待的时间 我们往往需要限制首次查询默认显示的记录数字

如我们往往在查询语句中 利用top 来让数据库只显示前 条记录 如此的话 可以明显的缩短用户的等待时间 默认情况下 是根据记录创建的时间顺序 来显示记录的 最迟创建的记录 其显示在最前 以此类推

lishixinzhi/Article/program/Oracle/201311/16756

平均是AVG,高于就是>了,

你要的应该是这个,

select edeptno,eename from emp e, (select deptno,avg(sal) avg_sal from emp group by deptno) t

where edeptno=tdeptno and esal > tavg_sal

order by edeptno ;

觉得你应该先弄清楚oracle的常规数据字典的结构,像9i里的常规数据字典中对象名称就有以USER,ALL,DBA为前缀的对象。

以USER为例,我们查该对象下有些什么表,就应该执行下列的语句:

SQL>select table_name from user_tables;

类似的,你可以进行替换。:)

如果你想查数据库中所有的表的话,可以查询

SELECT FROM dba_tables

如果你想查询数据库中某个用户下的表的话,也可以登录这个用户,再查询:

SELECT FROM USER_TABLES

要想导入外部sql语句可以用命令

sql >@e:\文件名sql

如你想保存 select from tablename;语句的结果,可以在sqlplus 里面这样:

SPOOL c:\testsql //这是保存文件的位置

select from tablename;

SPOOL OFF

不知道你是写程序用,还是找数据用。写程序的话,一步到位,可能比较复杂!

下面附一点找数据的较笨的方法!看对你有没有用,以用户SCOTT为例:

1dba_tab_columns有某个用户的所以表和列等信息:select table_name,column_name from dba_tab_columns where owner='SCOTT'

2查看用户的表所使用的数据类型有哪些:select distinct Data_type from (select from dba_tab_columns where owner='SCOTT') A 通过查看,就可以知道,文本型有哪些如:是否有char, varchar2等

3创建一个表,用于保留那些表名和字段:CREATE TABLE SCOTTTCOL(A VARCHAR2(50), B VARCHAR2(50))

4因为SCOTT用户的字段类型较少,下面以找NUMBER类型值为1100的表名与字段在SQLPLUS下运行如下代码(如果数值多的话,可以用 in('NUMBER',)格式。

set serveroutput on

delete from scottTCOL;

commit;

declare

cursor my_cursor is

select table_name,column_name from dba_tab_columns where owner='SCOTT' and DATA_TYPE='NUMBER';

v_table varchar2(50);

v_col varchar2(50);

v_sql varchar2(4000);

begin

open my_cursor;

loop

fetch my_cursor into v_table,v_col;

dbms_outputput_line(v_table);

exit when my_cursor%NOTFOUND;

v_sql:='Insert into SCOTTTCOL(A,B) select '||''''|| v_table||''''||','||''''|| v_col||''''||' from SCOTT'||v_table||' where '||v_col||'=1100';

dbms_outputput_line(v_sql);

EXECUTE IMMEDIATE v_sql;

commit;

end loop;

close my_cursor;

end;

5最后执行select from scotttcol,就可以看到结果! 如果有用,自己再整理成一个存储过程

以上仅参考!

以上就是关于Oracle数据库查询十个小技巧(三)全部的内容,包括:Oracle数据库查询十个小技巧(三)、Oracle 数据库的查询、oracle怎样查看数据库中有数据的表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9754067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存