﻿<?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-渔人码头-文章分类-DataBase</title><link>http://www.blogjava.net/fisher/category/17941.html</link><description>天行健，君子以自强不息。地势坤，君子以厚德载物。</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:43:52 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:43:52 GMT</pubDate><ttl>60</ttl><item><title>MySQL索引经验之浅见</title><link>http://www.blogjava.net/fisher/articles/92951.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Wed, 10 Jan 2007 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/92951.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/92951.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/92951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/92951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/92951.html</trackback:ping><description><![CDATA[
		<p>【IT168 服务器学院】在数据库表中，使用索引可以大大提高查询速度。  假如我们创建了一个testIndex表:<br />CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL);</p>
		<p>    我们随机向里面插入了1000条记录，其中有一条<br />i_testID vc_Name<br />555 erquan</p>
		<p>    在查找vc_Name="erquan"的记录<br />SELECT * FROM testIndex WHERE vc_Name='erquan';<br />时，如果在vc_Name上已经建立了索引，MySql无须任何扫描，即准确可找到该记录！相反，MySql会扫描所有记录，即要查询1000次啊~~可以索引将查询速度提高100倍。</p>
		<p>    一、索引分单列索引和组合索引<br />单列索引：即一个索引只包含单个列，一个表可以有多个单列索引，但这不是组合索引。<br />组合索引：即一个索包含多个列。</p>
		<p>    二、介绍一下索引的类型</p>
		<p>1.普通索引。<br />    这是最基本的索引，它没有任何限制。它有以下几种创建方式：<br />（1）创建索引：CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型，length可以小于字段实际长度;如果是BLOB 和 TEXT 类型，必须指定length，下同。<br />（2）修改表结构：ALTER tableName ADD INDEX [indexName] ON (tableColumns(length)) <br />（3）创建表的时候直接指定：CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;</p>
		<p>2.唯一索引。<br />    它与前面的"普通索引"类似，不同的就是：索引列的值必须唯一，但允许有空值。如果是组合索引，则列值的组合必须唯一。它有以下几种创建方式：<br />（1）创建索引：CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))<br />（2）修改表结构：ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))<br />（3）创建表的时候直接指定：CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));</p>
		<p>3.主键索引<br />    它是一种特殊的唯一索引，不允许有空值。一般是在建表的时候同时创建主键索引：CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命令。<br />记住：一个表只能有一个主键。</p>
		<p>4.全文索引<br />MySQL从3.23.23版开始支持全文索引和全文检索。这里不作讨论，呵呵~~</p>
		<p>删除索引的语法：DROP INDEX index_name ON tableName</p>
		<p>    三、单列索引和组合索引</p>
		<p>    为了形象地对比两者，再建一个表：<br />CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );</p>
		<p>   在这10000条记录里面7上8下地分布了5条vc_Name="erquan"的记录，只不过city,age,school的组合各不相同。<br />来看这条T-SQL：<br />SELECT i_testID FROM myIndex WHERE vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;</p>
		<p>    首先考虑建单列索引：<br />    在vc_Name列上建立了索引。执行T-SQL时，MYSQL很快将目标锁定在了vc_Name=erquan的5条记录上，取出来放到一中间结果集。在这个结果集里，先排除掉vc_City不等于"郑州"的记录，再排除i_Age不等于25的记录，最后筛选出唯一的符合条件的记录。      虽然在vc_Name上建立了索引，查询时MYSQL不用扫描整张表，效率有所提高，但离我们的要求还有一定的距离。同样的，在vc_City和i_Age分别建立的单列索引的效率相似。</p>
		<p>    为了进一步榨取MySQL的效率，就要考虑建立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里：<br />ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意了，建表时，vc_Name长度为50，这里为什么用10呢？因为一般情况下名字的长度不会超过10，这样会加速索引查询速度，还会减少索引文件的大小，提高INSERT的更新速度。</p>
		<p>    执行T-SQL时，MySQL无须扫描任何记录就到找到唯一的记录！！</p>
		<p>    肯定有人要问了，如果分别在vc_Name,vc_City,i_Age上建立单列索引，让该表有3个单列索引，查询时和上述的组合索引效率一样吧？嘿嘿，大不一样，远远低于我们的组合索引~~虽然此时有了三个索引，但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。</p>
		<p>建立这样的组合索引，其实是相当于分别建立了<br />vc_Name,vc_City,i_Age<br />vc_Name,vc_City<br />vc_Name<br />    这样的三个组合索引！为什么没有vc_City,i_Age等这样的组合索引呢？这是因为mysql组合索引"最左前缀"的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引，下面的几个T-SQL会用到：<br />SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"<br />SELECT * FROM myIndex WHREE vc_Name="erquan"<br />而下面几个则不会用到：<br />SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"<br />SELECT * FROM myIndex WHREE vc_City="郑州"</p>
		<p>    四、使用索引<br />    到此你应该会建立、使用索引了吧？但什么情况下需要建立索引呢？一般来说，在WHERE和JOIN中出现的列需要建立索引，但也不完全如此，因为MySQL只对 &lt;，&lt;=，=，&gt;，&gt;=，BETWEEN，IN，以及某些时候的LIKE(后面有说明)才会使用索引。<br />SELECT t.vc_Name FROM testIndex t LEFT JOIN myIndex m ON t.vc_Name=m.vc_Name WHERE m.i_Age=20 AND m.vc_City='郑州' 时，有对myIndex表的vc_City和i_Age建立索引的需要，由于testIndex表的vc_Name开出现在了JOIN子句中，也有对它建立索引的必要。</p>
		<p>    刚才提到了，只有某些时候的LIKE才需建立索引？是的。因为在以通配符 % 和 _ 开头作查询时，MySQL不会使用索引，如<br />SELECT * FROM myIndex WHERE vc_Name like'erquan%'<br />会使用索引，而<br />SELECT * FROM myIndex WHEREt vc_Name like'%erquan'<br />就不会使用索引了。</p>
		<p>
				<br />    五、索引的不足之处</p>
		<p>    上面说了那么多索引的好话，它真的有像传说中那么优秀么？当然会有缺点了。</p>
		<p>1.虽然索引大大提高了查询速度，同时却会降低更新表的速度，如对表进行INSERT、UPDATE和DELETE。因为更新表时，MySQL不仅要保存数据，还要保存一下索引文件</p>
		<p>2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重，但如果你在一个大表上创建了多种组合索引，索引文件的会膨胀很快。</p>
		<p>
				<br />    篇尾：<br />    讲了这么多，无非是想利用索引提高数据库的执行效率。不过索引只是提高效率的一个因素。如果你的MySQL有大数据的表，就需要花时间研究建立最优秀的索引或优化查询语句。<br /></p>
