﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-e代剑客——温柔一刀-随笔分类-数据库相关</title><link>http://www.blogjava.net/ctguzhupan/category/14182.html</link><description>生活就像海洋，只有意志坚强的人，才能到达彼岸</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:42:44 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:42:44 GMT</pubDate><ttl>60</ttl><item><title> 远程连接mysql</title><link>http://www.blogjava.net/ctguzhupan/archive/2007/02/15/100003.html</link><dc:creator>温柔一刀</dc:creator><author>温柔一刀</author><pubDate>Thu, 15 Feb 2007 13:53:00 GMT</pubDate><guid>http://www.blogjava.net/ctguzhupan/archive/2007/02/15/100003.html</guid><wfw:comment>http://www.blogjava.net/ctguzhupan/comments/100003.html</wfw:comment><comments>http://www.blogjava.net/ctguzhupan/archive/2007/02/15/100003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ctguzhupan/comments/commentRss/100003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ctguzhupan/services/trackbacks/100003.html</trackback:ping><description><![CDATA[
		<p>grant select,insert,update,delete on *.* to root@"%" Identified by "111111"; </p>
		<p>use mysql;
<br />select host,user,password from user;</p>
		<p>flush privileges</p>
<img src ="http://www.blogjava.net/ctguzhupan/aggbug/100003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ctguzhupan/" target="_blank">温柔一刀</a> 2007-02-15 21:53 <a href="http://www.blogjava.net/ctguzhupan/archive/2007/02/15/100003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Toad for oracle 教程</title><link>http://www.blogjava.net/ctguzhupan/archive/2006/09/28/72662.html</link><dc:creator>温柔一刀</dc:creator><author>温柔一刀</author><pubDate>Thu, 28 Sep 2006 11:33:00 GMT</pubDate><guid>http://www.blogjava.net/ctguzhupan/archive/2006/09/28/72662.html</guid><wfw:comment>http://www.blogjava.net/ctguzhupan/comments/72662.html</wfw:comment><comments>http://www.blogjava.net/ctguzhupan/archive/2006/09/28/72662.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ctguzhupan/comments/commentRss/72662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ctguzhupan/services/trackbacks/72662.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 适用于初次使用Toad的开发者&nbsp;&nbsp;<a href='http://www.blogjava.net/ctguzhupan/archive/2006/09/28/72662.html'>阅读全文</a><img src ="http://www.blogjava.net/ctguzhupan/aggbug/72662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ctguzhupan/" target="_blank">温柔一刀</a> 2006-09-28 19:33 <a href="http://www.blogjava.net/ctguzhupan/archive/2006/09/28/72662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring、ibatis控制oracle分页的问题 </title><link>http://www.blogjava.net/ctguzhupan/archive/2006/08/30/66580.html</link><dc:creator>温柔一刀</dc:creator><author>温柔一刀</author><pubDate>Wed, 30 Aug 2006 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/ctguzhupan/archive/2006/08/30/66580.html</guid><wfw:comment>http://www.blogjava.net/ctguzhupan/comments/66580.html</wfw:comment><comments>http://www.blogjava.net/ctguzhupan/archive/2006/08/30/66580.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.blogjava.net/ctguzhupan/comments/commentRss/66580.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ctguzhupan/services/trackbacks/66580.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 开发采用spring+ibatis，数据库用oracle，数据量有几千万以上，而且还要不断的增多，用了三层子查询实现分页控制 &nbsp;&nbsp;<a href='http://www.blogjava.net/ctguzhupan/archive/2006/08/30/66580.html'>阅读全文</a><img src ="http://www.blogjava.net/ctguzhupan/aggbug/66580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ctguzhupan/" target="_blank">温柔一刀</a> 2006-08-30 10:06 <a href="http://www.blogjava.net/ctguzhupan/archive/2006/08/30/66580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle分页查询</title><link>http://www.blogjava.net/ctguzhupan/archive/2006/08/29/66502.html</link><dc:creator>温柔一刀</dc:creator><author>温柔一刀</author><pubDate>Tue, 29 Aug 2006 11:39:00 GMT</pubDate><guid>http://www.blogjava.net/ctguzhupan/archive/2006/08/29/66502.html</guid><wfw:comment>http://www.blogjava.net/ctguzhupan/comments/66502.html</wfw:comment><comments>http://www.blogjava.net/ctguzhupan/archive/2006/08/29/66502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ctguzhupan/comments/commentRss/66502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ctguzhupan/services/trackbacks/66502.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">分页查询格式：</span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
				</span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">SELECT</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #808080">*</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">FROM</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">SELECT</span>
				<span style="COLOR: #000000"> A.</span>
				<span style="COLOR: #808080">*</span>
				<span style="COLOR: #000000">, ROWNUM RN <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">FROM</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #0000ff">真正的查询</span>
				<span style="COLOR: #000000">) A <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">WHERE</span>
				<span style="COLOR: #000000"> ROWNUM </span>
				<span style="COLOR: #808080">&lt;=</span>
				<span style="COLOR: #000000"> </span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">40</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">WHERE</span>
				<span style="COLOR: #000000"> RN </span>
				<span style="COLOR: #808080">&gt;=</span>
				<span style="COLOR: #000000"> </span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">21</span>
		</div>
		<p>
				<span style="FONT-FAMILY: 宋体">其中最内层的查询<span lang="EN-US">SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM &lt;= 40和RN &gt;= 21控制分页查询的每页的范围。</span></span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">上面给出的这个分页查询语句，在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小，将结果尽快的返回。在上面的分页查询语句中，这种考虑主要体现在<span lang="EN-US">WHERE ROWNUM &lt;= 40这句上。</span></span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">选择第<span lang="EN-US">21到40条记录存在两种方法，一种是上面例子中展示的在查询的第二层通过ROWNUM &lt;= 40来控制最大值，在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM &lt;= 40语句，在查询的最外层控制分页的最小值和最大值。这是，查询语句如下：</span></span>
				<span lang="EN-US" style="FONT-FAMILY: 宋体">
				</span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">SELECT</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #808080">*</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">FROM</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">SELECT</span>
				<span style="COLOR: #000000"> A.</span>
				<span style="COLOR: #808080">*</span>
				<span style="COLOR: #000000">, ROWNUM RN <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">FROM</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #0000ff">真正的查询</span>
				<span style="COLOR: #000000">) A <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">WHERE</span>
				<span style="COLOR: #000000"> RN </span>
				<span style="COLOR: #808080">BETWEEN</span>
				<span style="COLOR: #000000"> </span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">21</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #808080">AND</span>
				<span style="COLOR: #000000"> </span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">40</span>
		</div>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">对比这两种写法，绝大多数的情况下，第一个查询的效率比第二个高得多。</span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">这是由于<span lang="EN-US">CBO优化模式下，Oracle可以将外层的查询条件推到内层查询中，以提高内层查询的执行效率。对于第一个查询语句，第二层的查询条件WHERE ROWNUM &lt;= 40就可以被Oracle推入到内层查询中，这样Oracle查询的结果一旦超过了ROWNUM限制条件，就终止查询将结果返回了。</span></span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">而第二个查询语句，由于查询条件<span lang="EN-US">BETWEEN 21 AND 40是存在于查询的第三层，而Oracle无法将第三层的查询条件推到最内层（即使推到最内层也没有意义，因为最内层查询不知道RN代表什么）。因此，对于第二个查询语句，Oracle最内层返回给中间层的是所有满足条件的数据，而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成，显然这个效率要比第一个查询低得多。</span></span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">上面分析的查询不仅仅是针对单表的简单查询，对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。</span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">这里就不对包含排序的查询进行说明了。下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询，<span lang="EN-US">CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN（MERGE JOIN效率比HASH JOIN效率低，一般CBO不会考虑）。在这里，由于使用了分页，因此指定了一个返回的最大记录数，NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层，而HASH JOIN必须处理完所有结果集（MERGE JOIN也是）。那么在大部分的情况下，对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率（分页查询的时候绝大部分的情况是查询前几页的数据，越靠后面的页数访问几率越小）。</span></span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">因此，如果不介意在系统中使用<span lang="EN-US">HINT的话，可以将分页的查询语句改写为：</span></span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_7_23_Open_Image" onclick="this.style.display='none'; Codehighlighter1_7_23_Open_Text.style.display='none'; Codehighlighter1_7_23_Closed_Image.style.display='inline'; Codehighlighter1_7_23_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_7_23_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_7_23_Closed_Text.style.display='none'; Codehighlighter1_7_23_Open_Image.style.display='inline'; Codehighlighter1_7_23_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">SELECT</span>
				<span style="COLOR: #000000"> </span>
				<span id="Codehighlighter1_7_23_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
				<span id="Codehighlighter1_7_23_Open_Text">
						<span style="COLOR: #008080">/*</span>
						<span style="COLOR: #008080">+ FIRST_ROWS </span>
						<span style="COLOR: #008080">*/</span>
				</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #808080">*</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">FROM</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">SELECT</span>
				<span style="COLOR: #000000"> A.</span>
				<span style="COLOR: #808080">*</span>
				<span style="COLOR: #000000">, ROWNUM RN <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">FROM</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #0000ff">真正的查询</span>
				<span style="COLOR: #000000">) A <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">WHERE</span>
				<span style="COLOR: #000000"> ROWNUM </span>
				<span style="COLOR: #808080">&lt;=</span>
				<span style="COLOR: #000000"> </span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">40</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">WHERE</span>
				<span style="COLOR: #000000"> RN </span>
				<span style="COLOR: #808080">&gt;=</span>
				<span style="COLOR: #000000"> </span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">21</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.blogjava.net/ctguzhupan/aggbug/66502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ctguzhupan/" target="_blank">温柔一刀</a> 2006-08-29 19:39 <a href="http://www.blogjava.net/ctguzhupan/archive/2006/08/29/66502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在ORACLE中创建自增字段</title><link>http://www.blogjava.net/ctguzhupan/archive/2006/08/14/63449.html</link><dc:creator>温柔一刀</dc:creator><author>温柔一刀</author><pubDate>Mon, 14 Aug 2006 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/ctguzhupan/archive/2006/08/14/63449.html</guid><wfw:comment>http://www.blogjava.net/ctguzhupan/comments/63449.html</wfw:comment><comments>http://www.blogjava.net/ctguzhupan/archive/2006/08/14/63449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ctguzhupan/comments/commentRss/63449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ctguzhupan/services/trackbacks/63449.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通过创建序列来实现，ORACLE SEQUENCE的简单介绍 <br>&nbsp;&nbsp;<a href='http://www.blogjava.net/ctguzhupan/archive/2006/08/14/63449.html'>阅读全文</a><img src ="http://www.blogjava.net/ctguzhupan/aggbug/63449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ctguzhupan/" target="_blank">温柔一刀</a> 2006-08-14 12:59 <a href="http://www.blogjava.net/ctguzhupan/archive/2006/08/14/63449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL</title><link>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62785.html</link><dc:creator>温柔一刀</dc:creator><author>温柔一刀</author><pubDate>Thu, 10 Aug 2006 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62785.html</guid><wfw:comment>http://www.blogjava.net/ctguzhupan/comments/62785.html</wfw:comment><comments>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ctguzhupan/comments/commentRss/62785.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ctguzhupan/services/trackbacks/62785.html</trackback:ping><description><![CDATA[
		<p>ORACLE的简单介绍 <br />ORACLE公司是一家提供综合技术产品、方案、服务的数据库公司<br />ORACLE数据库设计成可大量存储数据，快速查询数据，保证数据的安全和一致性，<br />跨网络的分布式管理及客户-服务器的配置等。<br />ORACLE SQL语法符合ANSI 1986标准<br />SQL   和数据库交流的命令式语言<br />SQL*PLUS ORACLE的一种工具, 用来运行SQL和PL/SQL语句<br />PL/SQL  ORACLE的过程化编程语言</p>
		<p>一、选择行<br />1. 简单的SELECT 语句<br />SELECT [DISTINCT] {*,COLUMN [ALIAS], ……} FROM table_name;<br />字段的非唯一的结果集<br /> DISTINCT 字段名1 [ ,字段名2] <br />数字类型字段名之间可以进行算术运算<br /> +  - * /  等<br /> 例如: (字段名1*字段名2)/3<br />合并字段内容的连接字符 ||<br /> 字段名1 || 字段名2 <br />字段可以有别名<br /> SELECT 字段名1 [AS] '字段名1 解释' FROM table;</p>
		<p>2. 处理NULL<br />NULL 未定义，不可操作，什么都不是<br />NULL != 0 NULL!='空格' <br />和NULL的任何运算都返回NULL<br />ORACLE里未定义的变量值都为NULL<br />NVL函数可把NULL转换成其它类型的符号<br />NVL(EXPR1, EXPR2)函数<br />解释: IF EXPR1=NULL  RETURN EXPR2<br />  ELSE  RETURN EXPR1<br />编程技巧: NVL函数在多条件模糊查询的时候比较有用<br />nvl('+input_value+','0')='0' or filed_name like '%+input_value+%'<br />NVL函数可返回多种数据类型:<br />返回日期 NVL(start_date,'2002-02-01')<br />返回字符串 NVL(title,'no title')<br />返回数字 NVL(salary,1000)</p>
		<p>3. 使用SQL*PLUS（1）<br />登录SQL*PLUS的方法<br /> 用户名，密码，数据库连接字符串<br />数据库连接字符串可以用net8 easy configuration建立本地网络服务名配置，<br />也可以手工编辑$ORACLE_HOME/network/admin/tnsnames.ora文件。<br />在UNIX系统下不要用<br />$sqlplus <a href="mailto:username/password@dbname">username/password@dbname</a><br /> 这样别的用户用$ps命令能看出用户的密码<br />SQL&gt; desc table;  显示表结构<br />SQL&gt; select * from tab;  查看用户下所有的表<br />SQL&gt; set pause on;  可以使大量结果集在用户按“Enter”(回车)后翻页<br />SQL&gt; set pagesize 100;  设定SQL语句返回结果集一页的行数100, 默认值是14<br />SQL&gt; set linesize 100;  设定SQL语句返回结果集一行的宽度100, 默认值是80</p>
		<p>3. 使用SQL*PLUS（2）SQL*PLUS里的编辑命令<br />最近一条SQL命令语句存在ORACLE内存（sql buffer）里,但SQL*PLUS命令却不会存进去。<br />SQL*PLUS里的编辑命令:<br /> A[PPEND] text  把text增加到当前行后面<br /> C[HANGE] /old/new/ 把当前行old符号替换成new符号,new为空，删除old符号<br /> CL[EAR] BUFF[ER] 从sql buffer里删除所有的行<br /> DEL n   删除sql buffer里第n行<br /> I[NPUT] text  在sql buffer后面插入text<br /> L[IST] n  显示sql buffer里第n行<br /> n   使第n行为当前行<br /> n    text  第n行替换成text<br /> 0    text  在第一行前面插入一行</p>
		<p>3. 使用SQL*PLUS（3） SQL*PLUS里的文件命令:<br /> SAV[E] filename [REP[LACE] | APP[END] ]  <br />   把sql buffer里的SQL命令存到OS下一个文件filename,默认的文件名后缀为.sql.<br />     REP[LACE]替换filename里的SQL命令<br /> APP[END]   把sql buffer里的SQL命令添加到filename后<br /> GET filename   从filename里把SQL命令读到sql buffer<br /> STA[RT] filename  运行上次保存到文件filename里的SQL命令<br /> @filename   运行上次保存到文件filename里的SQL命令<br /> EDIT    打开编辑窗口，编辑sql buffer里的SQL命令<br /> EDIT filename   打开编辑窗口，编辑文件filename里的SQL命令<br /> SPO[OL] filename [OFF | OUT] 把SQL命令结果输出到OS下一个文件filename    OFF结束输出到文件, OUT结束输出到文件并打印文件<br />        <br />4. SQL*PLUS里规定字段的显示格式<br />规定数字的显示格式<br />SQL&gt;column 字段名 format 99999999999;<br />SQL&gt;column 字段名 format 999,999,999,999;<br />规定字符串的显示宽度 <br />SQL&gt;column 字段名 format a数字 [word_wrapped];<br />说明: 一行只显示数字位的长度, 超过长度折行,加word_wrapped后, 单词不会折行<br />规定long字符的显示宽度<br />SQL&gt;set long 200;<br />规定字段名的显示内容<br />SQL&gt; column 字段名 heading '字段名显示内容';<br />SQL&gt; set heading off;    查询时不显示字段名称<br />规定字段的对齐方向<br />SQL&gt; column 字段名 justify [left | right | center];<br />清除字段的格式  <br />SQL&gt; column 字段名 clear; </p>
		<p>5. SQL*PLUS里规定字段的显示格式例子<br />SQL&gt; column last_name heading 'Employee|Name' format a15;<br />SQL&gt; column salary justify right format $99,999.99;<br />SQL&gt; column start_date format a10 null 'Not Hired';<br />说明：如果start_date为null, 显示字符串'Not Hired'</p>
		<p>6. 判断题(T/F)<br />(1). SQL command are always held in sql buffer.  [T]<br />(2). SQL*PLUS command assit with query data.  [T]<br />SQL*PLUS命令只控制SELECT结果集的显示格式及控制文件.只有SQL命令能访问数据库.</p>
		<p>二、限制选择行<br />1. 按指定的规则排序<br />SELECT expr FROM table [ORDER BY {column, expr} [ASC | DESC] ];<br />默认的排序是ASC升序(由小到大)<br />还可以ORDER BY 字段名的位置[1]| [2] ASC| DESC;<br />当字段名很复杂或者是算术表达式时用字段名显示的位置排序很方便.</p>
		<p>2. 用WHERE限制选择行(1)<br />比较操作符 =  &gt;  &lt;  &gt;=  &lt;=  !=  &lt;&gt;  ^=  与NULL比较不能用上面的比较操作符   ANY SOME ALL<br />SQL操作符 BETWEEN … AND…  IN LIKE  IS NULL  <br />  NOT BETWEEN … AND…  NOT IN NOT LIKE IS NOT NULL<br />逻辑操作符 AND OR NOT</p>
		<p>3.  用WHERE限制选择行(2)<br />比较顺序(可以用括号改变它们的顺序)<br />(1). = &lt; &gt; &gt;= &lt;= in like is null between<br />(2). and<br />(3). Or<br />注意: char和varchar2的比较规则有不同: <br />char比较时会忽略字符串后面的空格. varchar2会计算字符串后面的空格</p>
		<p>4.  LIKE操作<br />% 零到任意多个字符  _ 一个字符<br />例如: 字段名 like 'M%'  字段名 like '%m%'  字段名 like  'job_'<br />如果要找含下划线的字符, 要加反斜线       例如:字段名 like '%X/_Y%' escape '/'</p>
		<p>5. 日期字段的比较<br />举例:<br />日期字段 between to_date('2001-12-12','YYYY-MM-DD') and to_date('2002-02-01','YYYY-MM-DD')<br />日期字段&gt; to_date('2001-12-12','YYYY-MM-DD') and日期字段&lt;= to_date('2002-02-01','YYYY-MM-DD'); </p>
		<p>6. 不能用到索引的比较操作符<br />IS NULL<br />IS NOT NULL<br />LIKE '%m%'</p>
		<p>三、单行函数<br />1. 数字函数<br />ABS  取绝对值 POWER 乘方   LN   10为底数取冪<br />SQRT 平方根 EXP       e的n次乘方  LOG(m,n)   m为底数n取冪   <br />数学运算函数:ACOS ATAN ATAN2 COS COSH  SIGN SIN SINH TAN TANH <br />CEIL    大于或等于取整数 <br />FLOOR  小于或等于取整数<br />MOD    取余数   <br />ROUND(n,m)   按m的位数取四舍五入值如果round(日期): 中午12以后将是明天的日期. round(sysdate,'Y')是年的第一天<br />TRUNC(n,m) 按m的位数取前面的数值如果trunc(日期), 确省的是去掉时间</p>
		<p>2. 字符函数<br />CHR     按数据库的字符集由数字返回字符  <br />CONCAT(c1,c2)    把两个字符c1,c2组合成一个字符, 和 || 相同<br />REPLACE(c,s,r)   把字符c里出现s的字符替换成r, 返回新字符 <br />SUBSTR(c,m,n)  m大于0,字符c从前面m处开始取n位字符,m等于0和1一样, <br />   m小与0,字符c从后面m处开始取n位字符<br />TRANSLATE(c,f1,t1)   字符c按f1到t1的规则转换成新的字符串<br />INITCAP   字符首字母大写,其它字符小写<br />LOWER    字符全部小写<br />UPPER   字符全部大写<br />LTRIM(c1,c2)  去掉字符c1左边出现的字符c2<br />RTRIM(c1,c2) <br />TRIM(c1,c2)   去掉字符c1左右两边的字符c2<br />LPAD(c1,n,c2)   字符c1按制定的位数n显示不足的位数用c2字符串替换左边的空位<br />RPAD(c1,n,c2)</p>
		<p>3. 日期函数<br />ADD_MONTHS(d,n)   日期值加n月<br />LAST_DAY(d)    返回当月的最后一天的日期<br />MONTHS_BETWEEN(d1,d2)   两个日期值间的月份,d1&lt;d2 返回负数<br />NEXT_DAY(d)    返回日期值下一天的日期<br />SYSDATE    当前的系统时间<br />    DUAL是SYS用户下一个空表，它只有一个字段dummy<br />4. 转换函数(1)<br />TO_CHAR(date,'日期显示格式')   <br />TO_CHAR(number)    用于显示或报表的格式对齐<br />TO_DATE(char,'日期显示格式')   <br />TO_LOB      把long字段转换成lob字段<br />TO_NUMBER(char)    用于计算或者比较大小 </p>
		<p>4. 转换函数(2)<br />to_date里日期显示格式<br /> YYYY  年 YEAR YYY YY Y<br /> Q  季度 <br /> MM  月 MONTH MON <br /> W  星期 (week of month) WW, IW (week of year)  <br />(说明：周计是按ISO标准,从1月1日的星期数到后面七天为一周,不一定是从周一到周日) <br /> DD  日 DAY  DY <br /> HH24  小时 HH12  HH <br /> MI  分钟 <br /> SS  秒<br />如果想固定日期的显示格式可以在数据库的参数文件initorasid.ora里新写一行参数 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX环境变量或者NT的注册表里的设置 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss</p>
		<p>4. 转换函数(3)<br />如果想固定日期的显示格式可以用alter session命令改变<br />SQL&gt; alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';<br />它的作用顺序如下:<br />initialization parameter<br />Environment variable<br />ALTER SESSION command</p>
		<p>4. 转换函数 (4)<br />to_char(number)里数字显示格式<br /> 9 数字位<br /> 0 数字前面补0    to_char(-1200,'00000.00')<br /> . 小数点的位置 <br /> , 标记位置的逗号 用在数字显示格式的左边  <br /> L 根据数据库字符集加货币符号 to_char(-1200,'L9999.99')  <br /> B 把数字0显示为空格,用在数字显示格式的右边<br />  <br /> MI 右边的负数标记        to_char(-1200,'9999.99MI')<br /> PR     括起来的负数       to_char(-1200,'9999.99PR')<br /> EEEE 用指数方式表示       to_char(-1200,'9999.99EEEE')</p>
		<p>5. 输入字符,返回数字的函数<br />instr(c1,c2) 字符c2出现在c1的位置, 不出现, 返回0, 常用于模糊查询<br />length(c) 按数据库的字符集,算出字符c的长度,跟数据库的字符集有关, 一个汉字长度为1</p>
		<p>6. 有逻辑比较的函数NVL(EXPR1, EXPR2)函数<br />解释: IF EXPR1=NULL  RETURN EXPR2<br />  ELSE  RETURN EXPR1<br />DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数<br />解释: IF AA=V1 THEN RETURN R1<br />          IF AA=V2 THEN RETURN R2<br />  ..…<br />   ELSE<br />   RETURN NULL  <br />举例: decode(id,1,'dept sale',2,'dept tech')</p>
		<p>四、从多个表里选取数据记录<br />1. 数据表间的连接<br />简单的连接语法:<br />SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……]  <br /> WHERE 表名1.字段名 = 表名2. 字段名 [ AND ……] ; <br />SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……]<br />  WHERE 表名1.字段名 = 表名2. 字段名(+) [ AND ……] ; <br />有(+)号的字段位置自动补空值 </p>
		<p>连接的分类:<br /> 等于的连接  = <br /> 不等于的连接 !=   BETWEEN … AND …   IN  注意IN和OR不能一起用 <br /> 外连接  有一个字段名(+) , 没有满足的条件补空值 <br /> 自连接  同一个表自己跟自己连接   例如找重复记录</p>
		<p>2. 数据表间的连接例子<br />删除table_name表里字段名email重复的记录:<br />SQL&gt;delete from table_name t1<br /> where t1.rowid &gt;<br /> (select min(rowid) from table_name t2<br /> where t1.email = t2.email<br /> group by email <br /> having count(email) &gt; 1);</p>
		<p>找到手机用户的服务区域:<br />SQL&gt; select a.handphoneno,nvl(c.name,'null'),a.totalscore   <br />     from topscore a,chargeoperator cc,chargeoperatorinfo c  <br />        where substr(a.handphoneno,1,7)=cc.hpnohead(+)    <br />              and cc.chargetype=c.chargetype(+)<br />        order by a.totalscore desc;</p>
		<p>3. 数据表间的连接技巧<br />连接N个表, 需要N-1个连接操作<br />被连接的表最好建一个单字符的别名, 字段名前加上这个单字符的别名<br />BETWEEN .. AND.. 比用 &gt;= AND &lt;= 要好<br />连接操作的字段名上最好要有索引<br />连接操作的字段最好用整数数字类型<br />有外连接时, 不能用OR或IN的比较操作</p>
		<p>4. 如何分析和执行SQL语句<br />写多表连接SQL语句时要知道它的分析执行计划的情况. <br />Sys用户下运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql <br /> 产生plustrace角色<br />Sys用户下把此角色赋予一般用户 SQL&gt; grant plustrace to &amp;username;<br />一般用户下运行@/ORACLE_HOME/rdbms/admin/utlxplan.sql <br /> 产生plan_table<br />SQL&gt; set time on;   说明：打开时间显示 <br />SQL&gt; set autotrace on;    说明：打开自动分析统计，并显示SQL语句的运行结果<br />SQL&gt; set autotrace traceonly;  说明：打开自动分析统计，不显示SQL语句的运行结果<br />接下来你就运行测试SQL语句，看到其分析统计结果了。<br />一般来讲，我们的SQL语句应该避免大表的全表扫描。<br />SQL&gt; set autotrace off;   说明：关闭自动分析统计</p>
		<p>五、集合函数 经常和group by一起使用 <br />1. 集合函数列表<br />AVG   (DISTINCT | ALL | N)   取平均值<br />COUNT  (DISTINCT | ALL | N | expr | * ) 统计数量<br />MAX  (DISTINCT | ALL | N)   取最大值<br />MIN   (DISTINCT | ALL | N)   取最小值<br />SUM   (DISTINCT | ALL | N)   取合计值<br />STDDEV   (DISTINCT | ALL | N)   取偏差值,如果组里选择的内容都相同,结果为0<br />VARIANCE  (DISTINCT | ALL | N)       取平方偏差值</p>
		<p>2. 使用集合函数的语法<br />SELECT column, group_function FROM table<br /> WHERE condition GROUP BY group_by_expression<br /> HAVING group_condition ORDER BY column;<br /> <br />3. 使用count时的注意事项<br />SELECT COUNT(*) FROM table;<br />SELECT COUNT(常量) FROM table;</p>
		<p>都是统计表中记录数量,如果没有PK后者要好一些<br />SELECT COUNT(all 字段名) FROM table;<br />SELECT COUNT(字段名) FROM table;</p>
		<p>不会统计为NULL的字段的数量<br />SUM,AVG时都会忽略为NULL的字段</p>
		<p>4. 用group by时的限制条件<br />SELECT字段名不能随意, 要包含在GROUP BY的字段里<br /> GROUP BY后ORDER BY时不能用位置符号和别名<br /> 限制GROUP BY的显示结果, 用HAVING条件<br /> <br />5. 例子<br />SQL&gt; select title,sum(salary) payroll from s_emp<br /> where title like 'VP%' group by title <br /> having sum(salary)&gt;5000 order by sum(salary) desc;<br /> <br />找出某表里字段重复的记录数, 并显示<br />SQL&gt; select (duplicate field names) from table_name<br />     group by (list out fields) having count(*)&gt;1;</p>
		<p>6. 判断题(T/F)<br />(1) Group functions include nulls in calculations   [F]<br />(2) Using the having clause to exclude rows from a group calculation [F]<br />解释:<br />Group function 都是忽略NULL值的 如果您要计算NULL值, 用NVL函数<br />Where语句在Group By前把结果集排除在外Having语句在Group By后把结果集排除在外</p>
		<p>7. 在SQL*PLUS里可使用的其它命令:</p>
		<p> Ctrl^C    终止正在运行的SQL语句<br /> remark  /*...*/  --  注释符号<br /> HOST     可执行的操作系统下的命令 有些unix可以用 !</p>
		<p> BREAK ON column_name SKIP n [ ON column_name SKIP n ] <br />              按字段的名称column_name分隔显示,更清晰,SKIP n 是在分隔处空行的数量n<br />        BREAK ON ROW SKIP n  每一行间隔都放n个空行</p>
		<p> COMPUTE 集合运算符 OF 字段1 ON 字段2 按字段2对字段1进行集合运算<br /> COMPUTE后面可以跟的集合运算符:<br />  SUM  MINIMUM  MAXIMUM  AVG  STD  VARIANCE  COUNT  NUMBER</p>
		<p>8.在SQL*PLUS里可使用的其它命令举例:(scott用户)<br />        <br />        BREAK ON REPORT<br />        COMPUTE SUM LABEL TOTAL OF SAL ON REPORT 在全部结果集后面算合计<br />        select ename,sal from emp where job='SALESMAN';<br />        <br />        COMPUTE AVG LABEL avg OF SAL ON REPORT  在全部结果集后面算平均值<br />        /      再次执行上次的sql语句<br />        <br />        break on DEPTNO skip 2 on JOB skip 1   在BREAK字段结果集后面算合计<br /> COMPUTE SUM OF SAL ON DEPTNO   <br />        SELECT DEPTNO,JOB,ENAME,SAL FROM EMP ORDER BY DEPTNO,JOB;<br />   <br /> SQL&gt; CLEAR BREAKS;   清除设置的BREAK条件<br /> SQL&gt; CLEAR COMPUTES;   清除设置的COMPUTE条件</p>
		<p>六、子查询<br />1. 查询语句可以嵌套 <br />例如: SELECT …… FROM (SELECT …… FROM表名1, [表名2, ……]  WHERE 条件) WHERE 条件2; </p>
		<p>2. 何处可用子查询?<br />当查询条件是不确定的条件时<br />DML(insert, update,delete)语句里也可用子查询<br />HAVING里也可用子查询</p>
		<p>3. 两个查询语句的结果可以做集合操作 <br />例如: <br />并集UNION(去掉重复记录)<br />并集UNION ALL(不去掉重复记录)  <br />差集MINUS,     <br />交集INTERSECT </p>
		<p>4. 子查询的注意事项<br />先执行括号里面的SQL语句，一层层到外面<br />内部查询只执行一次<br />如果里层的结果集返回多个，不能用= &gt; &lt; &gt;= &lt;=等比较符要用IN.</p>
		<p>5. 子查询的例子(1)<br />SQL&gt; select title,avg(salary) from s_emp<br />  group by title  Having avg(salary) =<br />   (select min(avg(salary)) from s_emp<br />    group by title);<br />找到最低平均工资的职位名称和工资</p>
		<p>5. 子查询的例子(2)<br />子查询可以用父查询里的表名<br />这条SQL语句是对的:<br />SQL&gt;select cty_name from city where st_code in <br /> (select st_code from state where st_name='TENNESSEE' and <br />  city.cnt_code=state.cnt_code);<br />说明：父查询调用子查询只执行一次．</p>
		<p>6.取出结果集的80 到100的SQL语句<br />ORACLE处理每个结果集只有一个ROWNUM字段标明它的逻辑位置,<br />并且只能 用ROWNUM&lt;100, 不能用ROWNUM&gt;80。<br />以下是经过分析后较好的两种ORACLE取得结果集80到100间的SQL语句( ID是唯一关键字的字段名 )： <br />语句写法： <br />SQL&gt;select * from (<br /> ( select rownum as numrow, c.* from (<br />  select [field_name,...] from table_name where 条件1 order by 条件2) c)<br />    where numrow &gt; 80 and numrow &lt;= 100 )<br />    order by 条件3; </p>
		<p>七、在执行SQL语句时绑定变量<br />1. 接收和定义变量的SQL*PLUS命令<br /> ACCEPT<br /> DEFINE UNDEFINE<br /> &amp;<br /> <br />2.  绑定变量SQL语句的例子(1)<br />SQL&gt; select id, last_name, salary from s_emp where  dept_id = &amp;department_number;<br />Enter value for department_number: 10<br />old   1: select id, last_name, salary from s_emp where  dept_id=&amp;department_number;<br />new  1: select id, last_name, salary from s_emp where  dept_id= 10<br />SQL&gt; SET VERIFY OFF | ON;可以关闭和打开提示确认信息old  1和new  1的显示.</p>
		<p>3. 绑定变量SQL语句的例子(2)<br />SQL&gt; select  id, last_name, salary<br />   from s_emp<br />     where  title = '&amp;job_title';<br />Enter value for job_title: Stock Clerk</p>
		<p>SQL&gt; select  id, last_name, salary<br />   from s_emp<br />     where  hiredate &gt;to_date( '&amp;start_hire_date','YYYY-MM-DD');<br />Enter value for start_hire_date : 2001-01-01</p>
		<p>把绑定字符串和日期类型变量时，变量外面要加单引号<br />也可绑定变量来查询不同的字段名<br />输入变量值的时候不要加;等其它符号</p>
		<p>4. ACCEPT的语法和例子<br />SQL&gt; ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE]<br />说明： variable 指变量名  datatype 指变量类型，如number,char等 format  指变量显示格式 prompt text 可自定义弹出提示符的内容text hide  隐藏用户的输入符号<br />使用ACCEPT的例子：<br />ACCEPT p_dname PROMPT  'Provide the department name: '<br />ACCEPT p_salary NUMBER PROMPT  'Salary amount: '<br />ACCEPT pswd CHAR PROMPT  'Password: ' HIDE<br />ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):”</p>
		<p>4. DEFINE的语法和例子<br />SQL&gt; DEFINE variable = value<br />说明： variable 指变量名 value  指变量值<br />定义好了变良值后, 执行绑定变量的SQL语句时不再提示输入变量<br />使用DEFINE的例子：<br /> SQL&gt; DEFINE dname = sales<br /> SQL&gt; DEFINE dname<br /> DEFINE dname = “sales” (CHAR)<br /> SQL&gt; select name from dept where lower(name)='&amp;dname';<br /> NAME<br /> -------------------------<br /> sales<br /> sales<br /> SQL&gt; UNDEFINE dname<br /> SQL&gt; DEFINE dname<br /> Symbol dname is UNDEFINED</p>
		<p>5. SQL*PLUS里传递参数到保存好的*.sql文件里<br />SQL&gt; @     /路径名/文件名  参数名1[,参数名2, ….]<br />SQL&gt; start  /路径名/文件名  参数名1[,参数名2, ….]</p>
		<p>注意事项:<br />一次最多只能获取9个&amp;变量, 变量名称只能是从&amp;1,&amp;2到&amp;9<br />变量名后不要加特殊的结束符号<br />如果在SQL*PLUS里要把&amp;符号保存在ORACLE数据库里,要修改sql*plus环境变量define<br />SQL&gt; set define off;</p>
		<p>八、概述数据模型和数据库设计<br />1. 系统开发的阶段:<br />Strategy and Analysis<br />Design<br />Build and Document<br />Transition<br />Production</p>
		<p>2. 数据模型<br />Model of system in client's mind<br />Entity model of client's model<br />Table model of entity model<br />Tables on disk</p>
		<p>3. 实体关系模型 (ERM)概念<br />ERM ( entity relationship modeling)<br />实体 存有特定信息的目标和事件   例如: 客户,订单等<br />属性 描述实体的属性     例如: 姓名,电话号码等<br />关系 两个实体间的关系    例如:订单和产品等<br />实体关系模型图表里的约定<br />Dashed line (虚线)  可选参数 “may be”<br />Solid line (实线)  必选参数 “must be”<br />Crow's foot (多线)  程度参数 “one or more”<br />Single line (单线)  程度参数 “one and only one”</p>
		<p>
				<br />4. 实体关系模型例子<br />每个订单都必须有一个或几个客户<br />每个客户可能是一个或几个订单的申请者</p>
		<p>5. 实体关系的类型<br />1:1  一对一   例如: 的士和司机  <br />M:1  多对一   例如: 乘客和飞机<br />1:M  一对多   例如: 员工和技能</p>
		<p>6. 校正实体关系的原则<br />属性是单一值的, 不会有重复<br />属性必须依存于实体, 要有唯一标记<br />没有非唯一属性依赖于另一个非唯一的属性<br />7. 定义结构时的注意事项<br />减少数据冗余<br />减少完整性约束产生的问题<br />确认省略的实体,关系和属性</p>
		<p>8. 完整性约束的要求<br />Primary key 主关键字 唯一非NULL<br />Foreign key 外键  依赖于另一个Primary key,可能为NULL<br />Column  字段名  符合定义的类型和长度<br />Constraint 约束条件 用户自定义的约束条件,要符合工作流要求<br />  例如: 一个销售人员的提成不能超过它的基本工资<br />Candidate key 候选主关键字 多个字段名可组成候选主关键字, 其组合是唯一和非NULL的</p>
		<p>9. 把实体关系图映射到关系数据库对象的方法<br />把简单实体映射到数据库里的表<br />把属性映射到数据库里的表的字段, 标明类型和注释<br />把唯一标记映射到数据库里的唯一关键字<br />把实体间的关系映射到数据库里的外键</p>
		<p>其它的考虑:<br />设计索引,使查询更快<br />建立视图,使信息有不同的呈现面, 减少复杂的SQL语句<br />计划存储空间的分配<br />重新定义完整性约束条件</p>
		<p>10. 实体关系图里符号的含义<br />PK  唯一关键字的字段<br />FK  外键的字段<br />FK1,FK2  同一个表的两个不同的外键<br />FK1,FK1  两个字段共同组成一个外键<br />NN  非null字段<br />U  唯一字段<br />U1,U1  两个字段共同组成一个唯一字段</p>
		<p>九、创建表<br />1. ORACLE常用的字段类型<br />ORACLE常用的字段类型有<br />  VARCHAR2 (size)  可变长度的字符串, 必须规定长度<br />  CHAR(size)  固定长度的字符串, 不规定长度默认值为１<br /> NUMBER(p,s)   数字型p是位数总长度, s是小数的长度, 可存负数<br />    最长38位. 不够位时会四舍五入.<br /> DATE    日期和时间类型 <br /> LOB   超长字符, 最大可达4G<br />  CLOB  超长文本字符串 <br />  BLOB  超长二进制字符串 <br />  BFILE  超长二进制字符串, 保存在数据库外的文件里是只读的.</p>
		<p>数字字段类型位数及其四舍五入的结果<br />原始数值1234567.89<br />数字字段类型位数  存储的值<br />Number    1234567.89<br />Number(8)   12345678<br />Number(6)   错<br />Number(9,1)   1234567.9<br />Number(9,3)   错<br />Number(7,2)   错<br />Number(5,-2)   1234600<br />Number(5,-4)   1230000<br />Number(*,1)   1234567.9</p>
		<p>2. 创建表时给字段加默认值 和约束条件<br />创建表时可以给字段加上默认值<br />例如 :  日期字段 DEFAULT SYSDATE <br />这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间 </p>
		<p>创建表时可以给字段加上约束条件<br />例如: 非空  NOT NULL<br /> 不允许重复  UNIQUE<br /> 关键字  PRIMARY KEY <br /> 按条件检查 CHECK (条件)<br /> 外键  REFERENCES 表名(字段名)<br />  <br />3. 创建表的例子<br />CREATE TABLE DEPT(<br /> EPTNO  NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,<br /> DNAME  VARCHAR2(14),<br /> LOC  VARCHAR2(13)) ;</p>
		<p>CREATE TABLE region(<br />  ID    number(2)  NOT NULL PRIMARY KEY,<br />  postcode   number(6)  default '0' NOT NULL,<br />  areaname   varchar2(30)  default ' ' NOT NULL);</p>
		<p>4. 创建表时的命名规则和注意事项<br />表名和字段名的命名规则：必须以字母开头，可以含符号A-Z,a-z,0-9,_,$,#<br />大小写不区分<br />不用SQL里的保留字, 一定要用时可用双引号把字符串括起来．<br />用和实体或属性相关的英文符号长度有一定的限制</p>
		<p>注意事项:<br />建表时可以用中文的字段名, 但最好还是用英文的字段名 <br />创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面<br />建表时如果有唯一关键字或者唯一的约束条件，建表时自动建了索引<br />一个表的最多字段个数也是有限制的，254个.</p>
		<p>5. 约束名的命名规则和语法<br />约束名的命名规则约束名如果在建表的时候没有指明，系统命名规则是SYS_Cn(n是数字)<br />约束名字符串的命名规则同于表和字段名的命名规则</p>
		<p>6. 使用约束时的注意事项<br />约束里不能用系统函数,如SYSDATE和别的表的字段比较<br />可以用本表内字段的比较</p>
		<p>想在事务处理后, 做约束的检查<br />SQL&gt; alter session set constraints deferred.</p>
		<p>7. 由实体关系图到创建表的例子     s_dept<br />前提条件:已有region表且含唯一关键字的字段id<br />SQL&gt; CREATE TABLE s_dept<br />     (id  NUMBER(7)<br />        CONSTRAINT s_dept_id_pk PRIMARY KEY,<br />      name VARCHAR2(25)<br />        CONSTRAINT s_dept_name_nn NOT NULL,<br />     region_id NUMBER(7)<br />        CONSTRAINT s_dept_region_id_fk REFERENCES region (id),<br />        CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));<br />  <br />8. 较复杂的创建表例子<br />SQL&gt; CREATE TABLE s_emp  <br />  (id  NUMBER(7)  <br />       CONSTRAINT s_emp_id_pk PRIMARY KEY,  <br />   last_name VARCHAR2(25)  <br />       CONSTRAINT s_emp_last_name_nn NOT NULL,<br />   first_name VARCHAR2(25),<br />   userid VARCHAR2(8)  <br />       CONSTRAINT s_emp_userid_nn NOT NULL  <br />       CONSTRAINT s_emp_userid_uk UNIQUE, <br />  start_date DATE DEFAULT SYSDATE,<br />  comments VARCHAR2(25),<br />  manager_id NUMBER(7), <br />  title VARCHAR2(25),<br />  dept_id NUMBER(7) <br />       CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id), <br />  salary NUMBER(11,2),<br />  commission_pct NUMBER(4,2) <br />       CONSTRAINT s_emp_commission_pct_ck CHECK <br />       (commission_pct IN(10,12.5,15,17.5,20)));</p>
		<p>8.  通过子查询建表<br />通过子查询建表的例子<br />SQL&gt;CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date <br /> FROM s_emp WHERE dept_id = 41; <br /> <br />SQL&gt; CREATE TABLE A as select * from B where 1=2;<br />只要表的结构.</p>
		<p>10. 用子查询建表的注意事项<br />可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。<br />用子查询方式建立的表，只有非空NOT NULL的约束条件能继承过来, 其它的约束条件和默认值都没有继承过来.<br />根据需要，可以用alter table add constraint ……再建立其它的约束条件，如primary key等.</p>
		<p>10. Foreign Key的可选参数ON DELETE CASCADE<br />在创建Foreign Key时可以加可选参数:<br />ON DELETE CASCADE它的含义是如果删除外键主表里的内容，子表里相关的内容将一起被删除.<br />如果没有ON DELETE CASCADE参数，子表里有内容，父表里的主关键字记录不能被删除掉.</p>
		<p>12. 如果数据库表里有不满足的记录存在，建立约束条件将不会成功.</p>
		<p>13. 给表创建和删除同义词的例子<br />SQL&gt; CREATE SYNONYM d_sum<br />  2  FOR dept_sum_vu;</p>
		<p>SQL&gt; CREATE  PUBLIC  SYNONYM s_dept<br />  2  FOR alice.s_dept;</p>
		<p>SQL&gt; DROP SYNONYM  s_dept;</p>
		<p>十、ORACLE里的数据字典<br />1. 什么是数据字典ORACLE的数据字典是数据库的重要组成部分之一，它随着数据库<br /> 的产生而产生, 随着数据库的变化而变化, 体现为sys用户下所有的一些表和视图.</p>
		<p>2. 数据字典里存了以下内容：用户信息<br /> 用户的权限信息<br /> 所有数据对象信息表的约束条件统计分析数据库的视图等<br /> 不能手工修改数据字典里的信息.</p>
		<p>3. 常用的数据字典<br />Dictionary 存放所有数据表，视图，同义词名称和解释<br />Dict_columns 数据字典里字段名称的和解释<br />Dba_users 用户  Dba_tablespaces  表空间<br />Dba_data_files 数据库的文件 Dba_free_space       空闲表空间<br />Dba_rollback_segs 回滚段<br />User_objects 数据对象 User_constraints 约束条件<br />User_sequences 序列号  User_views  视图<br />User_indexes 索引  User_synonyms  同义词<br />Session_roles 用户的角色 User_role_privs  用户的角色权限<br />User_sys_privs 用户的系统权限 User_tab_privs  用户的表级权限<br />V$session 实时用户情况 V$sysstat  实时系统统计<br />V$sesstat 实时用户统计 V$sgastat  实时SGA使用<br />V$locked_object 实时锁  V$controlfile  控制文件<br />V$logfile 日志文件 V$parameter  参数文件</p>
		<p>4. 数据字典的分类<br />数据字典四大类别<br />User_  用户下所有数据库对象<br />All_  用户权限范围内所有的数据库对象<br />Dba_  所有的数据库对象<br />V$  统计分析数据库的视图  赋于oem_monitor权限非DBA用户也可查询V$*视图</p>
		<p>5. 查询数据字典<br />SQL&gt; select * from dictionary where instr(comments,'index')&gt;0;<br />SQL&gt; select constraint_name, constraint_type,<br />  2  search_condition, r_constraint_name<br />  3  from user_constraints<br />  4  where table_name = ‘&amp;table_name';</p>
		<p>十一. 控制数据<br />1 、INSERT(往数据表里插入记录的语句)<br />SQL&gt; insert into 表名(字段名1, 字段名2, ……) values ( 值1, 值2, ……);<br />SQL&gt; insert into 表名(字段名1, 字段名2, ……) select (字段名1, 字段名2, ……) <br />  from  另外的表名 where 条件;  <br />可以用&amp;标记变量的方法多次输入记录</p>
		<p>快速插入数据的方法, 一般用于大于128M的数据转移<br />SQL&gt; insert /*+ append */ into 表名 <br /> select * from  另外的用户名 .另外的表名 WHERE 条件; <br />SQL&gt; commit; </p>
		<p>注意事项：<br />     用INSERT /*+ APPEND */ 的方法会对target_tablename产生级别为6的独占锁，<br />     如果运行此命令时还有对target_tablename的DML操作会排队在它后面,<br />     对OLTP系统在用的表操作是不合适的。</p>
		<p>2. 插入字符串类型的字段的注意事项: <br />字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’ <br />如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个   单引号’ ’<br />字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验 <br />‘’ 标记是NULL, user 标明当前用户<br />日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒<br />用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)<br />TO_DATE(  )还有很多种日期格式, 可以参看ORACLE DOC.<br />年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS <br />INSERT时最大可操作的字符串长度小于等于4000个单字节, <br />如果要插入更长的字符串, 请考虑字段用CLOB类型, 方法借用ORACLE里自带的DBMS_LOB程序包. </p>
		<p>3、UPDATE (修改数据表里记录的语句) <br />SQL&gt; UPDATE 表名 SET 字段名1=值1, 字段名2=值2, ……  WHERE 条件;<br />如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL, <br />最好在修改前进行非空校验;<br />值N超过定义的长度会出错, 最好在插入前进行长度校验.<br />新功能，可以修改子查询后的结果集<br />例子：SQL&gt; update (select * from s_dept) set id=50 where id=60;</p>
		<p>4、DELETE (删除数据表里记录的语句) <br />SQL&gt; DELETE FROM  表名 WHERE 条件;<br />注意：删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些   被删除的数据块标成unused. <br />如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间 <br />SQL&gt; TRUNCATE TABLE 表名;<br />此操作不可回退. <br /> <br />5、 SQL语句的分类<br />数据定义语言(DDL)：create、alter、drop（创建、修改结构、删除）（其他：rename）<br />数据操纵语言(DML)：insert、delete、select、update（增、删、查、改）（其他：truncate） <br />数据控制语言(DCL)：grant、revoke（授权、回收）、set role <br />事务控制：commit、rollback、savepoint（其他：lock table、set constraint(s)、set transaction）<br />审计控制：audit、noaudit<br />系统控制：alter system 会话控制：alter session <br />其他语句：comment（添加注释）、explain plan、analyze、validate、call </p>
		<p>6、ORACLE里事务控制  <br />Commit  提交事务<br />Rollback 回退事务<br />Savepoint 设置断点, 在事务中标记位置, 事务结束, 断点释放<br />事务结束的情况遇到commit或者rollback遇到DDL和DCL语句发现错误，如死锁用户退出SQL*PLUS系统重启或崩溃</p>
		<p>6、事物控制和SAVEPOINT命令</p>
		<p>7. DML操作的注意事项 <br />以上SQL语句对表都加上了行级锁, 确认完成后, 必须加上事物处理结束的命令COMMIT 才能正式生效,<br />否则改变不一定写入数据库里.行级锁也未能得到释放. <br />如果想撤回这些操作, 可以用命令 ROLLBACK 复原. <br />在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围, <br />应该把它限定在较小 (一万条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段. <br />程序响应慢甚至失去响应. 如果记录数上十万以上这些操作, <br />可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理. <br />太过频繁的commit不好</p>
		<p>十二、改变表和约束条件 <br />1. 改变表的几种情况(1)  运行时会加表级锁<br />改变表的名称 <br />SQL&gt; RENAME 表名1 TO 表名2; SQL&gt; ALTER TABLE 表名1 RENAME TO 表名2;<br />在表的后面增加一个字段 <br />SQL&gt; ALTER TABLE 表名 ADD 字段名 字段名描述   [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……]; <br />修改表里字段的定义描述 <br /> SQL&gt; ALTER TABLE 表名 MODIFY 字段名1 字段名1描述  [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……]; 记录为空时，可以减少字段长度，改变字段类型修改DEFAULT值只作用于修改后的INSERT和UPDATE的记录修改NOT NULL约束只对现存含非空记录的字段起作用</p>
		<p>1. 改变表的几种情况(2)  运行时会加表级锁<br />删除表里的某个字段<br />SQL&gt; ALTER TABLE 表名 DROP 字段名; <br />给表里的字段加上/禁止/启用约束条件<br />SQL&gt; ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 PRIMARY KEY (字段名1[,字段名2 ……]); <br />SQL&gt; ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 UNIQUE (字段名1[,字段名2 ……]); <br />加唯一关键字或者唯一约束条件时自动建立索引<br />说明：禁止唯一关键字和唯一约束时索引仍然存在，可以被使用.</p>
		<p>1. 改变表的几种情况(3)  运行时会加表级锁<br />删除表里的约束条件<br />SQL&gt; ALTER TABLE 表名 DROP CONSTRAINTS 约束名 [CASCADE];<br />  会把约束相关的索引一起删除. CASCADE能同时删去外键的约束条件.<br />把表放在或取出数据库的内存区 <br />SQL&gt; ALTER TABLE 表名 CACHE;<br />SQL&gt; ALTER TABLE 表名 NOCACHE; <br />改变表存储的表空间<br />SQL&gt; ALTER TABLE 表名 MOVE TABLESPACE 表空间名 ;<br />注意: 如果被转移表空间的表含有索引, 表转移后索引变得不可用.<br />      我们要删除旧索引,建立新索引</p>
		<p>2. 删除表及表里的数据<br />删除表<br />SQL&gt; DROP TABLE 表名 [CASCADE CONSTRAINTS];<br />清空表里的记录<br />SQL&gt; TRUNCATE TABLE 表名;<br />按时间清空日志表里的记录，使用重新命名的方法(应用程序可能有短暂出错, 可以选择在不繁忙的时间执行)<br />按原来表A的建表语句创建新表A1,<br />把表A重命名为A2（如果表A上有较频繁的DML操作,会对表加上行级锁，重命名过程用递归的方式循环做，直到DML操作结束，命名成功).<br />把创建新表A1重命名为A<br />历史记录表A2备份或删除</p>
		<p>3.  删除表后应该注意的问题<br />删除表后把表里的索引一起删去.<br />删除表后会结束基于它的悬而未决的事物<br />删除表后根据表创建的views,synonym,stored procedure,stored function依然存在，但views,synonym变成非法的. 需要手工找出它们并删除.<br />如果用了CASCADE CONSTRAINTS会把与它相关的约束一起删除<br />此操作不可回退</p>
		<p>4. 给表加注释 <br />加注释的语法<br />SQL&gt; COMMENT ON TABLE 表名 | COLUMN表名.字段名 IS ‘text‘<br />加注释的例子<br />SQL&gt; comment on table s_emp is ‘Enployee information‘;<br />SQL&gt; comment on column s_emp.last_name is ‘‘;<br />关于注释的数据库字典<br /> ALL_COL_COMMENTS<br /> USER_COL_COMMENTS<br /> ALL_TAB_COMMENTS<br /> USER_TAB_COMMENTS</p>
		<p>十三、创建序列号 <br />1. 创建序列号里各参数的解释<br />SQL&gt; CREATE SEQUENCE name [INCREMENT BY n]  <br />  [START WITH n] [{MAXVALUE n | NOMAXVALUE}]  <br />  [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}]  <br />  [{CACHE n | NOCACHE}]<br />INCREMENT BY n  一次增长n 个数字<br />NOMAXVALUE  缺省值10E+27<br />NOMINVALUE  缺省值1<br />NOCYCLE  不循环, 常用于唯一关键字<br />CACHE n  在内存里缓存n个序列,出错回退时会丢失<br />    oracle8i里默认的n是20</p>
		<p>序列号的名称一般可以采用“表名_字段名”的命名规则</p>
		<p>2. 插入自动增长序列号字段的方法 <br />INSERT时如果要用到从1开始自动增长的数字做唯一关键字, 应该先建立一个序列号.<br />CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 NOCYCLE NOCACHE;<br />其中最大的值按字段的长度来定,比如定义的自动增长的序列NUMBER(6) , 最大值为999999 <br />INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL<br />例子: SQL&gt; insert into s_dept(id, name, region_id)  values (s_dept_id.nextval, 'finance', 2);<br /> 1 row created.<br />只有运行了序列号的名称. nextval后序列号的名称. currval 才有效才有值.</p>
		<p>3. 查询序列号的情况<br />SQL&gt; select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;<br />其中last_number指的是序列号的下一个值.</p>
		<p>4. 改变序列号<br />SQL&gt; ALTER SEQUENCE sequence [INCREMENT BY n]           [{MAXVALUE n | NOMAXVALUE}]<br />   [{MINVALUE n | NOMINVALUE}]  <br />  [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];<br />注意: 不能改变它的起始值<br />  如果要改变序列的起始值, 先把序列号删除掉, 再新建一个.<br />  <br />5. 删除序列号<br />SQL&gt;DROP SEQUENCE sequence;</p>
		<p>6. 不能用序列号的nextval和currval的地方</p>
		<p>视图的查询<br />有distinct的查询<br />有group by,having,order by的查询<br />有子查询的查询<br />表里的缺省值</p>
		<p>十四、创建视图 <br />1. 视图的概念和优点<br />视图是基于一个或多个表及视图的一些查询语句, 它象显示数据的视窗, 它本身是不存储数据的.<br /> <br />视图可以限制数据库的访问, 更好的控制权限<br />使用户使用简单的查询语句<br />数据的非依赖性<br />同一数据的不同表现形式</p>
		<p>2. 创建视图的语法<br />SQL&gt; CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW  view[(alias[, alias]...)]<br />  AS subquery<br />  [WITH CHECK OPTION [CONSTRAINT constraint]]<br />  [WITH READ ONLY]<br />参数解释:<br />FORCE   表不存在时,视图仍然可以创建成功<br />WITH CHECK OPTION  只有符合视图定义的记录才能被插入或修改<br />WITH READ ONLY 不允许DML操作</p>
		<p>Oracle8i以后创建视图可以用order by</p>
		<p>3. 创建修改视图的例子<br />SQL&gt; CREATE OR REPLACE VIEW salvu41  AS SELECT id, first_name FIRST,<br />    last_name LAST, salary MONTHLY_SALARY<br />     FROM s_emp  WHERE dept_id = 41;<br />SQL&gt; CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal)  AS SELECT d.name, MIN(e.salary), MAX(e.salary),  AVG(e.salary) FROM s_emp e, s_dept d WHERE e.dept_id = d.id GROUP BY d.name;<br />注意: 如果用select * from table_name创建的视图<br />  table_name的结构改变后 view要重建或compile后才能显示新的字段内容</p>
		<p>4. 查询视图的数据字典<br />SQL&gt; set long 1600;<br />SQL&gt; select view_name,text from user_views;<br />说明: 可以根据视图text_length来设置set long 数字;<br />User_updatable_columns视图能查询视图里能被修改的字段</p>
		<p>5.  简单和复杂的视图对比<br />特    性   简单视图 复杂视图 <br />表的数量   一个   多个 <br />有函数吗?   没有   有 <br />有分组操作吗?   没有   有 <br />有基于视图的DML操作吗?  有   没有 </p>
		<p>6. 在视图上可以用DML命令吗? <br />可以, 但有一定的限制条件<br />没有下面的情况, 可以删除view里的记录. group function, group by, distinct<br />没有上面和下面的情况, 可以修改view里的记录. 字段表达式, <br />例如: salary*12 含rownum的view<br />没有上面两种情况, 且view里含基表里所有非空字段的情况,  可以往view里插入记录.<br /> <br />7. 在视图里使用 WITH CHECK OPTION约束条件<br />SQL&gt; create or replace view empvu41  <br /> as select * from s_emp where dept_id = 41<br /> with check option constraint empvu41_ck;<br />如果运行下面命令会出错ora-01402<br />SQL&gt; update empvu41 set dept_id=42 where id=16;<br />原因: 视图empvu41里规定只能看部门号为41的记录 修改后会把记录排除在视图empvu41以外<br /> 与它的约束条件冲突</p>
		<p>8. 删除视图<br />SQL&gt; DROP VIEW view_name;</p>
		<p>十五、创建索引</p>
		<p>1.索引的概念<br />索引是数据库里的一种数据对象<br />它利用B*树, hash, bitmap结构直接快速地访问数据<br />它和表是分开存放的两个实体<br />索引创建好了后, 由系统自动调用和管理</p>
		<p>2. 什么时候创建索引? <br />自动创建的索引:唯一关键字, 唯一的约束条件<br />手工需要创建的索引:大表查询时, sql语句where后经常用到的字段或字段组合<br />  字段内容差别很大有大量NULL值表很大, 返回记录数较少 </p>
		<p>3. B*树索引的结构 每个索引由字段值和指针或ROWID组成</p>
		<p>4.创建索引的语法<br />CREATE INDEX  索引名 ON  表名 ( 字段1, [字段2, ……] )  TABLESPACE 表空间名; </p>
		<p>5.创建索引的注意事项<br /> 创建索引时会加行级独占锁<br /> 一个表的索引最好不要超过三个 (特殊的大表除外)<br /> 最好用单字段索引<br /> 索引最好和表分不同的表空间存放<br /> 结合SQL语句的分析执行情况, 也可以建立多字段的组合索引和基于函数的索引 <br /> 大表的索引会占用很大的存储空间<br /> 不要建唯一的索引, 而应该加唯一的约束条件</p>
		<p>6.查询索引的方法<br />查询数据字典user_indexes和user_ind_columns</p>
		<p>例子: <br />SQL&gt; SELECT ic.index_name, ic.column_name,<br />  2         ic.column_position col_pos,ix.uniqueness<br />  3  FROM user_indexes ix, user_ind_columns ic<br />  4  WHERE ic.index_name = ix.index_name<br />  5  AND ic.table_name = 'S_EMP';</p>
		<p>注意: 数据字典里存放的字符都是大写的.</p>
		<p>7. 不用索引的地方<br />表很小<br />where后不经常使用的比较字段<br />表被频繁修改<br />返回记录数很多<br />where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件</p>
		<p>8. 重建索引的语法<br />ALTER INDEX 索引名 REBUILD TABLESPACE 原来表空间名 NOLOGGING; <br />定期重建索引可以减少索引的碎片, 更有效地使用表空间.</p>
		<p>9. 删除索引<br />SQL&gt; drop index 索引名;<br />SQL&gt; alter table 表名 drop constraint 约束名;</p>
		<p>十六、控制用户访问<br />1.权限的类别<br />系统级权限: 针对整个系统操作的权限  <br /> 如: 用户名/密码, 使用表空间的限额等 <br />对象级权限: 针对某个具体object操作的权限 <br /> 如: 针对某个表, 视图, 表的某个字段的select, update, delete权限<br />2. 查看当前数据库的用户信息<br />SQL&gt;select username,default_tablespace,temporary_tablespace from dba_users;<br />   查看在线用户信息<br />SQL&gt;select count(*) “number”,username “current username”  from v$session group by username;   用户查看自己的缺省表空间SQL&gt;select username,default_tablespace from user_users;</p>
		<p>3. 创建新用户<br />SQL&gt; create user username identified by password <br /> default tablespace tablespace_name temporary tablespace temp <br /> quota unlimited on tablespace_name<br /> quota 1k on system<br /> [quota 1k on other_tablespace_name ……] ;<br />给用户赋权限<br />SQL&gt; grant connect, resource to username;<br />查看当前用户的权限角色<br />SQL&gt;  select * from user_role_privs;<br />查看当前用户的系统权限和表级权限<br />SQL&gt;  select * from user_sys_privs;SQL&gt;  select * from user_tab_privs;</p>
		<p>4 、常用的角色及其权限<br />CONNECT        8 privs 连上Oracle,做最基本操作<br />RESOURCE       8  privs 具有程序开发最的权限<br />DBA            114  privs 数据库管理员所有权限<br />EXP_FULL_DATABASE      5  privs 数据库整个备份输出的权限<br />IMP_FULL_DATABASE        64  privs 数据库整个备份输入的权限<br />查看角色明细的系统权限<br />SQL&gt; select * from role_sys_privs;</p>
		<p>5、改变老用户     可以改变老用户的密码, 缺省表空间, 临时表空间, 空间限额.<br />SQL&gt; alter user username identified by password  <br />      default tablespace tablespace_name <br />      temporary tablespace temp   <br />      quota unlimited on tablespace_name<br />      quota 1k on system<br />      [quota 1k on other_tablespace_name ……] ;<br />撤销用户的角色或权限<br />SQL&gt; revoke role_name or priv_name from username;<br />注意事项<br />     撤消用户的角色dba时, 同时撤消了用户unlimited tablespace的系统权限, 切记要再次赋予resource角色给此用户<br />SQL&gt; grant resource to username;</p>
		<p>6、删除用户<br />如果用户下没有任何数据对象<br />SQL&gt; drop user username;<br />如果用户下有数据对象<br />SQL&gt; drop user username cascade;<br />注意事项<br />    如果用户下有含clob,blob字段的表, 应该先删除这些表后,才能用cascade选项完全删除.</p>
		<p>7、角色的概念和管理<br />角色是命名多个相关权限的组合. 能把它赋于其它的用户或角色我们能创建角色, 使权限管理更容易一些. </p>
		<p>8、赋于系统的权限语法和例子<br />语法:<br />SQL&gt; GRANT sys_priv TO {user|role|PUBLIC}      [WITH ADMIN OPTION];<br />例子:<br />SQL&gt; GRANT create session  TO sue, rich;<br />SQL&gt; GRANT create table To scott, manager;</p>
		<p>注意: 如果用WITH ADMIN OPTION通过中间用户赋于的系统权限 中间用户删除后, 系统权限仍然存在.</p>
		<p>9、赋于数据对象级的权限语法和例子<br />语法:<br />SQL&gt; GRANT object_priv [(columns)] ON object TO {user|role|PUBLIC}      [WITH GRANT OPTION];<br />例子:<br />SQL&gt; GRANT select ON s_emp  TO sue, rich;<br />SQL&gt; GRANT update (name, region_id)<br /> ON s_dept  TO scott, manager;</p>
		<p>注意: 如果用WITH GRANT OPTION通过中间用户赋于的对象权限 中间用户删除后,对象权限就不存在了.       </p>
