Your SlideShare is downloading. ×
0
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Oracle常用sql技巧
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Oracle常用sql技巧

1,330

Published on

Oracle常用SQL技巧 …

Oracle常用SQL技巧

内部讲座

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,330
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Oracle 常用 SQL 技巧 Author: 侯选哲 Dept:SDD Email: [email_address] Host: http://my.unix-center.net/~Zianed / Copyright 2008 By Neusoft Group. All rights reserved
  • 2. <ul><li>1. fm 可以做什么? </li></ul><ul><li>2. 全外连接的用途 </li></ul><ul><li>3. NULL 是什么, BOOLEAN 是什么? </li></ul><ul><li>4. 使用 WITH 语句提高效率 </li></ul><ul><li>5. 使用 MERGE 语句 </li></ul><ul><li>6. CASE 与 DECODE 条件判断 </li></ul>内容概要
  • 3. <ul><li>7. PL/SQL 中的取值 </li></ul><ul><li>8. ORACLE 中的编码异常 </li></ul><ul><li>9. 客户端、服务器网络连接异常的处理 </li></ul><ul><li>10. 事务的用途 </li></ul><ul><li>11. 触发器的调试 </li></ul><ul><li>12. 紧急数据恢复 </li></ul>Cont’
  • 4. 1. fm 可以做什么 <ul><li>1.1 fm: Format Model </li></ul><ul><li>A format model is a character literal that describes the format of datetime or numeric data stored in a character string. </li></ul><ul><li>格式化日期和数字的字符串显示 </li></ul><ul><li>fm </li></ul><ul><li>1.2 去除多余的 0 </li></ul><ul><li>02 月 02 日  2 月 2 日 </li></ul><ul><li>SELECT TO_CHAR(SYSDATE, 'fmYYYY')||' 年 ' </li></ul><ul><li>||TO_CHAR(SYSDATE,'fmMM')||' 月 ' </li></ul><ul><li>||TO_CHAR(SYSDATE,'fmDD')||' 日 ' today </li></ul><ul><li>FROM dual; </li></ul><ul><li>SELECT to_char(09.090,'fm99.999')||'%' num </li></ul><ul><li>FROM dual; </li></ul>
  • 5. Cont’ <ul><li>1.3 节省显示的长度 </li></ul><ul><li>SQL> SELECT length(to_char(09.090,'99.99')) len FROM dual; </li></ul><ul><li>LEN </li></ul><ul><li>6 </li></ul><ul><li>SQL> SELECT length(to_char(09.090,'fm99.99')) len FROM dual; </li></ul><ul><li>LEN </li></ul><ul><li>4 </li></ul><ul><li>1.4 关于数字的 # </li></ul><ul><li>原文说明: If a value has more significant digits to the left of the decimal place than are specified in the format, then pound signs (#) replace the value. </li></ul><ul><li>应用的一个实例:计算比例 </li></ul><ul><li>TO_CHAR(ROUND(NVL(yxts,0)*100/(DECODE(nvl(qxts,0),0,1,qxts)),2),'9990.00')||'%' YXBL </li></ul>
  • 6. 2. 全外连接的用途 <ul><li>2.1 外连接 </li></ul><ul><li>左外连接 </li></ul><ul><li>a.xh=b.xh(+) </li></ul><ul><li>a left join b on (a.xh=b.xh) </li></ul><ul><li>左边的数据全部显示,右边的进行匹配; </li></ul><ul><li>右外连接 </li></ul><ul><li>a.xh(+)=b.xh </li></ul><ul><li>a right join b on (a.xh=b.xh) </li></ul><ul><li>右边的数据全部显示,左边的进行匹配; </li></ul><ul><li>全外连接 </li></ul><ul><li>a.xh(+)=b.xh(+) × </li></ul><ul><li>a full outer join b on (a.xh=b.xh) </li></ul><ul><li>左边的数据全部显示,右边的进行匹配 , 再显示右边不能进行匹配的数据; </li></ul><ul><li>笛卡尔积 </li></ul><ul><li>a 表中一行,对应 b 表中的所有行进行显示 </li></ul><ul><li>没有条件的全局行显示; </li></ul><ul><li>Row(a)*Row(b) </li></ul>
  • 7. Cont’ <ul><li>2.2 何时使用外连接 </li></ul><ul><li>在进行统计的时间,针对 A 表和 B 表,要显示 A 、 B 中所有满足条件的数据。 </li></ul><ul><li>A 中有一部分数据 a.xh, a.byzh </li></ul><ul><li>B 中有一部分数据 b.xh, b.xwzh </li></ul><ul><li>SELECT (CASE WHEN a.xh IS NOT NULL THEN a.xh </li></ul><ul><li> ELSE b.xh END) xh, a.byzh, b.xwzh </li></ul><ul><li>FROM a full outer join b ON (a.xh=b.xh) </li></ul><ul><li>注意: 如果采用左连接、右连接都会丢失数据。 </li></ul>
  • 8. 3. NULL 是什么, BOOLEAN 是什么? <ul><li>3.1 NULL 是什么 </li></ul><ul><li>1 ) ‘’ 就是 NULL </li></ul><ul><li>‘’ = NULL false </li></ul><ul><li>‘’ = ‘’ false </li></ul><ul><li>‘’ IS NULL true </li></ul><ul><li>要与其他数据库进行区分 (‘’ IS NULL==true) </li></ul><ul><li>2)’’ 与字符串’ ’有区别 </li></ul><ul><li>Oracle 中没有零长字符串 </li></ul><ul><li>SQL> SELECT LENGTH('') len FROM dual; </li></ul><ul><li> LEN </li></ul><ul><li>SQL> SELECT LENGTH(' ') len FROM dual; </li></ul><ul><li>LEN </li></ul><ul><li>1 </li></ul>
  • 9. <ul><li>3.2 BOOLEAN 是什么 </li></ul><ul><li>1) NULL 与 boolean 值 (true/false) 的计算 </li></ul><ul><li>2) 函数返回 boolean 值 </li></ul><ul><li>SELECT function_returnBoolean FROM dual; × </li></ul><ul><li>不能直接进行查询返回 boolean 值。 </li></ul><ul><li>Boolean 变量无法作为函数的参数进行传递,也无法作为返回值。在 PL/SQL 中可以进一步处理。 </li></ul><ul><li>Oracle SQL 没有 boolean 类型。项目中一般用 0,1 表示。 </li></ul>
  • 10. 4. 使用 WITH 语句提高效率 <ul><li>4.1 什么是 WITH 语句 </li></ul><ul><li> ANSI SQL-99 syntax—— 虚拟表 </li></ul><ul><li>The SQL “WITH clause” is very similar to the use of Global temporary tables (GTT), a technique that is often used to improve query speed for complex subquerie </li></ul><ul><li>4.2 何时使用 </li></ul><ul><li>如果需要多次用到,用 with 语句可以提高效率,避免每次都到数据库中进行重复读取数据。 </li></ul><ul><li>WITH (SQL 查询 ) AS A </li></ul>
  • 11. Cont’ <ul><li>4.3 优点和缺点 </li></ul><ul><li>优点: </li></ul><ul><li>1) 减少查询数据,提高执行效率。 </li></ul><ul><li>2) 基于批量汇总的数据的进一步处理。 </li></ul><ul><li>缺点: </li></ul><ul><li>1) 使用 with 会改变执行计划,需要仔细考虑。 </li></ul><ul><li>2) 导致索引失效。 </li></ul><ul><li>Reference </li></ul><ul><li>http://www.itpub.net/viewthread.php?tid=1234453 </li></ul>
  • 12. 5 . 使用 MERGE 语句 <ul><li>5.1 MERGE 的功能 </li></ul><ul><li>包括了 INSERT 和 UPDATE </li></ul><ul><li>在 11g 中新增了 DELETE 语句 </li></ul><ul><li>5.2 MERGE 语句的语法 </li></ul><ul><ul><li>MERGE A </li></ul></ul><ul><ul><li>USING B </li></ul></ul><ul><ul><li>ON (a.id=b.id) </li></ul></ul><ul><ul><li>WHEN MATCHED THEN </li></ul></ul><ul><ul><li>UPDATE SET // 更新 </li></ul></ul><ul><ul><li>WHEN NOT MATCHED THEN </li></ul></ul><ul><ul><li>INSERT // 插入 </li></ul></ul><ul><ul><li>; </li></ul></ul>
  • 13. Cont’ <ul><li>5.3 MERGE 的使用场景 </li></ul><ul><li>1) 数据导入 </li></ul><ul><li>在不存在时进行新增,在存在时根据条件进行更新。 </li></ul><ul><li>2) 根据条件调整原有数据 </li></ul><ul><li>Oracle 的一个有用的 Hints </li></ul><ul><li>/*+ UJVC */ </li></ul>
  • 14. 6. CASE 与 DECODE 条件判断 <ul><li>6.1 DECODE 语句 </li></ul><ul><li>DECODE 表达式 , resultA ,ValueA, resultAB,ValueB, </li></ul><ul><ul><ul><ul><ul><li> ValueDefault </li></ul></ul></ul></ul></ul><ul><li>Decode 的判断条件是一个表达式,后面根据表达式的值依次进行判断。 </li></ul>
  • 15. Cont’ <ul><li>6.2 CASE 语句 </li></ul><ul><li>1)CASE expression WHEN resultA THEN ValueA WHEN resultB THEN ValueB </li></ul><ul><ul><ul><ul><ul><li> ELSE ValueDefault END </li></ul></ul></ul></ul></ul><ul><li>2)CASE WHEN ConditionA THEN ValueA </li></ul><ul><li>WHEN ConditionB THEN ValueB </li></ul><ul><ul><ul><li>ELSE ValueDefault END </li></ul></ul></ul><ul><li>CASE 的判断可以是一个表达式也可以是一个条件判断,后面根据表达式的值依次进行判断。 </li></ul><ul><li>3) 区别 </li></ul><ul><li> DECODE 语法更加轻松一些。 CASE 语句使用起来更轻松,可以自由的组合,增加条件判断更加轻便。 </li></ul>
  • 16. Cont’ <ul><li>6.3 与聚合函数的共同使用 </li></ul><ul><li>使用 CASE 做判断数据处理,聚合函数分组 </li></ul><ul><li>SUM(CASE WHEN I.ZBLX='04' AND H.ZBZ IS NOT NULL THEN 1 ELSE 0 END) YXTS </li></ul><ul><li>函数分组 </li></ul>
  • 17. 7. PL/SQL 中的取值 <ul><li>7.1 取值的两种方式 </li></ul><ul><li>1) 使用 SELECT XX INTO v_XX </li></ul><ul><li>SELECT xm INTO v_xm FROM view_bkjw_xs a WHERE a.xh = &xh; </li></ul><ul><li>2) 使用游标查询取值 </li></ul><ul><li>OPEN cur_xh_xm(v_xh); </li></ul><ul><li>FETCH cur_xh_xm INTO v_xm; </li></ul><ul><li>CLOSE cur_xh_xm; </li></ul>
  • 18. Cont’ <ul><li>7.2 如何处理异常 </li></ul><ul><li>发现异常情况的导致是由于: </li></ul><ul><li>1) ORA-01403 没有找到合适的行 </li></ul><ul><li>2) ORA-01422 找到的合适的数据太多 </li></ul><ul><li>7.3 优缺点与效率 </li></ul><ul><li>采用第二种防止错误的产生。 </li></ul>
  • 19. 8. ORACLE 中的编码异常 <ul><li>8.1 为什么会乱码,什么是编码 </li></ul><ul><li>位 (bit) 、字节 (byte) 、字符 (char) 、字符集 (encoding) </li></ul><ul><li>Unicode 、 UTF-8 、 UTF-16 </li></ul><ul><li>8.2 取得数据库的编码 </li></ul><ul><li>[HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0] </li></ul><ul><li>&quot;ORACLE_HOME&quot;=&quot;D:rogramracle920&quot; </li></ul><ul><li>&quot;NLS_LANG&quot;=&quot;SIMPLIFIED CHINESE_CHINA.ZHS16GBK“ </li></ul><ul><li>获取数据库的编码 </li></ul><ul><li>SELECT * </li></ul><ul><li>FROM nls_database_parameters </li></ul><ul><li>WHERE parameter in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET'); </li></ul>
  • 20. Cont’ <ul><li>8.3 什么是 NLS_LANG </li></ul><ul><li>NLS_LANG 就是环境变量 </li></ul><ul><li>Unix 上 $NLS_LANG 或者 </li></ul><ul><li>Win 上 % NLS_LANG % </li></ul><ul><li>8.4 统一数据库 客户端 传输的编码方式 </li></ul><ul><li>NLS_LANG </li></ul>
  • 21. 9. 客户端、服务器网络连接异常的处理 <ul><li>9.1 ORACLE 客户端服务器的连接方式 </li></ul><ul><li>客户端  监听  服务器模式 </li></ul><ul><li>9.2 服务器端的验证 </li></ul><ul><li>1) 查看 ORACLE_SID 是否配置 </li></ul><ul><li>2) 验证监听是否启动 </li></ul><ul><li>3) 查看验证模式的配置 </li></ul><ul><li>4) 查看监听模式的配置 </li></ul><ul><li>5) 查看 Oracle 服务名 </li></ul><ul><ul><li>SQL> show parameter service_names </li></ul></ul><ul><ul><li>NAME TYPE VALUE </li></ul></ul><ul><ul><li>--------------------------------- ----------- ---------------------------- </li></ul></ul><ul><ul><li>service_names string orcl </li></ul></ul>
  • 22. Cont’ <ul><li>9.3 客户端问题的处理 </li></ul><ul><li>1) 网络是否连接 </li></ul><ul><li>2) Windows 下防火墙是否开启? </li></ul><ul><li>9.4 常用判断工具 </li></ul><ul><ul><li>tnsping </li></ul></ul><ul><ul><li>lsnrctl </li></ul></ul><ul><ul><li>sqlplus/connect </li></ul></ul>
  • 23. 10. 事务的用途 <ul><li>10.1 事务的性质 </li></ul><ul><li>ACID </li></ul><ul><li>原子性( Atomicity )、一致性( Consistency )、 </li></ul><ul><li>隔离性( Isolation )、持久性( Durability ) </li></ul><ul><li>10.2 为什么采用事务 </li></ul><ul><li>对错误操作进行恢复; </li></ul><ul><li>防止异常操作; </li></ul><ul><li>保护数据一致性; </li></ul>
  • 24. Cont’ <ul><li>10.3 事务的一般使用 </li></ul><ul><ul><ul><li>tran.begin(); </li></ul></ul></ul><ul><ul><ul><li>try{ </li></ul></ul></ul><ul><ul><ul><ul><li>tran.commit(); </li></ul></ul></ul></ul><ul><ul><ul><li>}catch(){ </li></ul></ul></ul><ul><ul><ul><ul><li>tran.rollback(); </li></ul></ul></ul></ul><ul><ul><ul><li>}finally{ </li></ul></ul></ul><ul><ul><ul><ul><li>tran.free(); </li></ul></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul>
  • 25. 11. 触发器的调试 <ul><li>11.1 PL/SQL Developer 工具常用的调试方式 </li></ul><ul><li>右键 Test, 点击 F9 执行 Debug 模式即可。 </li></ul><ul><li>11.2 触发器如何进行调试 </li></ul><ul><li>设置断点 </li></ul><ul><li>在 PL/SQL 中写数据操纵语句( INSERT/UPDATE/DELETE )来检查触发条件的数据。 </li></ul><ul><li>点击 F9 执行 Debug 模式即可。 </li></ul>
  • 26. 12. 紧急数据恢复 <ul><li>12.1 INSERT/UPDATE/DELETE 提交了之后怎么办? </li></ul><ul><li>使用 TIMESTAMP 或者 SCN 间隔来操作已经提交的在回滚段中的数据。 </li></ul><ul><li>from </li></ul><ul><li>bkjw_xkjg AS OF TIMESTAMP(SYSTIMESTAMP – INTERVAL ‘10′ MINUTE) </li></ul><ul><li>Oracle 记录日志的原理? </li></ul><ul><li>12.2 DROP 了如何办? </li></ul><ul><li>寻找相应的工具 AUL 、 Logminer 等 </li></ul><ul><li>在 11g 下有一定的存在时间。 </li></ul><ul><li>References </li></ul><ul><li>http://my.unix-center.net/~Zianed/?p =102 </li></ul>
  • 27. Thank you Neusoft Co., Ltd. 谢谢

×