<img src ="http://www.blogjava.net/fisher/aggbug/92951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-10 16:42 <a href="http://www.blogjava.net/fisher/articles/92951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出SQL系列教程(第八节-SELECT语句中的自连接) </title><link>http://www.blogjava.net/fisher/articles/92925.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Wed, 10 Jan 2007 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/92925.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/92925.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/92925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/92925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/92925.html</trackback:ping><description><![CDATA[ 到目前为止，我们连接的都是两张不同的表，那么能不能对一张表进行自我连接呢？答案是肯定的。<br />有没有必要对一张表进行自我连接呢？答案也是肯定的。 
<p>表的别名：<br />一张表可以自我连接。进行自连接时我们需要一个机制来区分一个表的两个实例。 <br />在FROM clause（子句）中我们可以给这个表取不同的别名， 然后在语句的其它需要使用到该别名的地方<br />用dot（点）来连接该别名和字段名。</p><p>我们在这里同样给出两个表来对自连接进行解释。<br />爱丁堡公交线路，</p><p>车站表：<br />stops(id, name)</p><p>公交线路表：<br />route(num, company, pos, stop)</p><p>关于这两个表更详细的解释可以参考这里：<a href="http://sqlzoo.cn/buses.htm"><font color="#223355">http://sqlzoo.cn/buses.htm</font></a></p><p>一、对公交线路表route进行自连接。</p><p>SELECT * FROM route R1, route R2<br />  WHERE R1.num=R2.num AND R1.company=R2.company</p><p>    我们route表用字段(num, company)来进行自连接． 结果是什么意思呢？<br />你可以知道每条公交线路的任意两个可联通的车站。</p><p>二、用stop字段来对route（公交线路表）进行自连接。</p><p>SELECT * FROM route R1, route R2<br />  WHERE R1.stop=R2.stop;</p><p>查询的结果就是共用同一车站的所有公交线。这个结果对换乘是不是很有意义呢。</p><p>    从这两个例子我们可以看出，自连接的语法结构很简单，但语意结果往往不是<br />那么容易理解。就我们这里所列出的两个表，如果运用得当，能解决很多实际问题，<br />例如，任意两个站点之间如何换乘。</p><p>SELECT R1.company, R1.num<br />  FROM route R1, route R2, stops S1, stops S2<br />  WHERE R1.num=R2.num AND R1.company=R2.company<br />    AND R1.stop=S1.id AND R2.stop=S2.id<br />    AND S1.name='Craiglockhart'<br />    AND S2.name='Tollcross'</p><p>更多关于自连接的练习可以到　<a href="http://sqlzoo.cn/6.htm"><font color="#223355">http://sqlzoo.cn/6.htm</font></a>　进行练习。</p> <br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1377857</p><img src ="http://www.blogjava.net/fisher/aggbug/92925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-10 15:29 <a href="http://www.blogjava.net/fisher/articles/92925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通用SQL数据库查询语句精华使用简介(一) </title><link>http://www.blogjava.net/fisher/articles/92923.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Wed, 10 Jan 2007 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/92923.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/92923.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/92923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/92923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/92923.html</trackback:ping><description><![CDATA[
		<p> 一、 简单查询<br />　　<br />简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。<br />　　<br />例如，下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> nickname,email<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> testtable<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> name</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #ff0000">'</span>
						<span style="COLOR: #ff0000">张三</span>
						<span style="COLOR: #ff0000">'</span>
				</div>
		</div>
		<p>
				<br />(一) 选择列表<br />　　<br />选择列表(select_list)指出所查询列，它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。<br />　　<br />1、选择所有列<br />　　<br />例如，下面语句显示testtable表中所有列的数据：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> testtable</span>
				</div>
		</div>
		<p>
				<br />2、选择部分列并指定它们的显示次序<br />　　<br />查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> nickname,email<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> testtable</span>
				</div>
		</div>
		<p>
				<br />3、更改列标题<br />　　<br />在选择列表中，可重新指定列标题。定义格式为：<br />　　<br />　　列标题=列名<br />　　列名 列标题<br />　　<br />如果指定的列标题不是标准的标识符格式时，应使用引号定界符，例如，下列语句使用汉字显示列标题：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> 昵称</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">nickname,电子邮件</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">email<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> testtable</span>
				</div>
		</div>
		<p>
				<br />4、删除重复行<br />　　<br />SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行，默认为ALL。使用DISTINCT选项时，对于所有重复的数据行在SELECT返回的结果集合中只保留一行。<br />　　<br />5、限制返回的行数<br />　　<br />使用TOP n [PERCENT]选项限制返回的数据行数，TOP n说明返回n行，而TOP n PERCENT时，说明n是表示一百分数，指定返回的行数等于总行数的百分之几。例如：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">TOP</span>
						<span style="COLOR: #000000"> </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">2</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> testtable </span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">TOP</span>
						<span style="COLOR: #000000"> </span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">20</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">PERCENT</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"> testtable</span>
				</div>
		</div>
		<p>
				<br />(二) FROM子句<br />　　<br />FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图，它们之间用逗号分隔。<br />　　<br />在FROM子句同时指定多个表或视图时，如果选择列表中存在同名列，这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列，在查询两个表中的cityid时应使用下面语句格式加以限定：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> username,citytable.cityid<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> usertable,citytable<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> usertable.cityid</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">citytable.cityid</span>
				</div>
		</div>
		<p>
				<br />在FROM子句中可用以下两种格式为表或视图指定别名：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　表名 </span>
						<span style="COLOR: #0000ff">as</span>
						<span style="COLOR: #000000"> 别名<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　表名 别名<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span>
				</div>
		</div>
		<p>
				<br />例如上面语句可用表的别名格式表示为：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> username,b.cityid<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> usertable a,citytable b<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> a.cityid</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">b.cityid</span>
				</div>
		</div>
		<p>
				<br />SELECT不仅能从表或视图中检索数据，它还能够从其它查询语句所返回的结果集合中查询数据。例如：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> a.au_fname</span>
						<span style="COLOR: #808080">+</span>
						<span style="COLOR: #000000">a.au_lname<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> authors a,titleauthor ta<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　(</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> title_id,title<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> titles<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> ytd_sales</span>
						<span style="COLOR: #808080">&gt;</span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">10000</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　) </span>
						<span style="COLOR: #0000ff">AS</span>
						<span style="COLOR: #000000"> t<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> a.au_id</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">ta.au_id<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #808080">AND</span>
						<span style="COLOR: #000000"> ta.title_id</span>
						<span style="COLOR: #808080">=</span>
						<span style="COLOR: #000000">t.title_id</span>
				</div>
		</div>
		<p>
				<br />此例中，将SELECT返回的结果集合给予一别名t，然后再从中检索数据。</p>
		<p>(三) 使用WHERE子句设置查询条件<br />　　<br />WHERE子句设置查询条件，过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> usertable<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">WHERE</span>
						<span style="COLOR: #000000"> age</span>
						<span style="COLOR: #808080">&gt;</span>
						<span style="FONT-WEIGHT: bold; COLOR: #800000">20</span>
				</div>
		</div>
		<p>
				<br />WHERE子句可包括各种条件运算符：<br />　　<br />　　比较运算符(大小比较)：&gt;、&gt;=、=、&lt;、&lt;=、&lt;&gt;、!&gt;、!&lt;<br />　　范围运算符(表达式值是否在指定的范围)：BETWEEN…AND…<br />　　NOT BETWEEN…AND…<br />　　列表运算符(判断表达式是否为列表中的指定项)：IN (项1,项2……)<br />　　NOT IN (项1,项2……)<br />　　模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE<br />　　空值判断符(判断表达式是否为空)：IS NULL、NOT IS NULL<br />　　逻辑运算符(用于多条件的逻辑连接)：NOT、AND、OR<br />　　<br />1、范围运算符例：age BETWEEN 10 AND 30相当于age&gt;=10 AND age&lt;=30<br />　　<br />2、列表运算符例：country IN ('Germany','China')<br />　　<br />3、模式匹配符例：常用于模糊查找，它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。<br />　　<br />可使用以下通配字符：<br />　　<br />　　百分号%：可匹配任意类型和长度的字符，如果是中文，请使用两个百分号即%%。<br />　　<br />　　下划线_：匹配单个任意字符，它常用来限制表达式的字符长度。<br />　　<br />　　方括号[]：指定一个字符、字符串或范围，要求所匹配对象为它们中的任一个。[^]：其取值也[] 相同，但它要求所匹配对象为指定字符以外的任一个字符。<br />　　<br />例如：<br />　　<br />　　限制以Publishing结尾，使用LIKE '%Publishing'<br />　　<br />　　限制以A开头：LIKE '[A]%'<br />　　<br />　　限制以A开头外：LIKE '[^A]%'<br />　　<br />4、空值判断符例WHERE age IS NULL<br />　　<br />5、逻辑运算符：优先级为NOT、AND、OR<br />　　<br />(四)查询结果排序<br />　　<br />使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">ORDER</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">BY</span>
						<span style="COLOR: #000000"> {column_name </span>
						<span style="COLOR: #ff0000">[</span>
						<span style="COLOR: #ff0000">ASC|DESC</span>
						<span style="COLOR: #ff0000">]</span>
						<span style="COLOR: #000000">} </span>
						<span style="COLOR: #ff0000">[</span>
						<span style="COLOR: #ff0000">,…n</span>
						<span style="COLOR: #ff0000">]</span>
				</div>
		</div>
		<p>
				<br />其中ASC表示升序，为默认值，DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排序。例如：</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">　　</span>
						<span style="COLOR: #0000ff">SELECT</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #808080">*</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">FROM</span>
						<span style="COLOR: #000000"> usertable<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span>
						<span style="COLOR: #0000ff">ORDER</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">BY</span>
						<span style="COLOR: #000000"> age </span>
						<span style="COLOR: #0000ff">desc</span>
						<span style="COLOR: #000000">,userid </span>
						<span style="COLOR: #0000ff">ASC</span>
				</div>
		</div>
		<p>
				<br />另外，可以根据表达式进行排序。<br /></p>
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1376237</p>
<img src ="http://www.blogjava.net/fisher/aggbug/92923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-10 15:28 <a href="http://www.blogjava.net/fisher/articles/92923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 深入浅出SQL系列教程(第六节-SELECT语句中的表连接(join)) </title><link>http://www.blogjava.net/fisher/articles/92924.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Wed, 10 Jan 2007 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/92924.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/92924.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/92924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/92924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/92924.html</trackback:ping><description><![CDATA[
		<p>为了从两个或多个表中选出数据，我们一般使用表连接来实现这个功能。</p>
		<p>本节介绍join（连接）的概念. 为此我们准备了两个试验用表： album（专辑表） 和 track（曲目表）. </p>
		<p>专辑表：包含200首来自Amazon的音乐CD的概要信息。<br />album(asin, title, artist, price, release, label, rank)</p>
		<p>曲目表：每张专辑中的曲目（因为是音乐CD，所以也可叫歌曲）的详细信息。<br />track(album, dsk, posn, song) </p>
		<p>    SQL短语 FROM album JOIN track ON album.asin=track.album 表示连接album和track表。<br />其中，album.asin表示专辑的惟一标识号，track.album表示曲目表中和专辑关联的专辑号。<br />连接后，得到一个临时表，该临时表中每条记录包含的字段由两部分组成，<br />除了专辑表中的对应字段album(title, artist ...)，还包含曲目表的所有字段track(album, disk, posn and song)。</p>
		<p>详细的内容见：<a href="http://www.sqlzoo.cn/album.htm"><font color="#223355">http://www.sqlzoo.cn/album.htm</font></a></p>
		<p>有了这张临时表，很多查询就容易实现了。</p>
		<p>看看一些具体的实例，</p>
		<p>一、列出歌名为'Alison'的专辑名称和作者</p>
		<p>SELECT title, artist<br />  FROM album JOIN track<br />         ON (album.asin=track.album)<br /> WHERE song = 'Alison'</p>
		<p>显然，歌名、专辑名称和作者分别在两个表中，必需使用表连接来完成这个查询。</p>
		<p>
				<br />二、哪个artist录制了歌曲'Exodus'</p>
		<p>SELECT artist<br />  FROM album JOIN track ON (asin=album)<br /> WHERE song = 'Exodus'</p>
		<p>    用作连接的两个字段asin，album因为在两个表中都是惟一的，所以不一定要加表名作为前缀。<br />但为了方便理解，建议使用前缀，形如：album.asin=track.album</p>
		<p>三、列出曲目表中所有属于'Blur'专辑的歌曲 </p>
		<p>SELECT song<br />  FROM album JOIN track ON (asin=album)<br /> WHERE title = 'Blur'<br /> <br />如果我们把　album JOIN track ON (asin=album)　看成一个临时表的话，join的概念就很好理解了。</p>
		<p>
				<br />更多在线习题：　<a href="http://www.sqlzoo.cn/3a.htm"><font color="#223355">http://www.sqlzoo.cn/3a.htm</font></a></p> <br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1377849</p><img src ="http://www.blogjava.net/fisher/aggbug/92924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-10 15:28 <a href="http://www.blogjava.net/fisher/articles/92924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> SQL核心语句(非常实用的几个技巧) </title><link>http://www.blogjava.net/fisher/articles/92920.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Wed, 10 Jan 2007 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/92920.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/92920.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/92920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/92920.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/92920.html</trackback:ping><description><![CDATA[
		<div class="postText">_ArticleContent1_lblContent&gt;插入数据 <br /><br />向表中添加一个新记录，你要使用SQL INSERT 语句。这里有一个如何使用这种语句的例子： <br /><br />INSERT mytable (mycolumn) VALUES (‘some data’) <br /><br />这个语句把字符串’some data’插入表mytable的mycolumn字段中。将要被插入数据的字段的名字在第一个括号中指定，实际的数据在第二个括号中给出。 <br /><br />INSERT 语句的完整句法如下： <br /><br />INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES | <br /><br />Values_list | select_statement} <br /><br />如果一个表有多个字段，通过把字段名和字段值用逗号隔开，你可以向所有的字段中插入数据。假设表mytable有三个字段first_column,second_column,和third_column。下面的INSERT语句添加了一条三个字段都有值的完整记录： <br /><br />INSERT mytable (first_column,second_column,third_column) <br /><br />VALUES (‘some data’,’some more data’,’yet more data’) <br /><br />注意 <br /><br />你可以使用INSERT语句向文本型字段中插入数据。但是，如果你需要输入很长的字符串，你应该使用WRITETEXT语句。这部分内容对本书来说太高级了，因此不加讨论。要了解更多的信息，请参考Microsoft SQL Sever 的文档。 <br /><br />如果你在INSERT 语句中只指定两个字段和数据会怎么样呢？换句话说，你向一个表中插入一条新记录，但有一个字段没有提供数据。在这种情况下，有下面的四种可能： <br /><br />如果该字段有一个缺省值，该值会被使用。例如，假设你插入新记录时没有给字段third_column提供数据，而这个字段有一个缺省值’some value’。在这种情况下，当新记录建立时会插入值’some value’。 <br /><br />如果该字段可以接受空值，而且没有缺省值，则会被插入空值。 <br /><br />如果该字段不能接受空值，而且没有缺省值，就会出现错误。你会收到错误信息： <br /><br />The column in table mytable may not be null. <br /><br />最后，如果该字段是一个标识字段，那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时，只要忽略该字段，标识字段会给自己赋一个新值。 <br /><br />注意 <br /><br />向一个有标识字段的表中插入新记录后，你可以用SQL变量@@identity来访问新记录 <br /><br />的标识字段的值。考虑如下的SQL语句： <br /><br />INSERT mytable (first_column) VALUES(‘some value’) <br /><br />INSERT anothertable(another_first,another_second) <br /><br />VALUES(@@identity,’some value’) <br /><br />如果表mytable有一个标识字段，该字段的值会被插入表anothertable的another_first字段。这是因为变量@@identity总是保存最后一次插入标识字段的值。 <br /><br />字段another_first应该与字段first_column有相同的数据类型。但是，字段another_first不能是应该标识字段。Another_first字段用来保存字段first_column的值。 <br /><br />删除记录 <br /><br />要从表中删除一个或多个记录，需要使用SQL DELETE语句。你可以给DELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。例如，下面的这个DELETE语句只删除字段first_column的值等于’Delete Me’的记录： <br /><br />DELETE mytable WHERE first_column=’Deltet Me’ <br /><br />DELETE 语句的完整句法如下： <br /><br />DELETE [FROM] {table_name|view_name} [WHERE clause] <br /><br />在SQL SELECT 语句中可以使用的任何条件都可以在DELECT 语句的WHERE子句 中使用。例如，下面的这个DELETE语句只删除那些first_column字段的值为’goodbye’或second_column字段的值为’so long’的记录： <br /><br />DELETE mytable WHERE first_column=’goodby’ OR second_column=’so long’ <br /><br />如果你不给DELETE 语句提供WHERE 子句，表中的所有记录都将被删除。你不应该有这种想法。如果你想删除应该表中的所有记录，应使用第十章所讲的TRUNCATE TABLE语句。 <br /><br />注意 <br /><br />为什么要用TRUNCATE TABLE 语句代替DELETE语句？当你使用TRUNCATE TABLE语句时，记录的删除是不作记录的。也就是说，这意味着TRUNCATE TABLE 要比DELETE快得多。 <br /><br />更新记录 <br /><br />要修改表中已经存在的一条或多条记录，应使用SQL UPDATE语句。同DELETE语句一样，UPDATE语句可以使用WHERE子句来选择更新特定的记录。请看这个例子： <br /><br />UPDATE mytable SET first_column=’Updated!’ WHERE second_column=’Update Me!’ <br /><br />这个UPDATE 语句更新所有second_column字段的值为’Update Me!’的记录。对所有被选中的记录，字段first_column的值被置为’Updated!’。 <br /><br />下面是UPDATE语句的完整句法： <br /><br />UPDATE {table_name|view_name} SET [{table_name|view_name}] <br /><br />{column_list|variable_list|variable_and_column_list} <br /><br />[,{column_list2|variable_list2|variable_and_column_list2}… <br /><br />[,{column_listN|variable_listN|variable_and_column_listN}]] <br /><br />[WHERE clause] <br /><br />注意 <br /><br />你可以对文本型字段使用UPDATE语句。但是，如果你需要更新很长的字符串，应使用UPDATETEXT语句。这部分内容对本书来说太高级了，因此不加讨论。要了解更多的信息，请参考Microsoft SQL Sever 的文档。 <br /><br />如果你不提供WHERE子句，表中的所有记录都将被更新。有时这是有用的。例如，如果你想把表titles中的所有书的价格加倍，你可以使用如下的UPDATE 语句： <br /><br />你也可以同时更新多个字段。例如，下面的UPDATE语句同时更新first_column,second_column,和third_column这三个字段： <br /><br />UPDATE mytable SET first_column=’Updated!’ <br /><br />Second_column=’Updated!’ <br /><br />Third_column=’Updated!’ <br /><br />WHERE first_column=’Update Me1’ <br /><br />技巧 <br /><br />SQL忽略语句中多余的空格。你可以把SQL语句写成任何你最容易读的格式。 <br /><br />用SELECT 创建记录和表 <br /><br />你也许已经注意到，INSERT 语句与DELETE语句和UPDATE语句有一点不同，它一次只操作一个记录。然而，有一个方法可以使INSERT 语句一次添加多个记录。要作到这一点，你需要把INSERT 语句与SELECT 语句结合起来，象这样： <br /><br />INSERT mytable (first_column,second_column) <br /><br />SELECT another_first,another_second <br /><br />FROM anothertable <br /><br />WHERE another_first=’Copy Me!’ <br /><br />这个语句从anothertable拷贝记录到mytable.只有表anothertable中字段another_first的值为’Copy Me！’的记录才被拷贝。 <br /><br />当为一个表中的记录建立备份时，这种形式的INSERT 语句是非常有用的。在删除一个表中的记录之前，你可以先用这种方法把它们拷贝到另一个表中。 <br /><br />如果你需要拷贝整个表，你可以使用SELECT INTO 语句。例如，下面的语句创建了一个名为newtable的新表，该表包含表mytable的所有数据： <br /><br />SELECT * INTO newtable FROM mytable <br /><br />你也可以指定只有特定的字段被用来创建这个新表。要做到这一点，只需在字段列表中指定你想要拷贝的字段。另外，你可以使用WHERE 子句来限制拷贝到新表中的记录。下面的例子只拷贝字段second_columnd的值等于’Copy Me!’的记录的first_column字段。 <br /><br />SELECT first_column INTO newtable <br /><br />FROM mytable <br /><br />WHERE second_column=’Copy Me!’ <br /><br />使用SQL修改已经建立的表是很困难的。例如，如果你向一个表中添加了一个字段，没有容易的办法来去除它。另外，如果你不小心把一个字段的数据类型给错了，你将没有办法改变它。但是，使用本节中讲述的SQL语句，你可以绕过这两个问题。 <br /><br />例如，假设你想从一个表中删除一个字段。使用SELECT INTO 语句，你可以创建该表的一个拷贝，但不包含要删除的字段。这使你既删除了该字段，又保留了不想删除的数据。 <br /><br />如果你想改变一个字段的数据类型，你可以创建一个包含正确数据类型字段的新表。创建好该表后，你就可以结合使用UPDATE语句和SELECT 语句，把原来表中的所有数据拷贝到新表中。通过这种方法，你既可以修改表的结构，又能保存原有的数据。 <strong><br /></strong></div>
		<div class="postText">
		</div>
		<div class="postText">_ArticleContent1_lblContent&gt;插入数据 <br /><br />向表中添加一个新记录，你要使用SQL INSERT 语句。这里有一个如何使用这种语句的例子： <br /><br />INSERT mytable (mycolumn) VALUES (‘some data’) <br /><br />这个语句把字符串’some data’插入表mytable的mycolumn字段中。将要被插入数据的字段的名字在第一个括号中指定，实际的数据在第二个括号中给出。 <br /><br />INSERT 语句的完整句法如下： <br /><br />INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES | <br /><br />Values_list | select_statement} <br /><br />如果一个表有多个字段，通过把字段名和字段值用逗号隔开，你可以向所有的字段中插入数据。假设表mytable有三个字段first_column,second_column,和third_column。下面的INSERT语句添加了一条三个字段都有值的完整记录： <br /><br />INSERT mytable (first_column,second_column,third_column) <br /><br />VALUES (‘some data’,’some more data’,’yet more data’) <br /><br />注意 <br /><br />你可以使用INSERT语句向文本型字段中插入数据。但是，如果你需要输入很长的字符串，你应该使用WRITETEXT语句。这部分内容对本书来说太高级了，因此不加讨论。要了解更多的信息，请参考Microsoft SQL Sever 的文档。 <br /><br />如果你在INSERT 语句中只指定两个字段和数据会怎么样呢？换句话说，你向一个表中插入一条新记录，但有一个字段没有提供数据。在这种情况下，有下面的四种可能： <br /><br />如果该字段有一个缺省值，该值会被使用。例如，假设你插入新记录时没有给字段third_column提供数据，而这个字段有一个缺省值’some value’。在这种情况下，当新记录建立时会插入值’some value’。 <br /><br />如果该字段可以接受空值，而且没有缺省值，则会被插入空值。 <br /><br />如果该字段不能接受空值，而且没有缺省值，就会出现错误。你会收到错误信息： <br /><br />The column in table mytable may not be null. <br /><br />最后，如果该字段是一个标识字段，那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时，只要忽略该字段，标识字段会给自己赋一个新值。 <br /><br />注意 <br /><br />向一个有标识字段的表中插入新记录后，你可以用SQL变量@@identity来访问新记录 <br /><br />的标识字段的值。考虑如下的SQL语句： <br /><br />INSERT mytable (first_column) VALUES(‘some value’) <br /><br />INSERT anothertable(another_first,another_second) <br /><br />VALUES(@@identity,’some value’) <br /><br />如果表mytable有一个标识字段，该字段的值会被插入表anothertable的another_first字段。这是因为变量@@identity总是保存最后一次插入标识字段的值。 <br /><br />字段another_first应该与字段first_column有相同的数据类型。但是，字段another_first不能是应该标识字段。Another_first字段用来保存字段first_column的值。 <br /><br />删除记录 <br /><br />要从表中删除一个或多个记录，需要使用SQL DELETE语句。你可以给DELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。例如，下面的这个DELETE语句只删除字段first_column的值等于’Delete Me’的记录： <br /><br />DELETE mytable WHERE first_column=’Deltet Me’ <br /><br />DELETE 语句的完整句法如下： <br /><br />DELETE [FROM] {table_name|view_name} [WHERE clause] <br /><br />在SQL SELECT 语句中可以使用的任何条件都可以在DELECT 语句的WHERE子句 中使用。例如，下面的这个DELETE语句只删除那些first_column字段的值为’goodbye’或second_column字段的值为’so long’的记录： <br /><br />DELETE mytable WHERE first_column=’goodby’ OR second_column=’so long’ <br /><br />如果你不给DELETE 语句提供WHERE 子句，表中的所有记录都将被删除。你不应该有这种想法。如果你想删除应该表中的所有记录，应使用第十章所讲的TRUNCATE TABLE语句。 <br /><br />注意 <br /><br />为什么要用TRUNCATE TABLE 语句代替DELETE语句？当你使用TRUNCATE TABLE语句时，记录的删除是不作记录的。也就是说，这意味着TRUNCATE TABLE 要比DELETE快得多。 <br /><br />更新记录 <br /><br />要修改表中已经存在的一条或多条记录，应使用SQL UPDATE语句。同DELETE语句一样，UPDATE语句可以使用WHERE子句来选择更新特定的记录。请看这个例子： <br /><br />UPDATE mytable SET first_column=’Updated!’ WHERE second_column=’Update Me!’ <br /><br />这个UPDATE 语句更新所有second_column字段的值为’Update Me!’的记录。对所有被选中的记录，字段first_column的值被置为’Updated!’。 <br /><br />下面是UPDATE语句的完整句法： <br /><br />UPDATE {table_name|view_name} SET [{table_name|view_name}] <br /><br />{column_list|variable_list|variable_and_column_list} <br /><br />[,{column_list2|variable_list2|variable_and_column_list2}… <br /><br />[,{column_listN|variable_listN|variable_and_column_listN}]] <br /><br />[WHERE clause] <br /><br />注意 <br /><br />你可以对文本型字段使用UPDATE语句。但是，如果你需要更新很长的字符串，应使用UPDATETEXT语句。这部分内容对本书来说太高级了，因此不加讨论。要了解更多的信息，请参考Microsoft SQL Sever 的文档。 <br /><br />如果你不提供WHERE子句，表中的所有记录都将被更新。有时这是有用的。例如，如果你想把表titles中的所有书的价格加倍，你可以使用如下的UPDATE 语句： <br /><br />你也可以同时更新多个字段。例如，下面的UPDATE语句同时更新first_column,second_column,和third_column这三个字段： <br /><br />UPDATE mytable SET first_column=’Updated!’ <br /><br />Second_column=’Updated!’ <br /><br />Third_column=’Updated!’ <br /><br />WHERE first_column=’Update Me1’ <br /><br />技巧 <br /><br />SQL忽略语句中多余的空格。你可以把SQL语句写成任何你最容易读的格式。 <br /><br />用SELECT 创建记录和表 <br /><br />你也许已经注意到，INSERT 语句与DELETE语句和UPDATE语句有一点不同，它一次只操作一个记录。然而，有一个方法可以使INSERT 语句一次添加多个记录。要作到这一点，你需要把INSERT 语句与SELECT 语句结合起来，象这样： <br /><br />INSERT mytable (first_column,second_column) <br /><br />SELECT another_first,another_second <br /><br />FROM anothertable <br /><br />WHERE another_first=’Copy Me!’ <br /><br />这个语句从anothertable拷贝记录到mytable.只有表anothertable中字段another_first的值为’Copy Me！’的记录才被拷贝。 <br /><br />当为一个表中的记录建立备份时，这种形式的INSERT 语句是非常有用的。在删除一个表中的记录之前，你可以先用这种方法把它们拷贝到另一个表中。 <br /><br />如果你需要拷贝整个表，你可以使用SELECT INTO 语句。例如，下面的语句创建了一个名为newtable的新表，该表包含表mytable的所有数据： <br /><br />SELECT * INTO newtable FROM mytable <br /><br />你也可以指定只有特定的字段被用来创建这个新表。要做到这一点，只需在字段列表中指定你想要拷贝的字段。另外，你可以使用WHERE 子句来限制拷贝到新表中的记录。下面的例子只拷贝字段second_columnd的值等于’Copy Me!’的记录的first_column字段。 <br /><br />SELECT first_column INTO newtable <br /><br />FROM mytable <br /><br />WHERE second_column=’Copy Me!’ <br /><br />使用SQL修改已经建立的表是很困难的。例如，如果你向一个表中添加了一个字段，没有容易的办法来去除它。另外，如果你不小心把一个字段的数据类型给错了，你将没有办法改变它。但是，使用本节中讲述的SQL语句，你可以绕过这两个问题。 <br /><br />例如，假设你想从一个表中删除一个字段。使用SELECT INTO 语句，你可以创建该表的一个拷贝，但不包含要删除的字段。这使你既删除了该字段，又保留了不想删除的数据。 <br /><br />如果你想改变一个字段的数据类型，你可以创建一个包含正确数据类型字段的新表。创建好该表后，你就可以结合使用UPDATE语句和SELECT 语句，把原来表中的所有数据拷贝到新表中。通过这种方法，你既可以修改表的结构，又能保存原有的数据。 <strong><br /></strong></div>