<img src ="http://www.blogjava.net/ctguzhupan/aggbug/62785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ctguzhupan/" target="_blank">温柔一刀</a> 2006-08-10 14:21 <a href="http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 日期类型字段的操作</title><link>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62779.html</link><dc:creator>温柔一刀</dc:creator><author>温柔一刀</author><pubDate>Thu, 10 Aug 2006 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62779.html</guid><wfw:comment>http://www.blogjava.net/ctguzhupan/comments/62779.html</wfw:comment><comments>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ctguzhupan/comments/commentRss/62779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ctguzhupan/services/trackbacks/62779.html</trackback:ping><description><![CDATA[
		<p>在java对oracle的操作中，日期字段是很头疼的事情，其实仔细研究一下也并不难掌握。</p>
		<p>举个例子来说明：</p>
		<p>表 book  中有name varchar2(20)//书籍名称,buydate Date //购买日期 两个字段。</p>
		<p>已经创建了数据库连接Connection conn;</p>
		<p>方法一、使用java.sql.Date实现比较简单的yyyy-mm-dd格式日期。</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Date不支持时间格式。切记不要使用new java.sql.Date(int year,int month,int date),因为还要处理时间差问题。</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Date buydate=java.sql.Date.valueOf("2005-06-08");<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setDate(2,buydate );<br />pstmt.execute();</p>
		<p>方法二、使用java.sql.Timestamp,同上不使用new Timestamp(....)</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">java.sql.Timestamp buydate=java.sql.Timestamp.valueOf("2004-06-08 05:33:99");<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setTimestamp(2,buydate );<br />pstmt.execute();</p>
		<p>方法三、使用oracle 的to_date内置函数</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,to_date(?, 'yyyy-mm-dd hh24:mi:ss')");</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">String buydate="2004-06-08 05:33:99";<br />pstmt.setString(1, "Java编程思想");<br />pstmt.setString(2,buydate );<br />pstmt.execute();</p>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">附:oracle日期格式参数 含义说明  <br />d: 一周中的星期几  <br />day: 天的名字，使用空格填充到9个字符  <br />dd: 月中的第几天  <br />ddd: 年中的第几天  <br />dy: 天的简写名  <br />iw: ISO标准的年中的第几周  <br />iyyy: ISO标准的四位年份  <br />yyyy: 四位年份  <br />yyy,yy,y: 年份的最后三位，两位，一位  <br />hh: 小时，按12小时计  <br />hh24: 小时，按24小时计  <br />mi: 分  <br />ss: 秒  <br />mm: 月  <br />mon: 月份的简写  <br />month: 月份的全名  <br />w: 该月的第几个星期  <br />ww: 年中的第几个星期</p>