<img src ="http://www.blogjava.net/fisher/aggbug/92920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-10 15:26 <a href="http://www.blogjava.net/fisher/articles/92920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通用SQL数据库查询语句精华使用简介(二) </title><link>http://www.blogjava.net/fisher/articles/92921.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Wed, 10 Jan 2007 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/92921.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/92921.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/92921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/92921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/92921.html</trackback:ping><description><![CDATA[二、 联合查询<br />　　<br />UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示，即执行联合查询。UNION的语法格式为：<br /><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">　　select_statement<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">UNION</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">ALL</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000"> selectstatement<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">UNION [ALL</span><span style="COLOR: #ff0000">]</span><span style="COLOR: #000000"> selectstatement]</span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">…n</span><span style="COLOR: #ff0000">]</span></div></div><p><br />其中selectstatement为待联合的SELECT查询语句。<br />　　<br />ALL选项表示将所有行合并到结果集合中。不指定该项时，被联合查询结果集合中的重复行将只保留一行。<br />　　<br />联合查询时，查询结果的列标题为第一个查询语句的列标题。因此，要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时，也必须使用第一查询语句中的列名、列标题或者列序号。<br />　　<br />在使用UNION 运算符时，应保证每个联合查询语句的选择列表中有相同数量的表达式，并且每个查询选择表达式应具有相同的数据类型，或是可以自动将它们转换为相同的数据类型。在自动转换时，对于数值类型，系统将低精度的数据类型转换为高精度的数据类型。<br />　　<br />在包括多个查询的UNION语句中，其执行顺序是自左至右，使用括号可以改变这一执行顺序。例如：<br />　　<br />查询1 UNION (查询2 UNION 查询3)</p><p>三、连接查询<br />　　<br />通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点，也是它区别于其它类型数据库管理系统的一个标志。<br />　　<br />在关系数据库管理系统中，表建立时各数据之间的关系不必确定，常把一个实体的所有信息存放在一个表中。当检索数据时，通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性，他们可以在任何时候增加新的数据类型。为不同实体创建新的表，尔后通过连接进行查询。<br />　　<br />连接可以在SELECT 语句的FROM子句或WHERE子句中建立，似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以，在Transact-SQL中推荐使用这种方法。<br />　　<br />SQL-92标准所定义的FROM子句的连接语法格式为：</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">　　</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> join_table join_type join_table<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #ff0000">[</span><span style="COLOR: #ff0000">ON (join_condition)</span><span style="COLOR: #ff0000">]</span></div></div><p><br />其中join_table指出参与连接操作的表名，连接可以对同一个表操作，也可以对多表操作，对同一个表操作的连接又称做自连接。<br />　　<br />join_type 指出连接类型，可分为三种：内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作，并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同，内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是，外连接不只列出与连接条件相匹配的行，而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。<br />　　<br />交叉连接(CROSS JOIN)没有WHERE 子句，它返回连接表中所有数据行的笛卡尔积，其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。<br />　　<br />连接操作中的ON (join_condition) 子句指出连接条件，它由被连接表中的列和比较运算符、逻辑运算符等构成。<br />　　<br />无论哪种连接都不能对text、ntext和image数据类型列进行直接连接，但可以对这三种列进行间接连接。例如：<br /></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">　　</span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> p1.pub_id,p2.pub_id,p1.pr_info<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> pub_info </span><span style="COLOR: #0000ff">AS</span><span style="COLOR: #000000"> p1 </span><span style="COLOR: #0000ff">INNER</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">JOIN</span><span style="COLOR: #000000"> pub_info </span><span style="COLOR: #0000ff">AS</span><span style="COLOR: #000000"> p2<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">ON</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff00ff">DATALENGTH</span><span style="COLOR: #000000">(p1.pr_info)</span><span style="COLOR: #808080">=</span><span style="COLOR: #ff00ff">DATALENGTH</span><span style="COLOR: #000000">(p2.pr_info)</span></div></div><p><br />(一)内连接<br />　　<br />内连接查询操作列出与连接条件匹配的数据行，它使用比较运算符比较被连接列的列值。内连接分三种：<br />　　<br />1、等值连接：在连接条件中使用等于号(=)运算符比较被连接列的列值，其查询结果中列出被连接表中的所有列，包括其中的重复列。<br />　　<br />2、不等连接： 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括&gt;、&gt;=、&lt;=、&lt;、!&gt;、!&lt;和&lt;&gt;。<br />　　<br />3、自然连接：在连接条件中使用等于(=)运算符比较被连接列的列值，但它使用选择列表指出查询结果集合中所包括的列，并删除连接表中的重复列。<br />　　<br />例，下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社：</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">　　</span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> authors </span><span style="COLOR: #0000ff">AS</span><span style="COLOR: #000000"> a </span><span style="COLOR: #0000ff">INNER</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">JOIN</span><span style="COLOR: #000000"> publishers </span><span style="COLOR: #0000ff">AS</span><span style="COLOR: #000000"> p<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">ON</span><span style="COLOR: #000000"> a.city</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">p.city</span></div></div><p><br />又如使用自然连接，在选择列表中删除authors 和publishers 表中重复列(city和state)：</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">　　</span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> a.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">,p.pub_id,p.pub_name,p.country<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> authors </span><span style="COLOR: #0000ff">AS</span><span style="COLOR: #000000"> a </span><span style="COLOR: #0000ff">INNER</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">JOIN</span><span style="COLOR: #000000"> publishers </span><span style="COLOR: #0000ff">AS</span><span style="COLOR: #000000"> p<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">ON</span><span style="COLOR: #000000"> a.city</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">p.city</span></div></div><p><br />(二)外连接<br />　　<br />内连接时，返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时，它返回到查询结果集合中的不仅包含符合连接条件的行，而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来：</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">　　</span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> a.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">,b.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> luntan </span><span style="COLOR: #ff00ff">LEFT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">JOIN</span><span style="COLOR: #000000"> usertable </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> b<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">ON</span><span style="COLOR: #000000"> a.username</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">b.username</span></div></div><p><br />下面使用全外连接将city表中的所有作者以及user表中的所有作者，以及他们所在的城市：</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">　　</span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> a.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">,b.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> city </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> a </span><span style="COLOR: #0000ff">FULL</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">OUTER</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">JOIN</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff00ff">user</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> b<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">ON</span><span style="COLOR: #000000"> a.username</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">b.username</span></div></div><p><br />(三)交叉连接<br />　　<br />交叉连接不带WHERE 子句，它返回被连接的两个表所有数据行的笛卡尔积，返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例，titles表中有6类图书，而publishers表中有8家出版社，则下列交叉连接检索到的记录数将等于6*8=48行。</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">　　</span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> type,pub_name<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> titles </span><span style="COLOR: #0000ff">CROSS</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">JOIN</span><span style="COLOR: #000000"> publishers<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />　　</span><span style="COLOR: #0000ff">ORDER</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">BY</span><span style="COLOR: #000000"> type<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div></div><p> </p><p><strong><font size="3">相关内容:(来自csdn论坛)<br />关于inner join,full outer join,left join,right jion的具体实现含义</font></strong></p><p>--查询分析器中执行：<br />--建表table1,table2：</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> table1(id </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,name </span><span style="FONT-WEIGHT: bold; COLOR: #000000">varchar</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">))<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> table2(id </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,score </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">)<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> table1 </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">lee</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> table1 </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">zhang</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> table1 </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">wang</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> table2 </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">90</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> table2 </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">2</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> table2 </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="FONT-WEIGHT: bold; COLOR: #800000">3</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">70</span></div></div><p><br />如表<br />-------------------------------------------------<br />table1|table2|<br />-------------------------------------------------<br />idname|idscore|<br />1lee|190|<br />2zhang|2100|<br />4wang|370|<br />-------------------------------------------------</p><p>以下均在查询分析器中执行</p><p>一、外连接<br />1.概念：包括左向外联接、右向外联接或完整外部联接</p><p>2.左连接：left join 或 left outer join<br />(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行，而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行，则在相关联的结果集行中右表的所有选择列表列均为空值(null)。<br />(2)sql语句</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/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"> table1 </span><span style="COLOR: #ff00ff">left</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> table2 </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> table1.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">table2.id</span></div></div><p><br />-------------结果-------------<br />idnameidscore<br />------------------------------<br />1lee190<br />2zhang2100<br />4wangNULLNULL<br />------------------------------<br />注释：包含table1的所有子句，根据指定条件返回table2相应的字段，不符合的以null显示</p><p>3.右连接：right join 或 right outer join<br />(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行，则将为左表返回空值。<br />(2)sql语句</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/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"> table1 </span><span style="COLOR: #ff00ff">right</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> table2 </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> table1.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">table2.id</span></div></div><p><br />-------------结果-------------<br />idnameidscore<br />------------------------------<br />1lee190<br />2zhang2100<br />NULLNULL370<br />------------------------------<br />注释：包含table2的所有子句，根据指定条件返回table1相应的字段，不符合的以null显示</p><p>4.完整外部联接:full join 或 full outer join <br />(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时，则另一个表的选择列表列包含空值。如果表之间有匹配行，则整个结果集行包含基表的数据值。<br />(2)sql语句</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/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"> table1 </span><span style="COLOR: #0000ff">full</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> table2 </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> table1.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">table2.id</span></div></div><p><br />-------------结果-------------<br />idnameidscore<br />------------------------------<br />1lee190<br />2zhang2100<br />4wangNULLNULL<br />NULLNULL370<br />------------------------------<br />注释：返回左右连接的和（见上左、右连接）</p><p>二、内连接<br />1.概念：内联接是用比较运算符比较要联接列的值的联接</p><p>2.内连接：join 或 inner join </p><p>3.sql语句</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/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"> table1 </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> table2 </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> table1.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">table2.id</span></div></div><p><br />-------------结果-------------<br />idnameidscore<br />------------------------------<br />1lee190<br />2zhang2100<br />------------------------------<br />注释：只返回符合条件的table1和table2的列</p><p>4.等价（与下列执行效果相同）</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">A:</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> a.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">,b.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> table1 a,table2 b </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> a.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">b.id<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />B:</span><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"> table1 </span><span style="COLOR: #0000ff">cross</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> table2 </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> table1.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">table2.id</span></div></div><p><br /> (注：cross join后加条件只能用where,不能用on)</p><p>三、交叉连接(完全)</p><p>1.概念：没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。（table1和table2交叉连接产生3*3=9条记录）</p><p>2.交叉连接：cross join (不带条件where...)</p><p>3.sql语句</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/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"> table1 </span><span style="COLOR: #0000ff">cross</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> table2</span></div></div><p><br />-------------结果-------------<br />idnameidscore<br />------------------------------<br />1lee190<br />2zhang190<br />4wang190<br />1lee2100<br />2zhang2100<br />4wang2100<br />1lee370<br />2zhang370<br />4wang370<br />------------------------------<br />注释：返回3*3=9条记录，即笛卡尔积</p><p>4.等价（与下列执行效果相同）</p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">A:</span><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"> table1,table2</span></div></div><p> </p><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1376243</p><img src ="http://www.blogjava.net/fisher/aggbug/92921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-10 15:26 <a href="http://www.blogjava.net/fisher/articles/92921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出SQL系列教程(第七节-SELECT语句中的左连接、右连接和全连接) </title><link>http://www.blogjava.net/fisher/articles/92919.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Wed, 10 Jan 2007 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/92919.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/92919.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/92919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/92919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/92919.html</trackback:ping><description><![CDATA[上节我们介绍了表连接，更确切的说是inner joins內连接． <br />內连接仅选出两张表中互相匹配的记录．因此，这会导致有时我们需要的记录没有包含进来。<br />为更好的理解这个概念，我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表(msp)。
<p>party(Code,Name,Leader)<br />Code: 政党代码<br />Name: 政党名称<br />Leader: 政党领袖</p><p>msp(Name,Party,Constituency)<br />Name: 议员名<br />Party: 议员所在政党代码<br />Constituency: 选区</p><p>在介绍左连接、右连接和全连接前，有一个数据库中重要的概念要介绍一下，即空值(NULL)。</p><p>    有时表中，更确切的说是某些字段值，可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在。<br />空值不等同于字符串中的空格，也不是数字类型的0。因此，判断某个字段值是否为空值时不能使用=,&lt;&gt;这些<br />判断符。必需有专用的短语：IS NULL 来选出有空值字段的记录，同理，可用 IS NOT NULL 选出不包含空值的记录。</p><p>例如：下面的语句选出了没有领导者的政党。（不要奇怪，苏格兰议会中确实存在这样的政党）</p><p>SELECT code, name FROM party<br />  WHERE leader IS NULL</p><p>又如：一个议员被开除出党，看看他是谁。(即该议员的政党为空值)</p><p>SELECT name FROM msp <br />  WHERE party IS NULL</p><p>好了，让我们言归正传，看看什么叫左连接、右连接和全连接。</p><p>A left join（左连接）包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。<br />同理，也存在着相同道理的 right join（右连接），即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。 <br />而full join(全连接)顾名思义，左右表中所有记录都会选出来。</p><p>讲到这里，有人可能要问，到底什么叫：包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。<br />Ok,我们来看一个实例：</p><p>SELECT msp.name, party.name<br />  FROM msp JOIN party ON party=code</p><p>    这个是我们上一节所学的Join(注意：也叫inner join)，这个语句的本意是列出所有议员的名字和他所属政党。<br />你可以在　<a href="http://sqlzoo.cn/4.htm">http://sqlzoo.cn/4.htm</a> 亲自执行一下该语句，看看结果是什么。</p><p>    很遗憾，我们发现该查询的结果少了两个议员：Canavan MSP, Dennis。为什么，因为这两个议员不属于任<br />和政党，即他们的政党字段(Party)为空值。那么为什么不属于任何政党就查不出来了？这是因为空值在<br />作怪。因为议员表中政党字段(Party)的空值在政党表中找不到对应的记录作匹配，即<br />FROM msp JOIN party ON party=code　没有把该记录连接起来，而是过滤出去了。<br />在该短语中，msp在Join的左边，所有称为左表。party在Join的右边，所有称为右表。</p><p>    Ok,现在再看看这句话，“包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录”，<br />意思应该很明白了吧。执行下面这个语句，那两个没有政党的议员就漏不了了。</p><p>SELECT msp.name, party.name<br />  FROM msp LEFT JOIN party ON party=code</p><p>关于右连接,看看这个查询就明白了：</p><p>SELECT msp.name, party.name<br />  FROM msp RIGHT JOIN party ON msp.party=party.code</p><p>这个查询的结果列出所有的议员和政党，包含没有议员的政党，但不包含没有政党的议员。</p><p>那么既要包含没有议员的政党，又要包含没有政党的议员该怎么办呢，对了，全连接(full join)。</p><p>SELECT msp.name, party.name<br />  FROM msp FULL JOIN party ON msp.party=party.code</p><img src ="http://www.blogjava.net/fisher/aggbug/92919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-10 15:23 <a href="http://www.blogjava.net/fisher/articles/92919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 的engine类型</title><link>http://www.blogjava.net/fisher/articles/92870.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Wed, 10 Jan 2007 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/92870.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/92870.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/92870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/92870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/92870.html</trackback:ping><description><![CDATA[最开始用MySQL Administrator建数据库的时候，表缺省是InnoDB类型，也就没有在意。后来用Access2MySQL导数据的时候发现只能导成MyISAM类型的表，不知道这两种类型有什么区别，就去查了查。原来是MyISAM类型不支持事务处理等高级处理，而InnoDB类型支持。MyISAM类型的表强调的是性能，其执行数度比InnoDB类型更快，但是不提供事务支持，而InnoDB提供事务支持已经外部键等高级数据库功能。这样就可以根据数据表不同的用处是用不同的存储类型。 
<p></p><p>另外，MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝到linux系统中使用。</p><p></p><p>从MySQL的官方网站，参考手册中可以了解到在MySQL4.1中所支持的如下类型：</p><div class="entry-more" id="more"><blockquote><a href="http://dev.mysql.com/doc/refman/4.1/en/storage-engines.html"><strong>Storage Engines and Table Types</strong></a> MySQL supports several storage engines that act as handlers for different table types. MySQL storage engines include both those that handle transaction-safe tables and those that handle non-transaction-safe tables: 
<p>The original storage engine was ISAM, which managed non-transactional tables. This engine has been replaced by MyISAM and should no longer be used. It is deprecated in MySQL 4.1, and is removed in subsequent MySQL release series. </p><p>In MySQL 3.23.0, the MyISAM and HEAP storage engines were introduced. MyISAM is an improved replacement for ISAM. The HEAP storage engine provides in-memory tables. The MERGE storage engine was added in MySQL 3.23.25. It allows a collection of identical MyISAM tables to be handled as a single table. All three of these storage engines handle non-transactional tables, and all are included in MySQL by default. Note that the HEAP storage engine has been renamed the MEMORY engine. </p><p>The InnoDB and BDB storage engines that handle transaction-safe tables were introduced in later versions of MySQL 3.23. Both are available in source distributions as of MySQL 3.23.34a. BDB is included in MySQL-Max binary distributions on those operating systems that support it. InnoDB also is included in MySQL-Max binary distributions for MySQL 3.23. Beginning with MySQL 4.0, InnoDB is included by default in all MySQL binary distributions. In source distributions, you can enable or disable either engine by configuring MySQL as you like. </p><p>The EXAMPLE storage engine was added in MySQL 4.1.3. It is a “stub” engine that does nothing. You can create tables with this engine, but no data can be stored in them or retrieved from them. The purpose of this engine is to serve as an example in the MySQL source code that illustrates how to begin writing new storage engines. As such, it is primarily of interest to developers. </p><p>NDB Cluster is the storage engine used by MySQL Cluster to implement tables that are partitioned over many computers. It is available in source code distributions as of MySQL 4.1.2 and binary distributions as of MySQL-Max 4.1.3. </p><p>The ARCHIVE storage engine was added in MySQL 4.1.3. It is used for storing large amounts of data without indexes in a very small footprint. </p><p>The CSV storage engine was added in MySQL 4.1.4. This engine stores data in text files using comma-separated values format. </p><p>The BLACKHOLE storage engine was added in MySQL 4.1.11. This engine accepts but does not store data and retrievals always return an empty set. </p></blockquote><p></p></div><img src ="http://www.blogjava.net/fisher/aggbug/92870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2007-01-10 12:12 <a href="http://www.blogjava.net/fisher/articles/92870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql的数据导出几种方法</title><link>http://www.blogjava.net/fisher/articles/90455.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Thu, 28 Dec 2006 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/90455.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/90455.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/90455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/90455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/90455.html</trackback:ping><description><![CDATA[
		<div class="tit">mysql的数据导出几种方法</div>
		<div class="date"> </div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>从网上找到一些问题是关于如何从MySQL中导出数据，以便用在本地或其它的数据库系统之上；以及 将现有数据导入MySQL数据库中。</p>
												<br />
												<p>数据导出</p>
												<p>　　数据导出主要有以下几种方法：</p>
												<p>　　使用select into outfile "filename"语句<br />　　使用mysqldump实用程序<br />　　使用select into outfile "filename"语句</p>
												<p>　　可以在mysql的命令行下或在php程序中执行它。我下面以在mysql命令行下为例。在php中使用时，将其改成相应的查询进行处理即可。不过在使用这个命令时，要求用户拥有file的权限。如我们有一个库为phptest，其中有一个表为driver。现在要把driver卸成文件。执行命令：</p>
												<p>　　mysql&gt; use phptest;<br />　　Database Changed<br />　　mysql&gt; select * from driver into outfile "a.txt";<br />　　Query OK, 22 rows affected (0.05 sec)</p>
												<p>
														<br />　　上面就可以完成将表driver从数据库中卸到a.txt文件中。注意文件名要加单引号。那么这个文件在哪呢？在mysql目录下有一个data目录，它即是数据库文件所放的地方。每个库在单独占一个子目录，所以phptest的目录为c:\mysql\data\phptest(注意：我的mysql安装在c:\mysql下)。好，现在我们进去，a.txt就是它。打开这个文件，可能是：</p>
												<p>　　1 Mika Hakinnen 1<br />　　2 David Coulthard 1<br />　　3 Michael Schumacher 2<br />　　4 Rubens Barrichello 2<br />　　...<br />可能还有很多记录。每个字段之间是用制表符分开的(\t)。那么我们可以修改输出文件名的目录，以便放在指定的位置。如"a.txt"可以改成"./a.txt"或"/a.txt"。其中"./a.txt"放在c:\mysql\data目录下了，<br />而"/a.txt"文件则放在c:\目录下了。所以select命令认为的当前目录是数据库的存放目录，这里是<br />c:\mysql\data。</p>
												<p>　　使用select命令还可以指定卸出文件时，字段之间的分隔字符，转义字符，包括字符，及记录行分隔字符。列在下面：</p>
												<p>　　FIELDS<br />　　TERMINATED BY "\t"<br />　　[OPTIONALLY] ENCLOSED BY ""<br />　　ESCAPED BY "\\"<br />　　LINES<br />　　TERMINATED BY "\n"</p>
												<p>　　TERMINATED 表示字段分隔</p>
												<p>　　[OPTIONALLY] ENCLOSED 表示字段用什么字符包括起来，如果使用了OPTIONALLY则只有CHAR和VERCHAR被包括ESCAPED 表示当需要转义时用什么作为转义字符LINES TERMINATED 表示每行记录之间用什么分隔</p>
												<p>　　上面列的是缺省值，而且这些项都是可选的，不选则使用缺省值。可以根据需要进行修改。给出一个例子如下：</p>
												<p>　　mysql&gt; select * from driver into outfile "a.txt" fields terminated by "," enclosed by """;<br />　　Query OK, 22 rows affected (0.06 sec)</p>
												<p>　　结果可能如下：</p>
												<p>　　"1","Mika","Hakinnen","1"<br />　　"2","David","Coulthard","1"<br />　　"3","Michael","Schumacher","2"<br />　　"4","Rubens","Barrichello","2"<br />　　...</p>
												<p>　　可以看到每个字段都用","进行了分隔，且每个字段都用"""包括了起来。注意，行记录分隔符可以是一个字符串，请大家自行测试。不过，如果输出文件在指定目录下如果存在的话就会报错，先删除再测试即可。</p>
												<p>　　使用mysqldump实用程序</p>
												<p>　　从上面的select方法可以看出，输出的文件只有数据，而没有表结构。而且，一次只能处理一个表，要处理多个表则不是很容易的。不过可以将select命令写入一个sql 文件（复制文本应该是很容易的吧），然后在命令行下执行即可：mysql 库名<br />先来个最简单的吧：<br /><font color="#ff0000">mysqldump phptest &gt; a.sql</font></p>
												<p>　　可能结果如下： </p>
												<p>　　# MySQL dump 7.1<br />　　#<br />　　# Host: localhost Database: phptest<br />　　#--------------------------------------------------------<br />　　# Server version 3.22.32-shareware-debug<br />　　#<br />　　# Table structure for table "driver"<br />　　#<br />　　CREATE TABLE driver (<br />　　drv_id int(11) DEFAULT "0" NOT NULL auto_increment,<br />　　drv_forename varchar(15) DEFAULT "" NOT NULL,<br />　　drv_surname varchar(25) DEFAULT "" NOT NULL,<br />　　drv_team int(11) DEFAULT "0" NOT NULL,<br />　　PRIMARY KEY (drv_id)<br />　　);<br />　　#<br />　　# Dumping data for table "driver"<br />　　#</p>
												<p>　　INSERT INTO driver VALUES (1,"Mika","Hakinnen",1);<br />　　INSERT INTO driver VALUES (2,"David","Coulthard",1);<br />　　INSERT INTO driver VALUES (3,"Michael","Schumacher",2);<br />　　INSERT INTO driver VALUES (4,"Rubens","Barrichello",2);<br />　　...</p>
												<p>　　如果有多表，则分别列在下面。可以看到这个文件是一个完整的sql文件，如果要将其导入到其它的数据库中可以通过命令行方式，很方便：mysql phptest &lt; a.sql。如果将数据从本地传到服务器上，则可以将这个文件上传，然后在服务器通过命令行方式装入数据。</p>
												<p>　　如果只想卸出建表指令，则命令如下：</p>
												<p>　　mysqldump -d phptest &gt; a.sql</p>
												<p>　　如果只想卸出插入数据的sql命令，而不需要建表命令，则命令如下：</p>
												<p>　　mysqldump -t phptest &gt; a.sql</p>
												<p>　　那么如果我只想要数据，而不想要什么sql命令时，应该如何操作呢？</p>
												<p>　　mysqldump -T./ phptest driver</p>
												<p>　　其中，只有指定了-T参数才可以卸出纯文本文件，表示卸出数据的目录，./表示当前目录，即与<br />mysqldump同一目录。如果不指定driver表，则将卸出整个数据库的数据。每个表会生成两个文件，一个为.sql文件，包含建表执行。另一个为.txt文件，只包含数据，且没有sql指令。</p>
												<p>　　对卸出的数据文件，也可以同select方法一样，指定字段分隔符，包括字符，转义字段，行记录分隔符。参数列在下面：</p>
												<p>　　--fields-terminated-by= 字段分隔符<br />　　--fields-enclosed-by= 字段包括符<br />　　--fields-optionally-enclosed-by= 字段包括符，只用在CHAR和VERCHAR字段上<br />　　--fields-escaped-by= 转义字符<br />　　--lines-terminated-by= 行记录分隔符<br />我想大家应该明白这些参数的意思了吧。一个例子如下：<br />　　mysqldump -T./ --fields-terminated-by=, --fields-enclosed-by=\" phptest driver</p>
												<p>　　输出结果为：<br />　　"1","Mika","Hakinnen","1"<br />　　"2","David","Coulthard","1"<br />　　"3","Michael","Schumacher","2"<br />　　"4","Rubens","Barrichello","2"<br />　　...</p>
												<p>　　请注意字符的使用。</p>
												<p>　　小结</p>
												<p>　　以上为使用select和mysqldump实用程序来卸出文本的方法。select适合利用程序进行处理，而mysqldump则为手工操作，同时提供强大的导出功能，并且可以处理整个库，或库中指定的多表。大家可以根据需求自行决定使用。</p>
												<p>　　同时还有一些方法，如直接数据库文件拷贝也可以，但是移动后的数据库系统与原系统应一致才行。这里就不再提了。</p>
												<p>　　导入</p>
												<p>　　同导出相类似，导入也有两种方法：</p>
												<p>　　使用LOAD DATA INFILE "filename"命令<br />　　使用mysqlimport实用程序<br />　　使用sql文件</p>
												<p>　　由于前两个处理与导出处理相似，只不过是它们的逆操作，故只给出几种命令使用的例子，不再解释了，大家可以自行查阅手册。</p>
												<p>　　使用load命令：<br />　　load data infile "driver.txt" into table driver fields terminated by "," enclosed by """;</p>
												<p>　　使用mysqlimport实用程序：<br />　　mysqlimport --fields-terminated-by=, --fields-enclosed-by=\" phptest driver.txt</p>
												<p>　　对于第三种，则可以使用由mysqldump导出的sql文件，在命令行下执行mysql库名 <br /><br />专自：<a href="http://hi.baidu.com/breezedancer/blog/item/3020c21b4da2d8faae5133e0.html">http://hi.baidu.com/breezedancer/blog/item/3020c21b4da2d8faae5133e0.html</a></p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/fisher/aggbug/90455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2006-12-28 11:51 <a href="http://www.blogjava.net/fisher/articles/90455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Informix-SPL(过程)语法详解</title><link>http://www.blogjava.net/fisher/articles/87698.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Thu, 14 Dec 2006 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/87698.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/87698.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/87698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/87698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/87698.html</trackback:ping><description><![CDATA[Informix数据库用户一般都熟悉的使用SQL语句进行简单的查询和统计，而在Informix-Online的数据库服务器中提供了用结构化查询语言SQL语句和流程控制存储语言SPL创建存储例程，以减少Informix的处理。存储例程是SQL语句和SPL的集合。它们存放在数据库中，SQL语句会被分析.优化,在例程的执行中,高速缓存中会有一执行规划,使后续操作的执行速度很快。而单独的SQL语句只有在执行时才会被优化，并且存储例程可以被不同的开发工具调用（4GL 、ESQL/C、POWERBUILDER.DELPHI），在SELECT语句中也调用过程。例程调试简单，不必重新编译应有软件包。在例程创建时Informix查询处理器会分析它，并产生一执行规划，永久存放于SPROCEDURES.SYSPROBODY.和SYSPROPLAN中,其后例程按此规划执行,由于大部分查询处理已经完成,存储例程可以在瞬间执行完毕。由于存储例程所具有的优越性，它已成为进行Informix数据库核心开发的有力工具，掌握它对Informix的开发人员有积极意义，现将我在实际工作中使用的语法和例子详解于下,疏漏和错误请来信指教。  <br /><br />1.创建和执行例程  <br /><br />  ①.创建例程语法：  <br /><br />      CRAETE PROCEDURE [OWNER.]PROCEDURE_NAME (参数1  参数类型=[DEFAULT], 参数2  参数类型=[DEFAULT],参数n  参数类型=[DEFAULT])  <br /><br />                    RETURNING 值1类型,值2类型,值n类型；  <br /><br />      &lt;......&gt;;语句体；      END RPOCEDURE  <br /><br />例程大小不可超过64K,这包括所有的SQL.SPL.空格.跳格符,例程名最多18个字符,并在数据库中唯一存在,语句间用";"分隔,例程只能在当前数据库中创建,例程创建后是一标准  <br /><br />执行模板块，可在不同的应有中对其调用,这对开发不同版本的应用将更为便利。例：  <br /><br />create procedure "test".upwage()  <br /><br />define rev_rev_item_code varchar(2,0);  <br /><br />define rev_p_rev_date date;  <br /><br />define acc_rec_prem_no decimal(8,2);define rev_p_rev_amt  decimal(10,2);define rev_I_info_branch varchar(6,0);define rev_I_info_appl_no decimal(8,0);define rev_I_info_date date;define rev_o_rev_date date;  <br /><br />define rev_o_rev_amt decimal(10,2);  <br /><br />define acc_ac_rev_amnt decimal(10,2);  <br /><br />define acc_rec_prem_date date;  <br /><br />begin work;  <br /><br />foreach cur_rev for select I_info_appl_branch,I_info_appl_no,I_info_date,  <br /><br />o_rev_date,o_rev_amt into rev_I_info_branch,  <br /><br />rev_I_info_appl_no,rev_I_info_date,rev_o_rev_date,                             rev_o_rev_amt from rev_rec_tbl where  <br /><br />(rev_item_code="PS" ) and p_rev_date is null and  <br /><br />p_rev_amt=0 and (I_info_appl_no is not null or  <br /><br />I_info_date is not null);  <br /><br />select max(rec_prem_acc_no) into acc_rec_prem_no from rec_prem_acc where                                   I_info_appl_branch=rev_I_info_branch  <br /><br />and I_info_appl_no=rev_I_info_appl_no  <br /><br />and I_info_date=rev_I_info_date  <br /><br />and o_rev_date=rev_o_rev_date  <br /><br />and rev_item_code="PS" and  <br /><br />ac_rev_amnt=rev_o_rev_amt;  <br /><br />select date(rec_prem_date) into acc_rec_prem_date  <br /><br />from rec_prem_acc where I_info_appl_branch=rev_I_info_branch  <br /><br />and I_info_appl_no=rev_I_info_appl_no  <br /><br />and I_info_date=rev_I_info_date  <br /><br />and o_rev_date=rev_o_rev_date  <br /><br />and rev_item_code="PS" and  <br /><br />ac_rev_amnt=rev_o_rev_amt and  <br /><br />rec_prem_acc_no=acc_rec_prem_no ;  <br /><br />select ac_rev_amnt into acc_ac_rev_amnt  <br /><br />  from rec_prem_acc  <br /><br /> where I_info_appl_branch=rev_I_info_branch  <br /><br />  and I_info_appl_no=rev_I_info_appl_no  <br /><br />  and I_info_date=rev_I_info_date  <br /><br />  and o_rev_date=rev_o_rev_date  <br /><br />  and rev_item_code="PS"  <br /><br />  and rec_prem_acc_no=acc_rec_prem_no  <br /><br />  and ac_rev_amnt=rev_o_rev_amt;  <br /><br />if acc_ac_rev_amnt is null or acc_rec_prem_date is null then  <br /><br />   continue foreach;  <br /><br />end if;  <br /><br />update rev_rec_tbl  <br /><br />   set p_rev_date=acc_rec_prem_date,  <br /><br />       p_rev_amt =acc_ac_rev_amnt  <br /><br /> where I_info_appl_branch=rev_I_info_branch  <br /><br />   and I_info_date=rev_I_info_date  <br /><br />   and I_info_appl_no=rev_I_info_appl_no  <br /><br />   and o_rev_date=rev_o_rev_date;  <br /><br />end foreach;  <br /><br />commit work;  <br /><br />end procedure;  <br /><br />  ②.执行例程语法：  <br /><br />    A):在dbaccess中  <br /><br />       EXECUTE PROCEDURE DBNAME@SERVER_NAME:例程名(参数1,参数2,.....)用这种方法可对例程进行调试。  <br /><br />    B):在Informix-4GL中  <br /><br />       PREPARE PREP STATTEMENT FROM "EXECUTE PROCEDURE DBNAME@SERVER_NAME:例程名（?,?,?,...）  <br /><br />       DECLARE P_CURS SURSOR FOR PREP STMT  <br /><br />       OPEN P_CURS USING 参数1,参数2,....  <br /><br />       FETCH P_CURS INTO 返回值1，返回值2，...  <br /><br />       CLOSE P_CURS  <br /><br />       当应用程序不支持EXECUT PROCEDURE语法,则需使用PREPARE命令,如INFORMIX-4GL中,而使用INFORMIX-NEWEAR则无此限制,需注意的是PREPARE语句中变量用?号代替,其个数要与例程的参数个数和类型一致,返回值也是一样。  <br /><br />    C):在Informix-ESQL/C中  <br /><br />       EXEC SQL EXECUTE PROCEDURE 例程名(参数1,参数2,...) INTO （返回值1，返回值2,...）在EC5.0或更高版本可使用EXECUTE PROCEDURE 语法,在ESQL/C中宿主变量用于想存储例程传递值,同时也接收返回值.  <br /><br />    D):在POWER BUILDER中  <br /><br />       DECLARE 逻辑名 PROCEDURE FOR 例程名(:参数1,:参数2:...) INTO :返回值1,:返回值2,..USING 事物名  <br /><br />       EXEC 例程名(:参数1,:参数2,.....)  <br /><br />       PB要求为例程制定逻辑名,以后的SQL语句将以逻辑名为准指向后台数据库例程,当例程即便没有参数也必须有小扩号.  <br /><br />2.流程控制语言：  <br /><br />在过程中也提供了其他语言具备的流程控制语言,完成循环判断和分类处理的能力,主要有:①.IF ....ELIF.....ELSE.....END IF例：  <br /><br />CRAETE PROCEDURE STR_COM(STR1 CHAR(20),STR2 CHAR(20))  <br /><br />RETURNING INT;  <br /><br />DEFINE REL INT;  <br /><br />IF STR1&gt;;STR2 THEN  --当STR1&gt;;STR2 REL=1  <br /><br />LET REL=1;  <br /><br />ELIF STR2&gt;;STR1 THEN --当STR2&gt;;STR1 REL=-1  <br /><br />LET REL=-1;  <br /><br />ELSE  <br /><br />LET REL=0;   --当STR1=STR2 REL=0  <br /><br />END IF  <br /><br />RETUEN REL;  <br /><br />END PROCEDURE  <br /><br />当IF的条件为一个SQL语句如SELECT时需用扩号，并且返回值为单值。  <br /><br />②.FOR .....END FOR  <br /><br />例:FOR INDEX IN (20 TO 30 STEP 2,100 TO 200 STEP 10)  <br /><br />   --执行代码  <br /><br />   END FOR  <br /><br />FOR的条件可以是变量，常量或一个SQL语句的返回值  <br /><br />③.WHILE.......END WHILE  <br /><br />当WHILE的条件为TRUE时执行WHILE后的语句,为FALSE退出循环。  <br /><br />例:WHILE I&lt;10  <br /><br />    INSERT INTO TBB_1 VALUES(I);  <br /><br />    LET I=I+1;  <br /><br />    END WHILE;  <br /><br />④.FOREACH........END FOREACH  <br /><br />该语句较为特别FOREACH循环能够声明并打开游标,读取记录行,并关闭游标.其完整语法:  <br /><br /> FOREACH 游标名 [WITH HOLD] SELECT 字段名 INTO 变量 FROM  <br /><br />   TABLE WHERE 条件 ；  <br /><br /> END FOREACH  <br /><br /> FOREACH EXECUTE PROCEDURE 例程名（参数1，参数2，..） INTO  <br /><br />  变量  <br /><br /> END FOREACH  <br /><br />该循环中语句的执行次数与SELECT 和 EXECUTE PROCEDURE语句返回的行数一样多。如果FOREACH语句中包含一条EXECUTE PROCEDURE，则循环停止的条件为：  <br /><br />.执行了不带任何参数的RETURN语句  <br /><br />.执行了END PROCEDURE  <br /><br />如果没有返回行数据,则不再执行循环中的语句。存储例程中不允许使用滚动游标。  <br /><br />当使用WITH HOLD时，更新游标将放置更新锁，使其他过程无法更新该行，直至事物完成，当在FOREACH循环的语句块中的UPDATE或DELETE有  <br /><br />WHERE CURRENT OF短语，则存储例程会自动使用更新游标  <br /><br />例1：BEGIN WORK；  <br /><br />     FOREACH CUR_1 FOR SELECT DATE INTO V_DATE FROM TABLE  <br /><br />     IF V_DATE IS NULL THEN  <br /><br />     DELETE FROM TABLE WHERE CURRENT OF CUR_1;  <br /><br />     END IF;  <br /><br />     END FOREACH;  <br /><br />     COMMIT WORK;  <br /><br />例2：FOREACH EXECUTE PROCEDURE BAR(10,20) INTO I  <br /><br />     INSERT INTO TABLE1 VALUES(I)  <br /><br />     END PROCEDURE  <br /><br />⑤.CONTINUE    适用语句( FOR WHILE FOREACH)   将执行传递给下一次循环⑥.EXIT  <br /><br />   适用语句( FOR WHILE FOREACH)  <br /><br />   从循环中退出  <br /><br />   例：FOR J=1 TO 20  <br /><br />       IF J&gt;;10 THEN  <br /><br />          CONTINUE FOR;  <br /><br />       END IF  <br /><br />       LET I,S=J,0;  <br /><br />         WHILE I&gt;;0  <br /><br />             LET I=I-1;  <br /><br />             IF I=5 THEN  <br /><br />               EXIT FOR;  <br /><br />             END IF  <br /><br />         END WHILE  <br /><br />       END FOR  <br /><br />3.变量的定义与赋值:  <br /><br />   存储例程中使用的变量必须在例程开始处用DEFINE语句定义，变量的数据类型为除SERIAL以外的任意类型，如果定义一个TEXT或BYTE类型的变量，则该变量为指向数据的指针。传递给程序的变量必须在CRAETE PROCEDURE语句中定义。DEFINE也可使用LIKE语句。变量类型缺省为局部变量，也可引用GLOBAL定义全局变量，全局变量在例程间保持它的值，直至会话结束。用户必须为每一个定义的全局变量赋缺省值，缺省值仅在例程第一次引用该全局变量时使用，以后的例程将会忽略其缺省值。  <br /><br />  例：CREATE PROCEDURE SP1（）  <br /><br />        RETURNING INT；  <br /><br />        DEFINE GLOBAL I INT DEFAULT 1；  <br /><br />        LET I=I+1；  <br /><br />        RETURN I；  <br /><br />      END PROCEDURE  <br /><br />      CRAETE PROCEDURE SP2 （）  <br /><br />        RETURNING INT；  <br /><br />        DEFINE GLOBAL I INT DEFAULT 4；  <br /><br />        LET I=I+1；  <br /><br />        RETURN I;  <br /><br />      END PROCEDURE  <br /><br />     当执行顺序为SP1，SP2 返回值3，当执行顺序为SP2，SP1返回值为6。  <br /><br />     例程也可被声名为变量  <br /><br />  例：DEFINE LEN PROCEDURE  <br /><br />      LET X=LEN（A，B，C）  <br /><br />    变量赋值必须用LET关键字，如果不给变量赋值，变量会有一个不确定值，任何对该变量的使用都会产生错误。  <br /><br />      BEGIN......END  <br /><br /> 利用BEGIN....END可以封装语句,它允许用户完成以下功能:  <br /><br />     .定义仅用于该语句块的变量  <br /><br />     .在语句块内以不同方式处理异常情况.  <br /><br />     .在某语句块中定义的变量,在该语句块以及它所包含的语句块都有效,除非又将变量定义一次。  <br /><br />      例 : CREATE PROCEDURE SP （）  <br /><br />           RETURNING INT；  <br /><br />           DEFINE V1 INT；  <br /><br />           LET V1=1；  <br /><br />           BEGIN  <br /><br />             DEFINE V1 INT；  <br /><br />             LET V1=2；  <br /><br />           END  <br /><br />          RETURN V1；  <br /><br />        END PROCEDURE  <br /><br />   返回值为1。  <br /><br />4.在例程中执行其他例程和系统命令:  <br /><br />   应用CALL命令可在例程中调用其他的例程。  <br /><br />   例：CREATE PROCEDURE SP（）      <br /><br />       DEFINE I，J，K，L INT；  <br /><br />         CALL SP1（10，20） RETURNING I，J，K；  <br /><br />       END PROCEDURE  <br /><br />   用SYSTEM可在例程中调用系统命令。 通过SYSTEM命令，用户可以执行操作系统命令。系统命令放在括号内，用双管道号（||），还可以为SYSTEM命令串连起多个表达式。但在存储例程中不能使用该命令的返回值，如果系统调用失败（返回非零值），返回值将和SQL错误代码一起，放在ISAM代码中。  <br /><br />    例：SYSTEM "/usr/exec/exec.sh"  <br /><br />    用RETURN命令可以将例程运行的结果返回给调用它的应用。当需要多次调用同一例程可执行RETURN WITH RESUME命令，它可以保证下一次调用该例程时，所有变量保持原值，而且从RETURN WITH RESUME后的第一条语句执行。  <br /><br />    例：RETURN V_INT WITH RESUME;  <br /><br />5.调试跟踪语句:  <br /><br />   我们在做应用的时候，当程序完成后都需要进行数据测试，以便验证程序逻辑的严密性，在例程中，INFORMIX也提供了调试跟踪语句，其主要有（TRACE，ON EXCEPTION，RAISE EXCEPTION）。TRACE 语句可以跟踪语句块中每一个活动语句的结果和过程，并且可用SET DEBUG FILE TO FILENAME 语法写入指定文件中。  <br /><br />    ON EXECEPTION可在例程中设定断点，向一个DEBUGLOG或ERRLOG文件写入错误信息。完整语法为:  <br /><br />    ON EXCEPTION IN （error_number）  <br /><br />       set sql错误代码变量，isam错误代码变量，错误信息变量  <br /><br />       处理语句  <br /><br />    END EXCEPTION WITH RESUME  <br /><br />    注意SET后的3个变量必须在DEFINE中定义，其中sql错误代码．Isam错误代码变量类型为INT,错误信息变量为足够长的CHAR变量。Error_number是一个SQL错误代码或用RAISE EXCEPTION设置的陷阱代码。WITH RESUME为可选项,当用WITH RESUME语句时,INFORMIX会执行完ON EXCEPTION语句块的命令后会返回到出错命令行的下一行接着执行,或RAISE EXCEPTION的下一行执行。  <br /><br />    RAISE EXCEPTION人为设定SQL错误代码，ISAM错误代码，错误信息。  <br /><br />    RAISE EXCEPTION与ON EXCEPTION语法连用很容易跟踪例程的错误代码  <br /><br /> 例：CREATE PROCEDURE TMP_PROCEDURE()  <br /><br />       DEFINE SQLCODE INT;  <br /><br />       DEFINE ISAMCODE INT;  <br /><br />       DEFINE ERR_TXT CHAR(255);  <br /><br />      ON EXCEPTION SET SQLCODE,ISAMCODE,ERR_TXT  <br /><br />        IF SQLCODE= -284 THEN  <br /><br />           RASIE EXCEPTION SQLCODE,ISAMCODE,"在TMP_PROCEDURE中查询返回多条记录";  <br /><br />        END IF  <br /><br />        IF SQLCODE= -1218 THEN  <br /><br />           RASIE EXCEPTION SQLCODE,ISAMCODE,"在TMP_RPOCEDURE中类型转换错误“；  <br /><br />       END IF  <br /><br />     END EXCEPTION  <br /><br />      SELECT .......  <br /><br />END PROCEDURE  <br /><br />   <br /><br />６.过程实例:  <br /><br />CREATE PROCEDURE YEARS(E_DATE DATE,B_DATE DATE)  <br /><br />RETURNING INT;返回E_DATE与B_DATE之间的整年数(E_DATE大于B_DATE)  <br /><br />    DEFINE V_E  INT;  <br /><br />    DEFINE V_B  INT;  <br /><br />    LET V_E = MONTH(E_DATE);  <br /><br />    LET V_B = MONTH(B_DATE);  <br /><br />    IF V_E &lt; V_B THEN  <br /><br />       LET V_E = YEAR(E_DATE)-YEAR(B_DATE)-1;  <br /><br />       RETURN V_E;  <br /><br />    ELIF V_E &gt;; V_B THEN  <br /><br />       LET V_E = YEAR(E_DATE)-YEAR(B_DATE);  <br /><br />       RETURN V_E;  <br /><br />    END IF;  <br /><br />    LET V_E = DAY(E_DATE);  <br /><br />    LET V_B = DAY(B_DATE);  <br /><br />    IF V_E &lt; V_B THEN  <br /><br />       LET V_E = YEAR(E_DATE)-YEAR(B_DATE)-1;  <br /><br />       RETURN V_E;  <br /><br />    ELSE  <br /><br />       LET V_E = YEAR(E_DATE)-YEAR(B_DATE);  <br /><br />       RETURN V_E;  <br /><br />    END IF;  <br /><br />END PROCEDURE;<br /><img src ="http://www.blogjava.net/fisher/aggbug/87698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2006-12-14 14:27 <a href="http://www.blogjava.net/fisher/articles/87698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>informix常用命令的用法说明</title><link>http://www.blogjava.net/fisher/articles/87081.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Mon, 11 Dec 2006 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/fisher/articles/87081.html</guid><wfw:comment>http://www.blogjava.net/fisher/comments/87081.html</wfw:comment><comments>http://www.blogjava.net/fisher/articles/87081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fisher/comments/commentRss/87081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fisher/services/trackbacks/87081.html</trackback:ping><description><![CDATA[
		<p>语法 oninit  [-s] [-i] [-p] [-y]</p>
		<p> oninit将系统从off-line模式变为on-line模式</p>
		<p>oninit -s  将系统从off-line模式变为quiescent模式</p>
		<p>oninit -i  初始化系统<br /> <br />oninit -p  在共享内存初始化时，不搜索，删除临时表</p>
		<p> oninit -y  对提示自动回答yes<br /> <br /> oninit  -v   加入这个选项显示oninit处理过程</p>
		<p>oninit-- 键入此命令可以获得使用帮助 </p>
		<p> <br /> oninit命令用来改变系统的运行模式。其中-i选项用于初始化系统的root dbspace。注意，root-dbspace一旦被初始化，则等于整个数据库系统被初始化。</p>
		<p>如果用户希望在计算机启动时自动自动启动动态服务器系统，请在系统初启文件（在许多UNIX系统中为/etc/rc）中加入oninit命令（不加任何选项）。</p>
		<p> onmode 命令<br /> <br /> 语法： onmode [-k] [-m] [-s] [-u] [-y]</p>
		<p>onmode -k 执行立即shutdown，将系统变为off-line模式</p>
		<p> onmode -m 将系统从quiescent模式变为on-line模式</p>
		<p>onmode -s 执行graceful shutdown<br /> <br />onmode -u  执行immediate shutdwon</p>
		<p> onmode -y  对提示自动回答yes</p>
		<p>
				<br /> onmode 命令同样用于改变动态服务器的运行模式。除了上述选项外,onmode还有很多与改变系统运行模式无关的选项。<br /> <br />利用onspaces命令创建数据空间</p>
		<p> 语法： onspaces -c [-b] [-d] [-z] [-m] [-o] [-p] [-s] [-t]<br /> <br />-c 创建blobspace或dbspace<br /> <br />-b blobspace blobspace名<br /> <br />-d dbspace dbspace名<br /> <br /> -g page size blobpages大小<br /> <br />-m mirror  镜像设备设的全路径名和偏移量（KB)<br /> <br />-o offset  偏移量（KB)<br /> <br />-p pathname  chunk设备的全路径名<br /> <br /> -s sizedbspace大小（KB)</p>
		<p> -t 创建临时dbspace</p>
		<p>
				<br />onspaces命令用于创建数据空间、临时空间和存储blob数据的空间（blobspace)。键入onspaces--可以获得该命令的联机帮助。利用onstat -D或onstat -d可以看到系统中的关于数据空间的重要信息。包括：chunk的状态、空闲、每一chunk读写的次数。系统中可能包括的多个系统空间，特别当进行数据分片后，我们建议用户最好能利用命令行来创建数据空间。<br /> <br /> 可以利用如下命令创建数据空间：<br /> <br /> onspaces -c -d datadbs1 -o 0 -p /dev/rrvol3 -s 60000</p>
		<p> 可以用如下的方式创建临时数据空间：<br /> <br /> onspaces -c -d tempdbs1 -t -o 0 -p /dev/rrvol5 -s 80000<br /> <br /> 在系统中，临时数据空间非常重要，通常情况下，应将多个临时数据空间分布在独立的物理设备上。<br /> <br /> <br />利用onspaces命令删除数据空间</p>
		<p> 增加或删除chunks</p>
		<p>语法： onspaces -a -d [-m] [-o] [-p]<br /> <br />-a spacename 为dbspace新增chunk<br /> <br /> -m pathname镜像设备的全路径名和偏移量（KB）<br /> <br />-o offset  主设备的偏移量（KB)<br /> <br />-p pathname  chunk设备的全路径名<br /> <br />-s sizechunk大小<br /> <br />-d spacename 删除chunk<br /> <br /> -o offset  chunk设备的偏移量（KB)</p>
		<p>
				<br />onspaces不仅能创建数据空间还能删除数据空间、临时数据空间或存储blob数据的空间。在删除数据空间时，必须首先保证它是无用的，即该数据空间上无数据库或表。<br /> <br /> 如需删除数据空间，请键入如下命令：onspaces -d dbspace_name /blobspace_name</p>
		<p> 数据空间最初由一个chunk（first chunk）构成，一旦其空间用尽，用户必须追加chunk为了提高系统性能，用户在为数据空间分配chunk时需要计算以保证它的大小能适应未来的需要，否则在追加chunk的时候，它与先前的chunk在物理上不一定相邻，导致增加读取数据的时间。关于如何计算空间需求将在以后章节中阐述。利用onspaces命令可以对数据空间增加或者删除chunk,除此之外，利用该命令还可以完成如下任务：启动镜像、中止镜像或改变chunk的状态。</p>
		<p> 例如可以用如下命令为数据空间增加chunk：</p>
		<p>onspaces -a -d datadbs1 -0 60002 -p /dev/rrvol3 -s 60000<br /> <br />再如可以用如下方式从数据空间中删除chunk：<br /> <br /> onspaces -d datadbs1 -o 60002 -p /dev/rrvol3 -s 60000<br /> </p>
		<p> onparams 命令<br /> <br />语法：onparams -a -d -p [-d] [-s] [-l]</p>
		<p>-a 新增逻辑日志<br /> <br /> -d dbspace 指定日志存放的dbspace</p>
		<p> -s size  新增逻辑日志的大小（KB）</p>
		<p> -d 删除逻辑日志</p>
		<p> -l logid 指定删除一个逻辑日志<br /> <br /> -p 改变物理日志<br /> <br />-d dbspace 新物理日志存放的dbspace名</p>
		<p>-s size物理日志大小（KB)</p>
		<p>
				<br /> <br />系统在初始化时自动地在root dbspace中创建逻辑日志和物理日志。在DBMS系统中，尤其在OLTP环境下，数据库的操作非常频繁，日志中必须记录大量的信息，所以用户最好能将多个日志文件分布在不同的设备上。有一种非常简单的方法： 即按所需大小创建逻辑日志，同时创建一个较小的物理日志，系统初始化完毕后，再将物理日志移至其它设备。关于如何确定所需的物理日志的大小，将在以后的章节详述。 利用onstat -l命令可以看出系统中所有新增的逻辑日志被标识为A。这些逻辑日志只有在系统进行归档后才会真正被使用。为了激活这些逻辑日志有一种简单的方法：执行一次“伪”归档。具体步骤如下：将参数TAPEDEV设置为/dev/null然后运行一次ontape -s。也可以执行onbar -F命令。由于伪归档并不真正归档系统信息，所以千万要适时地对系统进行真正的归档操作。<br /> <br />只有在逻辑日志真正无用时才能将其删除。利用onstat -l 可以看出所有的空闲日志被标记为F。如果逻辑日志中包含事务回滚或快速恢复所需的信息，该逻辑日志是不能被删除的。利用onstat -l命令可以看出接受当前事务的日志被标记为C。如果逻辑日志包括最后一个检查点记录，它也是不能被删除的，只有当检查点记录被写入下一个日志忠并且上一个日志被备份后，该日志才能被删除。利用onstat -l命令可以看出包含最后一个检查点记录的日志被标记为L。用户可以利用onmode -c命令强制写检查点记录直至最后一个检查点记录被写入所要求的日志为止。</p>
		<p>onstat 工具<br /> <br /> 显示动态服务器共享内存中的信息 <br />涉及少量磁盘I/O操作 <br />将对系统性能的影响极小 <br /> 提供关于系统有价值得信息 <br />命令行交互式监控系统 <br /> 在本章中将讲解onstat 的各种重要选项，请熟悉它们的使用 <br /> onstat命令是一种非常有用的系统实时监控工具。该命令直接从共享内存的数据结构中读取信息，报告当时的系统状况。通常onstat 命令不会进行磁盘I/O操作，也不会对系统资源加锁，所以它对系统性能的影响减少到最小。简言之，onstat是informix提供的一种交互式的系统监控工具。<br /> <br />onstat 的一些常用选项：<br /> <br />onstat -- 列出所有选项</p>
		<p>onstat -i 设置进入交互模式<br /> <br /> onstat -  显示运行模式和数据库引擎状态<br /> <br /> onstat -g sub_option 运行多线索选项</p>
		<p> onstat -r &lt;value&gt; 每隔&lt;value&gt;秒后重复选项<br /> <br />onstat -g act 显示系统中所有的活动线索<br /> <br /> onstat -g ath -r 2 每隔两秒显示系统中所有的活动的线索<br /> <br /> <br /> 系统监控界面<br /> <br /> sysmaster数据库在系统初始化时自动创建 <br /> 数据库中包括指向系统共享内存结构数据字典信息 <br />提供瞬时的系统性能和状态信息 <br /> 提供SQL界面了解数据字典信息 <br />允许管理员将系统管理工作自动化 <br /> 用于执行重复性的监控任务 <br /> <br /> <br /> </p>
		<p>系统监控界面（system Monitoring Interface --SMI)是一种基于SQL的系统工具，用户通过SMI可以非常方便地获取系统信息。系统在初始化时，自动地在root dbapace创建sysmaster系统数据库。每一系统包括一个sysmaster数据库，该数据库中的大部分表为虚表，是指向共享内存中数据结构的指针。利用SMI可以自动监控系统，特别是在执行重复任务时。<br /> <br />sysmaster数据库是只读的，即不允许对其进行INSERT UPDATE,或DELETE操作。所有用户都拥有对该数据库的查询权限。</p>
		<p> 在系统初始化后，用户一定要注意检查sysmaster数据库是否建立成功。创建sysmaster数据库的信息都保存在消息日志文件中（online.log)请注意由于所有的DDL语句都将被记录在日志中，所以一定要在日志文件中留出足够的空间以保证创建sysmaster所需。<br /> <br />sysmaster数据库模式记录在$INFORMIXDIR/etc/sysmaster.sql文件中。<br /> <br /> oncheck 命令</p>
		<p>检查动态服务器磁盘上的数据结构 <br /> 定位并修补损坏的索引和数据 <br />有磁盘I/O操作 <br /> 一些操作在处理时将在表上加锁 <br />oncheck命令用于修复磁盘上损坏的索引和数据页，该命令也可用于检查并打印系统的数据结构。在使用oncheck时一定要当心，因为改命令的某些选项会对表加共享锁，例如：oncheck -pt</p>
		<p>为防止对系统的损坏，系统会对所有共享内存中的数据进行一次一致性检查。一旦发现数据页出现一致性错误或发现索引错误，系统将把问题和可能的解决方案（利用oncheck)写入消息日志文件，并返回isam错误代码105。</p>
		<p>如果发现一致性错误信息，用户应该立即关闭系统并按消息日志文件中的提示运行oncheck。如果oncheck运行失败，则应尝试卸出表再重新装入；如果是索引得问题，则应先删除索引再重建之。如果所有这些步骤都失败了，只有根据原有的系统归档备份来恢复系统。</p>
		<p>下面的命令可以提供extend信息：</p>
		<p>oncheck -pe<br /> <br />[table=98%][tr][td] 大梦 回复于：2003-05-29 22:37:16 [tr][td]OK！</p>
		<p> [tr][td] 小跑 回复于：2003-05-30 06:07:04 [tr][td]好！！辛苦大大了~~</p>
		<p> [tr][td] lxs212 回复于：2003-05-30 08:37:34 [tr][td]顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</p>
		<p>[tr][td] ifx 回复于：2003-05-30 08:47:04 [tr][td]onstat ? oninit.<br /> <br /> [tr][td] 蓝色键盘 回复于：2003-05-30 09:51:18 [tr][td]onstat -i应该是：<br /> <br />oninit -i  初始化系统 </p>
		<p>
				<br />可能是我整理的文档手误。更正如上。</p>
		<p>[tr][td] ifx 回复于：2003-05-30 10:55:26 [tr][td]"语法 onstat [-s] [-i] [-p] [-y] </p>
		<p> onstat 将系统从off-line模式变为on-line模式 <br /> <br /> onstat -s  将系统从off-line模式变为quiescent模式 <br /> <br /> onstat -i  初始化系统 <br /> <br />onstat -p  在共享内存初始化时，不搜索，删除临时表 <br /> <br /> onstat -y  对提示自动回答yes </p>
		<p>oninit -- 键入此命令可以获得使用帮助 </p>
		<p> <br /> onstat 命令用来改变系统的运行模式。其中-i选项用于初始化系统的root dbspace。注意，root-dbspace一旦被初始化，则等于整个数据库系统被初始化。 </p>
		<p> 如果用户希望在计算机启动时自动自动启动动态服务器系统，请在系统初启文件（在许多UNIX系统中为/etc/rc）中加入onstat命令（不加任何选项）。 <br /> "<br /> 这一段中的所有的onstat均为oninit[/td][/tr][/table]<br /></p>
<img src ="http://www.blogjava.net/fisher/aggbug/87081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fisher/" target="_blank">Fisher</a> 2006-12-11 22:49 <a href="http://www.blogjava.net/fisher/articles/87081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>