<img src ="http://www.blogjava.net/ctguzhupan/aggbug/62779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ctguzhupan/" target="_blank">温柔一刀</a> 2006-08-10 13:18 <a href="http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE 常用的SQL语法和数据对象</title><link>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62726.html</link><dc:creator>温柔一刀</dc:creator><author>温柔一刀</author><pubDate>Thu, 10 Aug 2006 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62726.html</guid><wfw:comment>http://www.blogjava.net/ctguzhupan/comments/62726.html</wfw:comment><comments>http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ctguzhupan/comments/commentRss/62726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ctguzhupan/services/trackbacks/62726.html</trackback:ping><description><![CDATA[一.数据控制语句 (DML) 部分<br /><br />1.INSERT  (往数据表里插入记录的语句)<br /><br />INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); <br />INSERT INTO 表名(字段名1, 字段名2, ……)  SELECT 字段名1, 字段名2, …… FROM 另外的表名;<br /><br />字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’<br />如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个单引号''. <br />字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验.<br /><br />日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒<br />或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)<br />TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC. <br />年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS<br /><br />INSERT时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,<br />方法借用ORACLE里自带的DBMS_LOB程序包.<br /><br />INSERT时如果要用到从1开始自动增长的序列号, 应该先建立一个序列号<br />CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1  START  WITH  1 <br />MAXVALUE  99999  CYCLE  NOCACHE;<br />其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999<br />INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL<br /><br />2.DELETE  (删除数据表里记录的语句)<br /><br />DELETE FROM表名 WHERE 条件;<br /><br />注意：删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些被删除的数据块标成unused.<br /><br />如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间<br />TRUNCATE TABLE 表名; <br />此操作不可回退.<br /><br />3.UPDATE  (修改数据表里记录的语句)<br /><br />UPDATE表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件;<br /><br />如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL, 最好在修改前进行非空校验; <br />值N超过定义的长度会出错, 最好在插入前进行长度校验..<br /><br />注意事项: <br />A. 以上SQL语句对表都加上了行级锁,<br />确认完成后, 必须加上事物处理结束的命令 COMMIT 才能正式生效, <br />否则改变不一定写入数据库里. <br />如果想撤回这些操作, 可以用命令 ROLLBACK 复原.<br /><br />B. 在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围, <br />应该把它限定在较小 (一万条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段. <br />程序响应慢甚至失去响应. 如果记录数上十万以上这些操作, 可以把这些SQL语句分段分次完成, <br />其间加上COMMIT 确认事物处理.<br /><br />二.数据定义 (DDL) 部分<br /><br />1.CREATE (创建表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等)<br /><br />ORACLE常用的字段类型有<br />CHAR 固定长度的字符串<br />VARCHAR2 可变长度的字符串<br />NUMBER(M,N) 数字型M是位数总长度, N是小数的长度<br />DATE 日期类型<br /><br />创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面<br /><br />创建表时可以用中文的字段名, 但最好还是用英文的字段名<br /><br />创建表时可以给字段加上默认值, 例如 DEFAULT SYSDATE<br />这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间<br /><br />创建表时可以给字段加上约束条件<br />例如 不允许重复 UNIQUE, 关键字 PRIMARY KEY<br /><br />2.ALTER (改变表, 索引, 视图等)<br /><br />改变表的名称<br />ALTER TABLE 表名1  TO 表名2;<br /><br />在表的后面增加一个字段<br />ALTER TABLE表名 ADD 字段名 字段名描述;<br /><br />修改表里字段的定义描述<br />ALTER TABLE表名 MODIFY字段名 字段名描述;<br /><br />给表里的字段加上约束条件<br />ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (字段名);<br />ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (字段名);<br /><br />把表放在或取出数据库的内存区<br />ALTER TABLE 表名 CACHE;<br />ALTER TABLE 表名 NOCACHE;<br /><br />3.DROP (删除表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等)<br /><br />删除表和它所有的约束条件<br />DROP TABLE 表名 CASCADE CONSTRAINTS;<br /><br />4.TRUNCATE (清空表里的所有记录, 保留表的结构)<br /><br />TRUNCATE 表名;<br /><br />三.查询语句 (SELECT) 部分<br /><br />SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 条件; <br /><br />字段名可以带入函数<br />  例如:  COUNT(*), MIN(字段名),  MAX(字段名),  AVG(字段名), DISTINCT(字段名), <br />  TO_CHAR(DATE字段名,'YYYY-MM-DD HH24:MI:SS')<br /><br />NVL(EXPR1, EXPR2)函数<br />解释: <br />IF EXPR1=NULL<br />RETURN EXPR2<br />ELSE<br />       RETURN EXPR1<br /><br />DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数<br />解释: <br />IF AA=V1 THEN RETURN R1<br />IF AA=V2 THEN RETURN R2<br />..…<br />ELSE<br />RETURN NULL<br /><br />LPAD(char1,n,char2)函数<br />解释:<br />字符char1按制定的位数n显示，不足的位数用char2字符串替换左边的空位<br /><br />字段名之间可以进行算术运算<br />例如:  (字段名1*字段名1)/3<br /><br />查询语句可以嵌套<br />例如: SELECT …… FROM <br />(SELECT …… FROM表名1, [表名2, ……] WHERE 条件) WHERE 条件2;<br /><br />两个查询语句的结果可以做集合操作<br />例如: 并集UNION(去掉重复记录), 并集UNION ALL(不去掉重复记录), 差集MINUS,  交集INTERSECT<br /><br />分组查询<br />SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] GROUP BY字段名1 <br />[HAVING 条件] ;<br /><br />两个以上表之间的连接查询<br /><br />SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE <br />表名1.字段名 = 表名2. 字段名 [ AND ……] ;<br /><br />SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE <br />表名1.字段名 = 表名2. 字段名(+) [ AND ……] ;<br /><br />有(+)号的字段位置自动补空值<br /><br />查询结果集的排序操作, 默认的排序是升序ASC, 降序是DESC<br /><br />SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] <br />ORDER BY字段名1, 字段名2 DESC;<br /><br />字符串模糊比较的方法<br /><br />INSTR(字段名, ‘字符串’)&gt;0 <br />字段名 LIKE  ‘字符串%’  [‘%字符串%’]<br /><br />每个表都有一个隐含的字段ROWID, 它标记着记录的唯一性. <br /><br />四.ORACLE里常用的数据对象 (SCHEMA)<br /><br />1.索引 (INDEX)<br /><br />CREATE INDEX 索引名ON 表名 ( 字段1, [字段2, ……] );<br />ALTER INDEX 索引名 REBUILD;<br /><br />一个表的索引最好不要超过三个 (特殊的大表除外), 最好用单字段索引, 结合SQL语句的分析执行情况, <br />也可以建立多字段的组合索引和基于函数的索引<br /><br />ORACLE8.1.7字符串可以索引的最大长度为1578 单字节<br />ORACLE8.0.6字符串可以索引的最大长度为758 单字节<br /><br />ORACLE DOC上说字符串最大可以建索引的长度约是:数据块的大小(db_block_size)*40%<br /><br />2.视图 (VIEW)<br /><br />CREATE VIEW 视图名AS SELECT …. FROM …..;<br />ALTER VIEW视图名 COMPILE;<br /><br />视图仅是一个SQL查询语句, 它可以把表之间复杂的关系简洁化.<br /><br />3.同义词 (SYNONMY)<br />CREATE SYNONYM同义词名FOR 表名;<br />CREATE SYNONYM同义词名FOR 表名@数据库链接名;<br /><br />4.数据库链接 (DATABASE LINK)<br />CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘数据库连接字符串’;<br /><br />数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义.<br /><br />数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样<br /><br />数据库全局名称可以用以下命令查出<br />SELECT * FROM GLOBAL_NAME;<br /><br />查询远端数据库里的表<br />SELECT …… FROM 表名@数据库链接名;<br /><br />五.权限管理 (DCL) 语句<br /><br />1.GRANT 赋于权限<br />常用的系统权限集合有以下三个:<br />CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理)<br />常用的数据对象权限有以下五个:<br />ALL ON 数据对象名, SELECT ON 数据对象名, UPDATE ON 数据对象名,<br />DELETE ON 数据对象名,  INSERT ON 数据对象名,   ALTER  ON 数据对象名<br /><br />GRANT CONNECT, RESOURCE TO 用户名;<br />GRANT SELECT ON 表名 TO 用户名;<br />GRANT SELECT, INSERT, DELETE ON表名 TO 用户名1, 用户名2;<br /><br />2.REVOKE 回收权限<br /><br />REVOKE CONNECT, RESOURCE FROM 用户名;<br />REVOKE SELECT ON 表名 FROM 用户名;<br />REVOKE SELECT, INSERT, DELETE ON表名 FROM 用户名1, 用户名2;<br /><img src ="http://www.blogjava.net/ctguzhupan/aggbug/62726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ctguzhupan/" target="_blank">温柔一刀</a> 2006-08-10 10:10 <a href="http://www.blogjava.net/ctguzhupan/archive/2006/08/10/62726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>