??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日韩大陆在线,在线看片免费人成视久网,欧美激情视频一区二区三区免费http://www.aygfsteel.com/fisher/category/17941.html天行健,君子以自Z息。地势坤Q君子以厚d载物?/description>zh-cnWed, 28 Feb 2007 03:43:52 GMTWed, 28 Feb 2007 03:43:52 GMT60MySQL索引l验之浅?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fisher/articles/92951.html</guid><wfw:comment>http://www.aygfsteel.com/fisher/comments/92951.html</wfw:comment><comments>http://www.aygfsteel.com/fisher/articles/92951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fisher/comments/commentRss/92951.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fisher/services/trackbacks/92951.html</trackback:ping><description><![CDATA[ <p>【IT168 服务器学院】在数据库表中,使用索引可以大大提高查询速度。?假如我们创徏?jin)一个testIndex?<br />CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL);</p> <p> (tng) (tng) (tng) 我们随机向里面插入了(jin)1000条记录,其中有一?br />i_testID vc_Name<br />555 erquan</p> <p> (tng) (tng) (tng) 在查找vc_Name="erquan"的记?br />SELECT * FROM testIndex WHERE vc_Name='erquan';<br />Ӟ如果在vc_Name上已l徏立了(jin)索引QMySql无须M扫描Q即准确可找到该记录Q相反,MySql?x)扫描所有记录,卌查询1000ơ啊~~可以索引查询速度提高100倍?/p> <p> (tng) (tng) (tng) 一、烦(ch)引分单列索引和组合烦(ch)?br />单列索引Q即一个烦(ch)引只包含单个列,一个表可以有多个单列烦(ch)引,但这不是l合索引?br />l合索引Q即一个烦(ch)包含多个列?/p> <p> (tng) (tng) (tng) 二、介l一下烦(ch)引的cd</p> <p>1.普通烦(ch)引?br /> (tng) (tng) (tng) q是最基本的烦(ch)引,它没有Q何限制。它有以下几U创建方式:(x)<br />Q?Q创建烦(ch)引:(x)CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHARcdQlength可以于字段实际长度;如果是BLOB ?TEXT cdQ必L定lengthQ下同?br />Q?Q修改表l构QALTER tableName ADD INDEX [indexName] ON (tableColumns(length)) <br />Q?Q创的时候直接指定:(x)CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;</p> <p>2.唯一索引?br /> (tng) (tng) (tng) 它与前面?普通烦(ch)?cMQ不同的是Q烦(ch)引列的值必d一Q但允许有空倹{如果是l合索引Q则列值的l合必须唯一。它有以下几U创建方式:(x)<br />Q?Q创建烦(ch)引:(x)CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))<br />Q?Q修改表l构QALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))<br />Q?Q创的时候直接指定:(x)CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));</p> <p>3.主键索引<br /> (tng) (tng) (tng) 它是一U特D的唯一索引Q不允许有空倹{一般是在徏表的时候同时创Z键烦(ch)引:(x)CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命o(h)?br />CQ一个表只能有一个主键?/p> <p>4.全文索引<br />MySQL?.23.23版开始支持全文烦(ch)引和全文(g)索。这里不作讨论,呵呵~~</p> <p>删除索引的语法:(x)DROP INDEX index_name ON tableName</p> <p> (tng) (tng) (tng) 三、单列烦(ch)引和l合索引</p> <p> (tng) (tng) (tng) Z(jin)形象地对比两者,再徏一个表Q?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> (tng) (tng) 在这10000条记录里??下地分布?条vc_Name="erquan"的记录,只不qcity,age,school的组合各不相同?br />来看q条T-SQLQ?br />SELECT i_testID FROM myIndex WHERE vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;</p> <p> (tng) (tng) (tng) 首先考虑建单列烦(ch)引:(x)<br /> (tng) (tng) (tng) 在vc_Name列上建立?jin)?ch)引。执行T-SQLӞMYSQL很快目标锁定在?jin)vc_Name=erquan?条记录上Q取出来攑ֈ一中间l果集。在q个l果集里Q先排除掉vc_City不等?郑州"的记录,再排除i_Age不等?5的记录,最后筛选出唯一的符合条件的记录。?tng) (tng) (tng) (tng)?虽然在vc_Name上徏立了(jin)索引Q查询时MYSQL不用扫描整张表,效率有所提高Q但L们的要求q有一定的距离。同L(fng)Q在vc_City和i_Age分别建立的单列烦(ch)引的效率怼?/p> <p> (tng) (tng) (tng) Z(jin)q一步榨取MySQL的效率,p考虑建立l合索引。就是将vc_Name,vc_City,i_Age建到一个烦(ch)引里Q?br />ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意?jin),Ӟvc_Name长度?0Q这里ؓ(f)什么用10呢?因ؓ(f)一般情况下名字的长度不?x)超q?0Q这样会(x)加速烦(ch)引查询速度Q还?sh)(x)减?ch)引文件的大小Q提高I(y)NSERT的更新速度?/p> <p> (tng) (tng) (tng) 执行T-SQLӞMySQL无须扫描M记录到扑ֈ唯一的记录!Q?/p> <p> (tng) (tng) (tng) 肯定有h要问?jin),如果分别在vc_Name,vc_City,i_Age上徏立单列烦(ch)引,让该表有3个单列烦(ch)引,查询时和上述的组合烦(ch)引效率一样吧Q嘿嘿,大不一Pq远低于我们的组合烦(ch)引~~虽然此时有了(jin)三个索引Q但MySQL只能用到其中的那个它认ؓ(f)g是最有效率的单列索引?/p> <p>建立q样的组合烦(ch)引,其实是相当于分别建立?br />vc_Name,vc_City,i_Age<br />vc_Name,vc_City<br />vc_Name<br /> (tng) (tng) (tng) q样的三个组合烦(ch)引!Z么没有vc_City,i_Age{这L(fng)l合索引呢?q是因ؓ(f)mysqll合索引"最左前~"的结果。简单的理解是只从最左面的开始组合。ƈ不是只要包含q三列的查询都会(x)用到该组合烦(ch)引,下面的几个T-SQL?x)用刎ͼ?x)<br />SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"<br />SELECT * FROM myIndex WHREE vc_Name="erquan"<br />而下面几个则不会(x)用到Q?br />SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"<br />SELECT * FROM myIndex WHREE vc_City="郑州"</p> <p> (tng) (tng) (tng) 四、用烦(ch)?br /> (tng) (tng) (tng) 到此你应该会(x)建立、用烦(ch)引了(jin)吧?但什么情况下需要徏立烦(ch)引呢Q一般来_(d)在WHERE和JOIN中出现的列需要徏立烦(ch)引,但也不完全如此,因ؓ(f)MySQL只对 <Q?lt;=Q?Q?gt;Q?gt;=QBETWEENQINQ以?qing)某些时候的LIKE(后面有说?才会(x)使用索引?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开出现在了(jin)JOIN子句中,也有对它建立索引的必要?/p> <p> (tng) (tng) (tng) 刚才提到?jin),只有某些时候的LIKE才需建立索引Q是的。因为在以通配W?% ?_ 开头作查询ӞMySQL不会(x)使用索引Q如<br />SELECT * FROM myIndex WHERE vc_Name like'erquan%'<br />?x)用?ch)引,?br />SELECT * FROM myIndex WHEREt vc_Name like'%erquan'<br />׃?x)用?ch)引了(jin)?/p> <p> <br /> (tng) (tng) (tng) 五、烦(ch)引的不之处</p> <p> (tng) (tng) (tng) 上面说了(jin)那么多烦(ch)引的好话Q它真的有像传说中那么优U么?当然?x)有~点?jin)?/p> <p>1.虽然索引大大提高?sh)(jin)查询速度Q同时却?x)降低更新表的速度Q如对表q行INSERT、UPDATE和DELETE。因为更新表ӞMySQL不仅要保存数据,q要保存?sh)下烦(ch)引文?/p> <p>2.建立索引?x)占用磁盘空间的索引文g。一般情况这个问题(sh)太严重,但如果你在一个大表上创徏?jin)多U组合烦(ch)引,索引文g的会(x)膨胀很快?/p> <p> <br /> (tng) (tng) (tng) 尾Q?br /> (tng) (tng) (tng) 讲了(jin)q么多,无非是想利用索引提高数据库的执行效率。不q烦(ch)引只是提高效率的一个因素。如果你的MySQL有大数据的表Q就需要花旉研究建立最优秀的烦(ch)引或优化查询语句?br /></p> <img src ="http://www.aygfsteel.com/fisher/aggbug/92951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fisher/" target="_blank">Fisher</a> 2007-01-10 16:42 <a href="http://www.aygfsteel.com/fisher/articles/92951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入出SQLpd教程(W八?SELECT语句中的自连? http://www.aygfsteel.com/fisher/articles/92925.htmlFisherFisherWed, 10 Jan 2007 07:29:00 GMThttp://www.aygfsteel.com/fisher/articles/92925.htmlhttp://www.aygfsteel.com/fisher/comments/92925.htmlhttp://www.aygfsteel.com/fisher/articles/92925.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/92925.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/92925.html有没有必要对一张表q行自我q接呢?{案也是肯定的?

表的别名Q?br />一张表可以自我q接。进行自q接时我们需要一个机制来区分一个表的两个实例?
在FROM clauseQ子句)(j)中我们可以给q个表取不同的别名, 然后在语句的其它需要用到该别名的地方
用dotQ点Q来q接该别名和字段名?/p>

我们在这里同L(fng)Z个表来对自连接进行解释?br />׃堡公交线路,

车站表:(x)
stops(id, name)

公交U\表:(x)
route(num, company, pos, stop)

关于q两个表更详l的解释可以参考这里:(x)http://sqlzoo.cn/buses.htm

一、对公交U\表routeq行自连接?/p>

SELECT * FROM route R1, route R2
 (tng) WHERE R1.num=R2.num AND R1.company=R2.company

 (tng) (tng) (tng) 我们route表用字段(num, company)来进行自q接Q?l果是什么意思呢Q?br />你可以知道每条公交线路的L两个可联通的车站?/p>

二、用stop字段来对routeQ公交线路表Q进行自q接?/p>

SELECT * FROM route R1, route R2
 (tng) WHERE R1.stop=R2.stop;

查询的结果就是共用同一车站的所有公交线。这个结果对换乘是不是很有意义呢?/p>

 (tng) (tng) (tng) 从这两个例子我们可以看出Q自q接的语法结构很单,但语意结果往(xin)往(xin)不是
那么Ҏ(gu)理解。就我们q里所列出的两个表Q如果运用得当,能解军_多实际问题,
例如QQ意两个站点之间如何换乘?/p>

SELECT R1.company, R1.num
 (tng) FROM route R1, route R2, stops S1, stops S2
 (tng) WHERE R1.num=R2.num AND R1.company=R2.company
 (tng) (tng) (tng) AND R1.stop=S1.id AND R2.stop=S2.id
 (tng) (tng) (tng) AND S1.name='Craiglockhart'
 (tng) (tng) (tng) AND S2.name='Tollcross'

更多关于自连接的l习(fn)可以到 http://sqlzoo.cn/6.htm q行l习(fn)?/p> (tng)

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1377857



Fisher 2007-01-10 15:29 发表评论
]]>
通用SQL数据库查询语句精华用简?一) http://www.aygfsteel.com/fisher/articles/92923.htmlFisherFisherWed, 10 Jan 2007 07:28:00 GMThttp://www.aygfsteel.com/fisher/articles/92923.htmlhttp://www.aygfsteel.com/fisher/comments/92923.htmlhttp://www.aygfsteel.com/fisher/articles/92923.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/92923.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/92923.html (tng)一?单查?br />  
单的Transact-SQL查询只包括选择列表、FROM子句和W(xu)HERE子句。它们分别说明所查询列、查询的表或视图、以?qing)搜索条件等?br />  
例如Q下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段?/p>
   SELECT  (tng)nickname,email
  
FROM  (tng)testtable
  
WHERE  (tng)name = ' 张三 '


(一) 选择列表
  
选择列表(select_list)指出所查询列,它可以是一l列名列表、星受表辑ּ、变?包括局部变量和全局变量){构成?br />  
1、选择所有列
  
例如Q下面语句显Ctesttable表中所有列的数据:(x)

   SELECT  (tng) *
  
FROM  (tng)testtable


2、选择部分列ƈ指定它们的显C次?br />  
查询l果集合中数据的排列序与选择列表中所指定的列名排列顺序相同。例如:(x)

   SELECT  (tng)nickname,email
  
FROM  (tng)testtable


3、更改列标题
  
在选择列表中,可重新指定列标题。定义格式ؓ(f)Q?br />  
  列标?列名
  列名 列标?br />  
如果指定的列标题?sh)是标准的标识符格式Ӟ应用引号定界符Q例如,下列语句使用汉字昄列标题:(x)

   SELECT  (tng)늧 = nickname,?sh)子邮g = email
  
FROM  (tng)testtable


4、删除重复行
  
SELECT语句中用ALL或DISTINCT选项来显C中符合条件的所有行或删除其中重复的数据行,默认为ALL。用DISTINCT选项Ӟ对于所有重复的数据行在SELECTq回的结果集合中只保留一行?br />  
5、限制返回的行数
  
使用TOP n [PERCENT]选项限制q回的数据行敎ͼTOP n说明q回n行,而TOP n PERCENTӞ说明n是表CZ癑ֈ敎ͼ指定q回的行数等于总行数的癑ֈ之几。例如:(x)

SELECT  (tng) TOP  (tng) 2  (tng) * FROM  (tng)testtable (tng) SELECT  (tng) TOP  (tng) 20  (tng) PERCENT  (tng) *  (tng) FROM  (tng)testtable


(? FROM子句
  
FROM子句指定SELECT语句查询?qing)与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔?br />  
在FROM子句同时指定多个表或视图Ӟ如果选择列表中存在同名列Q这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定Q?/p>

   SELECT  (tng)username,citytable.cityid
  
FROM  (tng)usertable,citytable
  
WHERE  (tng)usertable.cityid = citytable.cityid


在FROM子句中可用以下两U格式ؓ(f)表或视图指定别名Q?/p>

  表名 (tng) as  (tng)别名
  表名 (tng)别名


例如上面语句可用表的别名格式表示为:(x)

   SELECT  (tng)username,b.cityid
  
FROM  (tng)usertable (tng)a,citytable (tng)b
  
WHERE  (tng)a.cityid = b.cityid


SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所q回的结果集合中查询数据。例如:(x)

   SELECT  (tng)a.au_fname + a.au_lname
  
FROM  (tng)authors (tng)a,titleauthor (tng)ta
  (
SELECT  (tng)title_id,title
  
FROM  (tng)titles
  
WHERE  (tng)ytd_sales > 10000
  ) (tng)
AS  (tng)t
  
WHERE  (tng)a.au_id = ta.au_id
  
AND  (tng)ta.title_id = t.title_id


此例中,SELECTq回的结果集合给予一别名tQ然后再从中(g)索数据?/p>

(? 使用WHERE子句讄查询条g
  
WHERE子句讄查询条gQ过滤掉不需要的数据行。例如下面语句查询年龄大?0的数据:(x)

   SELECT  (tng) *
  
FROM  (tng)usertable
  
WHERE  (tng)age > 20


WHERE子句可包括各U条件运符Q?br />  
  比较q算W?大小比较)Q?gt;?gt;=??lt;?lt;=?lt;>?>?<
  范围q算W?表达式值是否在指定的范?QBETWEEN…AND?br />  NOT BETWEEN…AND?br />  列表q算W?判断表达式是否ؓ(f)列表中的指定?QIN (?,?…?
  NOT IN (?,?…?
  模式匚wW?判断值是否与指定的字W通配格式相符):LIKE、NOT LIKE
  I值判断符(判断表达式是否ؓ(f)I?QIS NULL、NOT IS NULL
  逻辑q算W?用于多条件的逻辑q接)QNOT、AND、OR
  
1、范围运符例:(x)age BETWEEN 10 AND 30相当于age>=10 AND age<=30
  
2、列表运符例:(x)country IN ('Germany','China')
  
3、模式匹配符例:(x)常用于模p查找,它判断列值是否与指定的字W串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime{类型查询?br />  
可用以下通配字符Q?br />  
  癑ֈ?Q可匚wLcd和长度的字符Q如果是中文Q请使用两个癑ֈ号即%%?br />  
  下划U_Q匹配单个Q意字W,它常用来限制表达式的字符长度?br />  
  Ҏ(gu)号[]Q指定一个字W、字W串或范_(d)要求所匚w对象为它们中的Q一个。[^]Q其取g[] 相同Q但它要求所匚w对象为指定字W以外的M个字W?br />  
例如Q?br />  
  限制以Publishingl尾Q用LIKE '%Publishing'
  
  限制以A开_(d)(x)LIKE '[A]%'
  
  限制以A开头外QLIKE '[^A]%'
  
4、空值判断符例WHERE age IS NULL
  
5、逻辑q算W:(x)优先Uؓ(f)NOT、AND、OR
  
(?查询l果排序
  
使用ORDER BY子句Ҏ(gu)询返回的l果按一列或多列排序。ORDER BY子句的语法格式ؓ(f)Q?/p>

ORDER  (tng) BY  (tng){column_name (tng) [ ASC|DESC ] } (tng) [ ,…n ]


其中ASC表示升序Qؓ(f)默认|DESC为降序。ORDER BY不能按ntext、text和image数据cdq行排序。例如:(x)

   SELECT  (tng) *
  
FROM  (tng)usertable
  
ORDER  (tng) BY  (tng)age (tng) desc ,userid (tng) ASC


另外Q可以根据表辑ּq行排序?br />



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1376237



Fisher 2007-01-10 15:28 发表评论
]]>
深入出SQLpd教程(W六?SELECT语句中的表连?join)) http://www.aygfsteel.com/fisher/articles/92924.htmlFisherFisherWed, 10 Jan 2007 07:28:00 GMThttp://www.aygfsteel.com/fisher/articles/92924.htmlhttp://www.aygfsteel.com/fisher/comments/92924.htmlhttp://www.aygfsteel.com/fisher/articles/92924.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/92924.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/92924.htmlZ(jin)从两个或多个表中选出数据Q我们一般用表q接来实现这个功能?/p>

本节介绍joinQ连接)(j)的概? 为此我们准备?jin)两个试验用表?x) albumQ专辑表Q??trackQ曲目表Q?

专辑表:(x)包含200首来自Amazon的音乐CD的概要信息?br />album(asin, title, artist, price, release, label, rank)

曲目表:(x)每张专辑中的曲目Q因为是音乐CDQ所以也可叫歌曲Q的详细信息?br />track(album, dsk, posn, song)

 (tng) (tng) (tng) SQL短语 FROM album JOIN track ON album.asin=track.album 表示q接album和track表?br />其中Qalbum.asin表示专辑的惟一标识Ptrack.album表示曲目表中和专辑关联的专辑受?br />q接后,得到一个(f)时表Q该临时表中每条记录包含的字D는两部分组成,
除了(jin)专辑表中的对应字Dalbum(title, artist ...)Q还包含曲目表的所有字Dtrack(album, disk, posn and song)?/p>

详细的内容见Q?a >http://www.sqlzoo.cn/album.htm

有了(jin)q张临时表,很多查询容易实C(jin)?/p>

看看一些具体的实例Q?/p>

一、列出歌名ؓ(f)'Alison'的专辑名U和作?/p>

SELECT title, artist
 (tng) FROM album JOIN track
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ON (album.asin=track.album)
 (tng)WHERE song = 'Alison'

昄Q歌名、专辑名U和作者分别在两个表中Q必需使用表连接来完成q个查询?/p>


二、哪个artist录制?jin)歌?Exodus'

SELECT artist
 (tng) FROM album JOIN track ON (asin=album)
 (tng)WHERE song = 'Exodus'

 (tng) (tng) (tng) 用作q接的两个字DasinQalbum因ؓ(f)在两个表中都是惟一的,所以不一定要加表名作为前~?br />但ؓ(f)?jin)方便理解,使用前缀QŞ如:(x)album.asin=track.album

三、列出曲目表中所有属?Blur'专辑的歌?

SELECT song
 (tng) FROM album JOIN track ON (asin=album)
 (tng)WHERE title = 'Blur'
 (tng)
如果我们把 album JOIN track ON (asin=album) 看成一个(f)时表的话Qjoin的概念就很好理解?jin)?/p>


更多在线?fn)题Q http://www.sqlzoo.cn/3a.htm

 (tng)

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1377849



Fisher 2007-01-10 15:28 发表评论
]]>
SQL核心(j)语句(非常实用的几个技? http://www.aygfsteel.com/fisher/articles/92920.htmlFisherFisherWed, 10 Jan 2007 07:26:00 GMThttp://www.aygfsteel.com/fisher/articles/92920.htmlhttp://www.aygfsteel.com/fisher/comments/92920.htmlhttp://www.aygfsteel.com/fisher/articles/92920.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/92920.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/92920.html_ArticleContent1_lblContent>插入数据

向表中添加一个新记录Q你要用SQL INSERT 语句。这里有一个如何用这U语句的例子Q?

INSERT mytable (mycolumn) VALUES (‘some data?

q个语句把字W串’some data’插入表mytable的mycolumn字段中。将要被插入数据的字D늚名字在第一个括号中指定Q实际的数据在第二个括号中给出?

INSERT 语句的完整句法如下:(x)

INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |

Values_list | select_statement}

如果一个表有多个字D,通过把字D名和字D值用逗号隔开Q你可以向所有的字段中插入数据。假设表mytable有三个字Dfirst_column,second_column,和third_column。下面的INSERT语句d?jin)一条三个字D都有值的完整记录Q?

INSERT mytable (first_column,second_column,third_column)

VALUES (‘some data?’some more data?’yet more data?

注意

你可以用INSERT语句向文本型字段中插入数据。但是,如果你需要输入很长的字符Ԍ你应该用WRITETEXT语句。这部分内容Ҏ(gu)书来说太高?jin),因此不加讨论。要?jin)解更多的信息,请参考Microsoft SQL Sever 的文档?

如果你在INSERT 语句中只指定两个字段和数据会(x)怎么样呢Q换句话_(d)你向一个表中插入一条新记录Q但有一个字D|有提供数据。在q种情况下,有下面的四种可能Q?

如果该字D|一个缺省|该g(x)被用。例如,假设你插入新记录时没有给字段third_column提供数据Q而这个字D|一个缺省值’some value’。在q种情况下,当新记录建立时会(x)插入值’some value’?

如果该字D可以接受空|而且没有~省|则会(x)被插入空倹{?

如果该字D不能接受空|而且没有~省|׃(x)出现错误。你?x)收到错误信息?x)

The column in table mytable may not be null.

最后,如果该字D|一个标识字D,那么它会(x)自动产生一个新倹{当你向一个有标识字段的表中插入新记录Ӟ只要忽略该字D,标识字段?x)给自己赋一个新倹{?

注意

向一个有标识字段的表中插入新记录后,你可以用SQL变量@@identity来访问新记录

的标识字D늚倹{考虑如下的SQL语句Q?

INSERT mytable (first_column) VALUES(‘some value?

INSERT anothertable(another_first,another_second)

VALUES(@@identity,’some value?

如果表mytable有一个标识字D,该字D늚g(x)被插入表anothertable的another_first字段。这是因为变量@@identityL保存最后一ơ插入标识字D늚倹{?

字段another_first应该与字Dfirst_column有相同的数据cd。但是,字段another_first不能是应该标识字Dc(din)Another_first字段用来保存字段first_column的倹{?

删除记录

要从表中删除一个或多个记录Q需要用SQL DELETE语句。你可以lDELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。例如,下面的这个DELETE语句只删除字Dfirst_column的值等于’Delete Me’的记录Q?

DELETE mytable WHERE first_column=’Deltet Me?

DELETE 语句的完整句法如下:(x)

DELETE [FROM] {table_name|view_name} [WHERE clause]

在SQL SELECT 语句中可以用的M条g都可以在DELECT 语句的WHERE子句 中用。例如,下面的这个DELETE语句只删除那些first_column字段的gؓ(f)’goodbye’或second_column字段的gؓ(f)’so long’的记录Q?

DELETE mytable WHERE first_column=’goodby?OR second_column=’so long?

如果你不lDELETE 语句提供WHERE 子句Q表中的所有记录都被删除。你不应该有q种x(chng)。如果你惛_除应该表中的所有记录,应用第十章所讲的TRUNCATE TABLE语句?

注意

Z么要用TRUNCATE TABLE 语句代替DELETE语句Q当你用TRUNCATE TABLE语句Ӟ记录的删除是不作记录的。也是_(d)q意味着TRUNCATE TABLE 要比DELETE快得多?

更新记录

要修改表中已l存在的一条或多条记录Q应使用SQL UPDATE语句。同DELETE语句一PUPDATE语句可以使用WHERE子句来选择更新特定的记录。请看这个例子:(x)

UPDATE mytable SET first_column=’Updated!?WHERE second_column=’Update Me!?

q个UPDATE 语句更新所有second_column字段的gؓ(f)’Update Me!’的记录。对所有被选中的记录,字段first_column的D|ؓ(f)’Updated!’?

下面是UPDATE语句的完整句法:(x)

UPDATE {table_name|view_name} SET [{table_name|view_name}]

{column_list|variable_list|variable_and_column_list}

[,{column_list2|variable_list2|variable_and_column_list2}?

[,{column_listN|variable_listN|variable_and_column_listN}]]

[WHERE clause]

注意

你可以对文本型字D用UPDATE语句。但是,如果你需要更新很长的字符Ԍ应用UPDATETEXT语句。这部分内容Ҏ(gu)书来说太高?jin),因此不加讨论。要?jin)解更多的信息,请参考Microsoft SQL Sever 的文档?

如果你不提供WHERE子句Q表中的所有记录都被更新。有时这是有用的。例如,如果你想把表titles中的所有书的h(hun)格加倍,你可以用如下的UPDATE 语句Q?

你也可以同时更新多个字段。例如,下面的UPDATE语句同时更新first_column,second_column,和third_columnq三个字D:(x)

UPDATE mytable SET first_column=’Updated!?

Second_column=’Updated!?

Third_column=’Updated!?

WHERE first_column=’Update Me1?

技?

SQL忽略语句中多余的I格。你可以把SQL语句写成M你最Ҏ(gu)ȝ格式?

用SELECT 创徏记录和表

你也许已l注意到QINSERT 语句与DELETE语句和UPDATE语句有一点不同,它一ơ只操作一个记录。然而,有一个方法可以INSERT 语句一ơ添加多个记录。要作到q一点,你需要把INSERT 语句与SELECT 语句l合hQ象q样Q?

INSERT mytable (first_column,second_column)

SELECT another_first,another_second

FROM anothertable

WHERE another_first=’C(j)opy Me!?

q个语句从anothertable拯记录到mytable.只有表anothertable中字Danother_first的gؓ(f)’C(j)opy MeQ’的记录才被拯?

当ؓ(f)一个表中的记录建立备䆾Ӟq种形式的INSERT 语句是非常有用的。在删除一个表中的记录之前Q你可以先用q种Ҏ(gu)把它们拷贝到另一个表中?

如果你需要拷贝整个表Q你可以使用SELECT INTO 语句。例如,下面的语句创Z(jin)一个名为newtable的新表,该表包含表mytable的所有数据:(x)

SELECT * INTO newtable FROM mytable

你也可以指定只有特定的字D被用来创徏q个新表。要做到q一点,只需在字D列表中指定你想要拷贝的字段。另外,你可以用WHERE 子句来限制拷贝到新表中的记录。下面的例子只拷贝字Dsecond_columnd的值等于’C(j)opy Me!’的记录的first_column字段?

SELECT first_column INTO newtable

FROM mytable

WHERE second_column=’C(j)opy Me!?

使用SQL修改已经建立的表是很困难的。例如,如果你向一个表中添加了(jin)一个字D,没有Ҏ(gu)的办法来去除它。另外,如果你不心(j)把一个字D늚数据cdl错?jin),你将没有办法改变它。但是,使用本节中讲q的SQL语句Q你可以l过q两个问题?

例如Q假设你想从一个表中删除一个字Dc(din)用SELECT INTO 语句Q你可以创徏该表的一个拷贝,但不包含要删除的字段。这使你既删除了(jin)该字D,又保留了(jin)不想删除的数据?

如果你想改变?sh)个字D늚数据cdQ你可以创徏一个包含正数据类型字D늚新表。创建好该表后,你就可以l合使用UPDATE语句和SELECT 语句Q把原来表中的所有数据拷贝到新表中。通过q种Ҏ(gu)Q你既可以修改表的结构,又能保存原有的数据?
_ArticleContent1_lblContent>插入数据

向表中添加一个新记录Q你要用SQL INSERT 语句。这里有一个如何用这U语句的例子Q?

INSERT mytable (mycolumn) VALUES (‘some data?

q个语句把字W串’some data’插入表mytable的mycolumn字段中。将要被插入数据的字D늚名字在第一个括号中指定Q实际的数据在第二个括号中给出?

INSERT 语句的完整句法如下:(x)

INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |

Values_list | select_statement}

如果一个表有多个字D,通过把字D名和字D值用逗号隔开Q你可以向所有的字段中插入数据。假设表mytable有三个字Dfirst_column,second_column,和third_column。下面的INSERT语句d?jin)一条三个字D都有值的完整记录Q?

INSERT mytable (first_column,second_column,third_column)

VALUES (‘some data?’some more data?’yet more data?

注意

你可以用INSERT语句向文本型字段中插入数据。但是,如果你需要输入很长的字符Ԍ你应该用WRITETEXT语句。这部分内容Ҏ(gu)书来说太高?jin),因此不加讨论。要?jin)解更多的信息,请参考Microsoft SQL Sever 的文档?

如果你在INSERT 语句中只指定两个字段和数据会(x)怎么样呢Q换句话_(d)你向一个表中插入一条新记录Q但有一个字D|有提供数据。在q种情况下,有下面的四种可能Q?

如果该字D|一个缺省|该g(x)被用。例如,假设你插入新记录时没有给字段third_column提供数据Q而这个字D|一个缺省值’some value’。在q种情况下,当新记录建立时会(x)插入值’some value’?

如果该字D可以接受空|而且没有~省|则会(x)被插入空倹{?

如果该字D不能接受空|而且没有~省|׃(x)出现错误。你?x)收到错误信息?x)

The column in table mytable may not be null.

最后,如果该字D|一个标识字D,那么它会(x)自动产生一个新倹{当你向一个有标识字段的表中插入新记录Ӟ只要忽略该字D,标识字段?x)给自己赋一个新倹{?

注意

向一个有标识字段的表中插入新记录后,你可以用SQL变量@@identity来访问新记录

的标识字D늚倹{考虑如下的SQL语句Q?

INSERT mytable (first_column) VALUES(‘some value?

INSERT anothertable(another_first,another_second)

VALUES(@@identity,’some value?

如果表mytable有一个标识字D,该字D늚g(x)被插入表anothertable的another_first字段。这是因为变量@@identityL保存最后一ơ插入标识字D늚倹{?

字段another_first应该与字Dfirst_column有相同的数据cd。但是,字段another_first不能是应该标识字Dc(din)Another_first字段用来保存字段first_column的倹{?

删除记录

要从表中删除一个或多个记录Q需要用SQL DELETE语句。你可以lDELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。例如,下面的这个DELETE语句只删除字Dfirst_column的值等于’Delete Me’的记录Q?

DELETE mytable WHERE first_column=’Deltet Me?

DELETE 语句的完整句法如下:(x)

DELETE [FROM] {table_name|view_name} [WHERE clause]

在SQL SELECT 语句中可以用的M条g都可以在DELECT 语句的WHERE子句 中用。例如,下面的这个DELETE语句只删除那些first_column字段的gؓ(f)’goodbye’或second_column字段的gؓ(f)’so long’的记录Q?

DELETE mytable WHERE first_column=’goodby?OR second_column=’so long?

如果你不lDELETE 语句提供WHERE 子句Q表中的所有记录都被删除。你不应该有q种x(chng)。如果你惛_除应该表中的所有记录,应用第十章所讲的TRUNCATE TABLE语句?

注意

Z么要用TRUNCATE TABLE 语句代替DELETE语句Q当你用TRUNCATE TABLE语句Ӟ记录的删除是不作记录的。也是_(d)q意味着TRUNCATE TABLE 要比DELETE快得多?

更新记录

要修改表中已l存在的一条或多条记录Q应使用SQL UPDATE语句。同DELETE语句一PUPDATE语句可以使用WHERE子句来选择更新特定的记录。请看这个例子:(x)

UPDATE mytable SET first_column=’Updated!?WHERE second_column=’Update Me!?

q个UPDATE 语句更新所有second_column字段的gؓ(f)’Update Me!’的记录。对所有被选中的记录,字段first_column的D|ؓ(f)’Updated!’?

下面是UPDATE语句的完整句法:(x)

UPDATE {table_name|view_name} SET [{table_name|view_name}]

{column_list|variable_list|variable_and_column_list}

[,{column_list2|variable_list2|variable_and_column_list2}?

[,{column_listN|variable_listN|variable_and_column_listN}]]

[WHERE clause]

注意

你可以对文本型字D用UPDATE语句。但是,如果你需要更新很长的字符Ԍ应用UPDATETEXT语句。这部分内容Ҏ(gu)书来说太高?jin),因此不加讨论。要?jin)解更多的信息,请参考Microsoft SQL Sever 的文档?

如果你不提供WHERE子句Q表中的所有记录都被更新。有时这是有用的。例如,如果你想把表titles中的所有书的h(hun)格加倍,你可以用如下的UPDATE 语句Q?

你也可以同时更新多个字段。例如,下面的UPDATE语句同时更新first_column,second_column,和third_columnq三个字D:(x)

UPDATE mytable SET first_column=’Updated!?

Second_column=’Updated!?

Third_column=’Updated!?

WHERE first_column=’Update Me1?

技?

SQL忽略语句中多余的I格。你可以把SQL语句写成M你最Ҏ(gu)ȝ格式?

用SELECT 创徏记录和表

你也许已l注意到QINSERT 语句与DELETE语句和UPDATE语句有一点不同,它一ơ只操作一个记录。然而,有一个方法可以INSERT 语句一ơ添加多个记录。要作到q一点,你需要把INSERT 语句与SELECT 语句l合hQ象q样Q?

INSERT mytable (first_column,second_column)

SELECT another_first,another_second

FROM anothertable

WHERE another_first=’C(j)opy Me!?

q个语句从anothertable拯记录到mytable.只有表anothertable中字Danother_first的gؓ(f)’C(j)opy MeQ’的记录才被拯?

当ؓ(f)一个表中的记录建立备䆾Ӟq种形式的INSERT 语句是非常有用的。在删除一个表中的记录之前Q你可以先用q种Ҏ(gu)把它们拷贝到另一个表中?

如果你需要拷贝整个表Q你可以使用SELECT INTO 语句。例如,下面的语句创Z(jin)一个名为newtable的新表,该表包含表mytable的所有数据:(x)

SELECT * INTO newtable FROM mytable

你也可以指定只有特定的字D被用来创徏q个新表。要做到q一点,只需在字D列表中指定你想要拷贝的字段。另外,你可以用WHERE 子句来限制拷贝到新表中的记录。下面的例子只拷贝字Dsecond_columnd的值等于’C(j)opy Me!’的记录的first_column字段?

SELECT first_column INTO newtable

FROM mytable

WHERE second_column=’C(j)opy Me!?

使用SQL修改已经建立的表是很困难的。例如,如果你向一个表中添加了(jin)一个字D,没有Ҏ(gu)的办法来去除它。另外,如果你不心(j)把一个字D늚数据cdl错?jin),你将没有办法改变它。但是,使用本节中讲q的SQL语句Q你可以l过q两个问题?

例如Q假设你想从一个表中删除一个字Dc(din)用SELECT INTO 语句Q你可以创徏该表的一个拷贝,但不包含要删除的字段。这使你既删除了(jin)该字D,又保留了(jin)不想删除的数据?

如果你想改变?sh)个字D늚数据cdQ你可以创徏一个包含正数据类型字D늚新表。创建好该表后,你就可以l合使用UPDATE语句和SELECT 语句Q把原来表中的所有数据拷贝到新表中。通过q种Ҏ(gu)Q你既可以修改表的结构,又能保存原有的数据?


Fisher 2007-01-10 15:26 发表评论
]]>
通用SQL数据库查询语句精华用简?? http://www.aygfsteel.com/fisher/articles/92921.htmlFisherFisherWed, 10 Jan 2007 07:26:00 GMThttp://www.aygfsteel.com/fisher/articles/92921.htmlhttp://www.aygfsteel.com/fisher/comments/92921.htmlhttp://www.aygfsteel.com/fisher/articles/92921.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/92921.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/92921.html  
UNIONq算W可以将两个或两个以上上SELECT语句的查询结果集合合q成一个结果集合显C,x(chng)行联合查询。UNION的语法格式ؓ(f)Q?br />
  select_statement
  
UNION (tng)[ALL] (tng)selectstatement
  
[UNION (tng)[ALL] (tng)selectstatement][…n]


其中selectstatement为待联合的SELECT查询语句?br />  
ALL选项表示所有行合ƈ到结果集合中。不指定该项Ӟ被联合查询结果集合中的重复行只保留一行?br />  
联合查询Ӟ查询l果的列标题?sh)第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时Q也必须使用W一查询语句中的列名、列标题或者列序号?br />  
在用UNION q算W时Q应保证每个联合查询语句的选择列表中有相同数量的表辑ּQƈ且每个查询选择表达式应h相同的数据类型,或是可以自动它们{换ؓ(f)相同的数据类型。在自动转换Ӟ对于数值类型,pȝ低_ֺ的数据类型{换ؓ(f)高精度的数据cd?br />  
在包括多个查询的UNION语句中,其执行顺序是自左臛_Q用括号可以改变这一执行序。例如:(x)
  
查询1 UNION (查询2 UNION 查询3)

三、连接查?br />  
通过q接q算W可以实现多个表查询。连接是关系数据库模型的主要特点Q也是它区别于其它类型数据库理pȝ的一个标志?br />  
在关pL据库理pȝ中,表徏立时各数据之间的关系不必定Q常把一个实体的所有信息存攑֜一个表中。当(g)索数据时Q通过q接操作查询出存攑֜多个表中的不同实体的信息。连接操作给用户带来很大的灵zL,他们可以在Q何时候增加新的数据类型。ؓ(f)不同实体创徏新的表,?dng)后通过q接q行查询?br />  
q接可以在SELECT 语句的FROM子句或WHERE子句中徏立,似是而非在FROM子句中指?gu)接时有助于将q接操作与WHERE子句中的搜烦(ch)条g区分开来。所以,在Transact-SQL中推荐用这U方法?br />  
SQL-92标准所定义的FROM子句的连接语法格式ؓ(f)Q?/p>

  FROM (tng)join_table (tng)join_type (tng)join_table
  
[ON (tng)(join_condition)]


其中join_table指出参与q接操作的表名,q接可以对同一个表操作Q也可以对多表操作,对同一个表操作的连接又U做自连接?br />  
join_type 指出q接cdQ可分ؓ(f)三种Q内q接、外q接和交叉连接。内q接(INNER JOIN)使用比较q算W进行表间某(?列数据的比较操作Qƈ列出q些表中与连接条件相匚w的数据行。根据所使用的比较方式不同,内连接又分ؓ(f){D接、自然连接和不等q接三种。外q接分ؓ(f)左外q接(LEFT OUTER JOIN或LEFT JOIN)、右外连?RIGHT OUTER JOIN或RIGHT JOIN)和全外连?FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列Zq接条g相匹配的行,而是列出左表(左外q接?、右?叛_q接?或两个表(全外q接?中所有符合搜索条件的数据行?br />  
交叉q接(CROSS JOIN)没有WHERE 子句Q它q回q接表中所有数据行的笛卡尔U,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘(sh)W二个表中符合查询条件的数据行数?br />  
q接操作中的ON (join_condition) 子句指出q接条gQ它pq接表中的列和比较运符、逻辑q算W等构成?br />  
无论哪种q接都不能对text、ntext和image数据cd列进行直接连接,但可以对q三U列q行间接q接。例如:(x)

  SELECT (tng)p1.pub_id,p2.pub_id,p1.pr_info
  
FROM (tng)pub_info (tng)AS (tng)p1 (tng)INNER (tng)JOIN (tng)pub_info (tng)AS (tng)p2
  
ON (tng)DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)


(一)内连?br />  
内连接查询操作列Zq接条g匚w的数据行Q它使用比较q算W比较被q接列的列倹{内q接分三U:(x)
  
1、等D接:(x)在连接条件中使用{于?=)q算W比较被q接列的列|其查询结果中列出被连接表中的所有列Q包括其中的重复列?br />  
2、不{连接:(x) 在连接条件用除{于q算W以外的其它比较q算W比较被q接的列的列倹{这些运符包括>?gt;=?lt;=?lt;?>?<?lt;>?br />  
3、自然连接:(x)在连接条件中使用{于(=)q算W比较被q接列的列|但它使用选择列表指出查询l果集合中所包括的列Qƈ删除q接表中的重复列?br />  
例,下面使用{D接列出authors和publishers表中位于同一城市(jng)的作者和出版C:(x)

  SELECT (tng)*
  
FROM (tng)authors (tng)AS (tng)a (tng)INNER (tng)JOIN (tng)publishers (tng)AS (tng)p
  
ON (tng)a.city=p.city


又如使用自然q接Q在选择列表中删除authors 和publishers 表中重复?city和state)Q?/p>

  SELECT (tng)a.*,p.pub_id,p.pub_name,p.country
  
FROM (tng)authors (tng)AS (tng)a (tng)INNER (tng)JOIN (tng)publishers (tng)AS (tng)p
  
ON (tng)a.city=p.city


(?外连?br />  
内连接时Q返回查询结果集合中的仅是符合查询条? WHERE 搜烦(ch)条g?HAVING 条g)和连接条件的行。而采用外q接Ӟ它返回到查询l果集合中的不仅包含W合q接条g的行Q而且q包括左?左外q接?、右?叛_q接?或两个边接表(全外q接)中的所有数据行。如下面使用左外q接论坛内容和作者信息连接v来:(x)

  SELECT (tng)a.*,b.* (tng)FROM (tng)luntan (tng)LEFT (tng)JOIN (tng)usertable (tng)as (tng)b
  
ON (tng)a.username=b.username


下面使用全外q接city表中的所有作者以?qing)user表中的所有作者,以及(qing)他们所在的城市(jng)Q?/p>

  SELECT (tng)a.*,b.*
  
FROM (tng)city (tng)as (tng)a (tng)FULL (tng)OUTER (tng)JOIN (tng)user (tng)as (tng)b
  
ON (tng)a.username=b.username


(?交叉q接
  
交叉q接不带WHERE 子句Q它q回被连接的两个表所有数据行的笛卡尔U,q回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘(sh)W二个表中符合查询条件的数据行数。例Qtitles表中?cd书,而publishers表中?家出版社Q则下列交叉q接(g)索到的记录数等?*8=48行?/p>

  SELECT (tng)type,pub_name
  
FROM (tng)titles (tng)CROSS (tng)JOIN (tng)publishers
  
ORDER (tng)BY (tng)type

 (tng)

相关内容:(来自csdn论坛)
关于inner join,full outer join,left join,right jion的具体实现含?/font>

--查询分析器中执行Q?br />--table1,table2Q?/p>

create (tng)table (tng)table1(id (tng)int,name (tng)varchar(10))
create (tng)table (tng)table2(id (tng)int,score (tng)int)
insert (tng)into (tng)table1 (tng)select (tng)1,'lee'
insert (tng)into (tng)table1 (tng)select (tng)2,'zhang'
insert (tng)into (tng)table1 (tng)select (tng)4,'wang'
insert (tng)into (tng)table2 (tng)select (tng)1,90
insert (tng)into (tng)table2 (tng)select (tng)2,100
insert (tng)into (tng)table2 (tng)select (tng)3,70


如表
-------------------------------------------------
table1|table2|
-------------------------------------------------
idname|idscore|
1lee|190|
2zhang|2100|
4wang|370|
-------------------------------------------------

以下均在查询分析器中执行

一、外q接
1.概念Q包括左向外联接、右向外联接或完整外部联?/p>

2.左连接:(x)left join ?left outer join
(1)左向外联接的l果集包?LEFT OUTER 子句中指定的左表的所有行Q而不仅仅是联接列所匚w的行。如果左表的某行在右表中没有匚w行,则在相关联的l果集行中右表的所有选择列表列均为空?null)?br />(2)sql语句

select (tng)* (tng)from (tng)table1 (tng)left (tng)join (tng)table2 (tng)on (tng)table1.id=table2.id


-------------l果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
------------------------------
注释Q包含table1的所有子句,Ҏ(gu)指定条gq回table2相应的字D,不符合的以null昄

3.双接:(x)right join ?right outer join
(1)叛_外联接是左向外联接的反向联接。将q回双的所有行。如果右表的某行在左表中没有匚w行,则将为左表返回空倹{?br />(2)sql语句

select (tng)* (tng)from (tng)table1 (tng)right (tng)join (tng)table2 (tng)on (tng)table1.id=table2.id


-------------l果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
------------------------------
注释Q包含table2的所有子句,Ҏ(gu)指定条gq回table1相应的字D,不符合的以null昄

4.完整外部联接:full join ?full outer join
(1)完整外部联接q回左表和右表中的所有行。当某行在另一个表中没有匹配行Ӟ则另一个表的选择列表列包含空倹{如果表之间有匹配行Q则整个l果集行包含的数据倹{?br />(2)sql语句

select (tng)* (tng)from (tng)table1 (tng)full (tng)join (tng)table2 (tng)on (tng)table1.id=table2.id


-------------l果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
------------------------------
注释Q返回左双接的和(见上左、右q接Q?/p>

二、内q接
1.概念Q内联接是用比较q算W比较要联接列的值的联接

2.内连接:(x)join ?inner join

3.sql语句

select (tng)* (tng)from (tng)table1 (tng)join (tng)table2 (tng)on (tng)table1.id=table2.id


-------------l果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
------------------------------
注释Q只q回W合条g的table1和table2的列

4.{h(hun)Q与下列执行效果相同Q?/p>

A:select (tng)a.*,b.* (tng)from (tng)table1 (tng)a,table2 (tng)b (tng)where (tng)a.id=b.id
B:
select (tng)* (tng)from (tng)table1 (tng)cross (tng)join (tng)table2 (tng)where (tng)table1.id=table2.id


 (tng)(注:(x)cross join后加条g只能用where,不能用on)

三、交叉连?完全)

1.概念Q没?WHERE 子句的交叉联接将产生联接所涉及(qing)的表的笛卡尔U。第一个表的行C?sh)第二个表的行数{于W卡?dng)积l果集的大小。(table1和table2交叉q接产生3*3=9条记录)(j)

2.交叉q接Qcross join (不带条gwhere...)

3.sql语句

select (tng)* (tng)from (tng)table1 (tng)cross (tng)join (tng)table2


-------------l果-------------
idnameidscore
------------------------------
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
------------------------------
注释Q返?*3=9条记录,即笛卡尔U?/p>

4.{h(hun)Q与下列执行效果相同Q?/p>

A:select (tng)* (tng)from (tng)table1,table2

 (tng)



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1376243



Fisher 2007-01-10 15:26 发表评论
]]>
深入出SQLpd教程(W七?SELECT语句中的左连接、右q接和全q接) http://www.aygfsteel.com/fisher/articles/92919.htmlFisherFisherWed, 10 Jan 2007 07:23:00 GMThttp://www.aygfsteel.com/fisher/articles/92919.htmlhttp://www.aygfsteel.com/fisher/comments/92919.htmlhttp://www.aygfsteel.com/fisher/articles/92919.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/92919.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/92919.html內连接仅选出两张表中互相匚w的记录.因此Q这?x)导致有时我们需要的记录没有包含q来?br />为更好的理解q个概念Q我们介l两个表作演C。苏格兰议会(x)中的政党?party)和议员表(msp)?

party(Code,Name,Leader)
Code: 政党代码
Name: 政党名称
Leader: 政党领袖

msp(Name,Party,Constituency)
Name: 议员?br />Party: 议员所在政党代?br />Constituency: 选区

在介l左q接、右q接和全q接前,有一个数据库中重要的概念要介l一下,即空?NULL)?/p>

 (tng) (tng) (tng) 有时表中Q更切的说是某些字D|可能?x)出现空? q是因ؓ(f)q个数据不知道是什么值或Ҏ(gu)׃存在?br />Ig{同于字W串中的I格Q也不是数字cd?。因此,判断某个字段值是否ؓ(f)I值时不能使用=,<>q些
判断W。必需有专用的短语QIS NULL 来选出有空值字D늚记录Q同理,可用 IS NOT NULL 选出不包含空值的记录?/p>

例如Q下面的语句选出?jin)没有领D的政党。(不要奇怪,苏格兰议?x)中实存在q样的政党)(j)

SELECT code, name FROM party
 (tng) WHERE leader IS NULL

又如Q一个议员被开除出党,看看他是谁?卌议员的政党ؓ(f)I?

SELECT name FROM msp
 (tng) WHERE party IS NULL

好了(jin)Q让我们a归正传,看看什么叫左连接、右q接和全q接?/p>

A left joinQ左q接Q包含所有的左边表中的记录甚x(chng)双表中没有和它匚w的记录?br />同理Q也存在着相同道理?right joinQ右q接Q,卛_含所有的双表中的记录甚x(chng)左边表中没有和它匚w的记录?
而full join(全连?֐思义Q左双中所有记录都?x)选出来?/p>

讲到q里Q有人可能要问,到底什么叫Q包含所有的左边表中的记录甚x(chng)双表中没有和它匚w的记录?br />Ok,我们来看一个实例:(x)

SELECT msp.name, party.name
 (tng) FROM msp JOIN party ON party=code

 (tng) (tng) (tng) q个是我们上一节所学的Join(注意Q也叫inner join)Q这个语句的本意是列出所有议员的名字和他所属政党?br />你可以在 http://sqlzoo.cn/4.htm 亲自执行一下该语句Q看看结果是什么?/p>

 (tng) (tng) (tng) 很遗憾,我们发现该查询的l果了(jin)两个议员QCanavan MSP, Dennis。ؓ(f)什么,因ؓ(f)q两个议员(sh)属于?br />和政党,即他们的政党字段(Party)为空倹{那么ؓ(f)什么不属于M政党查不出来了(jin)Q这是因为空值在
作怪。因员表中政党字D?Party)的空值在政党表中找不到对应的记录作匹配,?br />FROM msp JOIN party ON party=code 没有把该记录q接hQ而是qo(h)出去?jin)?br />在该短语中,msp在Join的左边,所有称为左表。party在Join的右边,所有称为右表?/p>

 (tng) (tng) (tng) Ok,现在再看看这句话Q“包含所有的左边表中的记录甚x(chng)双表中没有和它匚w的记录”,
意思应该很明白?jin)吧。执行下面这个语句,那两个没有政党的议员漏不了(jin)?jin)?/p>

SELECT msp.name, party.name
 (tng) FROM msp LEFT JOIN party ON party=code

关于双?看看q个查询明白了(jin)Q?/p>

SELECT msp.name, party.name
 (tng) FROM msp RIGHT JOIN party ON msp.party=party.code

q个查询的结果列出所有的议员和政党,包含没有议员的政党,但不包含没有政党的议员?/p>

那么既要包含没有议员的政党,又要包含没有政党的议员该怎么办呢Q对?jin),全连?full join)?/p>

SELECT msp.name, party.name
 (tng) FROM msp FULL JOIN party ON msp.party=party.code



Fisher 2007-01-10 15:23 发表评论
]]>
MySQL 的enginecdhttp://www.aygfsteel.com/fisher/articles/92870.htmlFisherFisherWed, 10 Jan 2007 04:12:00 GMThttp://www.aygfsteel.com/fisher/articles/92870.htmlhttp://www.aygfsteel.com/fisher/comments/92870.htmlhttp://www.aygfsteel.com/fisher/articles/92870.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/92870.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/92870.html

另外QMyISAMcd的二q制数据文g可以在不同操作系l中q移。也是可以直接从Windowspȝ拯到l(f)inuxpȝ中用?/p>

从MySQL的官方网站,参考手册中可以?jin)解到在MySQL4.1中所支持的如下类型:(x)

Storage Engines and Table Types 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:

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.

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.

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.

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.

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.

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.

The CSV storage engine was added in MySQL 4.1.4. This engine stores data in text files using comma-separated values format.

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.



Fisher 2007-01-10 12:12 发表评论
]]>
mysql的数据导出几U方?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fisher/articles/90455.html</guid><wfw:comment>http://www.aygfsteel.com/fisher/comments/90455.html</wfw:comment><comments>http://www.aygfsteel.com/fisher/articles/90455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fisher/comments/commentRss/90455.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fisher/services/trackbacks/90455.html</trackback:ping><description><![CDATA[ <div id="wmqeeuq" class="tit">mysql的数据导出几U方?/div> <div id="wmqeeuq" class="date"> (tng)</div> <table style="TABLE-LAYOUT: fixed"> <tbody> <tr> <td> <div id="wmqeeuq" class="cnt"> <p>从网上找C些问题是关于如何从MySQL中导出数据,以便用在本地或其它的数据库系l之上;以及(qing) 现有数据导入MySQL数据库中?/p> <br /> <p>数据导出</p> <p>  数据导出主要有以下几U方法:(x)</p> <p>  使用select into outfile "filename"语句<br />  使用mysqldump实用E序<br />  使用select into outfile "filename"语句</p> <p>  可以在mysql的命令行下或在phpE序中执行它。我下面以在mysql命o(h)行下Z。在php中用时Q将其改成相应的查询q行处理卛_。不q在使用q个命o(h)Ӟ要求用户拥有file的权限。如我们有一个库为phptestQ其中有一个表为driver。现在要把driver卸成文g。执行命令:(x)</p> <p>  mysql> use phptest;<br />  Database Changed<br />  mysql> select * from driver into outfile "a.txt";<br />  Query OK, 22 rows affected (0.05 sec)</p> <p> <br />  上面可以完成将表driver从数据库中卸到a.txt文g中。注意文件名要加单引受那么这个文件在哪呢Q在mysql目录下有一个data目录Q它x(chng)数据库文件所攄地方。每个库在单独占一个子目录Q所以phptest的目录ؓ(f)c:\mysql\data\phptest(注意Q我的mysql安装在c:\mysql?。好Q现在我们进去,a.txt是它。打开q个文gQ可能是Q?/p> <p>  1 Mika Hakinnen 1<br />  2 David Coulthard 1<br />  3 Michael Schumacher 2<br />  4 Rubens Barrichello 2<br />  ...<br />可能q有很多记录。每个字D之间是用制表符分开?\t)。那么我们可以修改输出文件名的目录,以便攑֜指定的位|。如"a.txt"可以Ҏ(gu)"./a.txt"?/a.txt"。其?./a.txt"攑֜c:\mysql\data目录下了(jin)Q?br />?/a.txt"文g则放在c:\目录下了(jin)。所以select命o(h)认ؓ(f)的当前目录是数据库的存放目录Q这里是<br />c:\mysql\data?/p> <p>  使用select命o(h)q可以指定卸出文件时Q字D之间的分隔字符Q{义字W,包括字符Q及(qing)记录行分隔字W。列在下面:(x)</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 表示字段用什么字W包括v来,如果使用?jin)OPTIONALLY则只有CHAR和VERCHAR被包括ESCAPED 表示当需要{义时用什么作{义字WLINES TERMINATED 表示每行记录之间用什么分?/p> <p>  上面列的是缺省|而且q些w是可选的Q不选则使用~省倹{可以根据需要进行修攏V给Z个例子如下:(x)</p> <p>  mysql> select * from driver into outfile "a.txt" fields terminated by "," enclosed by """;<br />  Query OK, 22 rows affected (0.06 sec)</p> <p>  l果可能如下Q?/p> <p>  "1","Mika","Hakinnen","1"<br />  "2","David","Coulthard","1"<br />  "3","Michael","Schumacher","2"<br />  "4","Rubens","Barrichello","2"<br />  ...</p> <p>  可以看到每个字段都用","q行?jin)分隔,且每个字D都?""包括?jin)v来。注意,行记录分隔符可以是一个字W串Q请大家自行试。不q,如果输出文g在指定目录下如果存在的话׃(x)报错Q先删除再测试即可?/p> <p>  使用mysqldump实用E序</p> <p>  从上面的selectҎ(gu)可以看出Q输出的文g只有数据Q而没有表l构。而且Q一ơ只能处理一个表Q要处理多个表则不是很容易的。不q可以将select命o(h)写入一个sql 文gQ复制文本应该是很容易的吧)(j)Q然后在命o(h)行下执行卛_Qmysql 库名<br />先来个最单的吧:(x)<br /><font color="#ff0000">mysqldump phptest > a.sql</font></p> <p>  可能l果如下Q?</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文gQ如果要其导入到其它的数据库中可以通过命o(h)行方式,很方便:(x)mysql phptest < a.sql。如果将数据从本C到服务器上,则可以将q个文g上传Q然后在服务器通过命o(h)行方式装入数据?/p> <p>  如果只想卸出指o(h)Q则命o(h)如下Q?/p> <p>  mysqldump -d phptest > a.sql</p> <p>  如果只想卸出插入数据的sql命o(h)Q而不需要徏表命令,则命令如下:(x)</p> <p>  mysqldump -t phptest > a.sql</p> <p>  那么如果我只惌数据Q而不惌什么sql命o(h)Ӟ应该如何操作呢?</p> <p>  mysqldump -T./ phptest driver</p> <p>  其中Q只有指定了(jin)-T参数才可以卸出纯文本文gQ表C卸出数据的目录Q?/表示当前目录Q即?br />mysqldump同一目录。如果不指定driver表,则将卸出整个数据库的数据。每个表?x)生成两个文Ӟ一个ؓ(f).sql文gQ包含徏表执行。另一个ؓ(f).txt文gQ只包含数据Q且没有sql指o(h)?/p> <p>  对卸出的数据文gQ也可以同selectҎ(gu)一P指定字段分隔W,包括字符Q{义字D,行记录分隔符。参数列在下面:(x)</p> <p>  --fields-terminated-by= 字段分隔W?br />  --fields-enclosed-by= 字段包括W?br />  --fields-optionally-enclosed-by= 字段包括W,只用在CHAR和VERCHAR字段?br />  --fields-escaped-by= 转义字符<br />  --lines-terminated-by= 行记录分隔符<br />我想大家应该明白q些参数的意思了(jin)吧。一个例子如下:(x)<br />  mysqldump -T./ --fields-terminated-by=, --fields-enclosed-by=\" phptest driver</p> <p>  输出l果为:(x)<br />  "1","Mika","Hakinnen","1"<br />  "2","David","Coulthard","1"<br />  "3","Michael","Schumacher","2"<br />  "4","Rubens","Barrichello","2"<br />  ...</p> <p>  h意字W的使用?/p> <p>  结</p> <p>  以上Z用select和mysqldump实用E序来卸出文本的Ҏ(gu)。select适合利用E序q行处理Q而mysqldump则ؓ(f)手工操作Q同时提供强大的导出功能Qƈ且可以处理整个库Q或库中指定的多表。大家可以根据需求自行决定用?/p> <p>  同时q有一些方法,如直接数据库文g拯也可以,但是Ud后的数据库系l与原系l应一致才行。这里就不再提了(jin)?/p> <p>  导入</p> <p>  同导出相cMQ导入也有两U方法:(x)</p> <p>  使用LOAD DATA INFILE "filename"命o(h)<br />  使用mysqlimport实用E序<br />  使用sql文g</p> <p>  ׃前两个处理与导出处理怼Q只不过是它们的逆操作,故只l出几种命o(h)使用的例子,不再解释?jin),大家可以自行查阅手册?/p> <p>  使用load命o(h)Q?br />  load data infile "driver.txt" into table driver fields terminated by "," enclosed by """;</p> <p>  使用mysqlimport实用E序Q?br />  mysqlimport --fields-terminated-by=, --fields-enclosed-by=\" phptest driver.txt</p> <p>  对于W三U,则可以用由mysqldump导出的sql文gQ在命o(h)行下执行mysql库名 <br /><br />专自Q?a >http://hi.baidu.com/breezedancer/blog/item/3020c21b4da2d8faae5133e0.html</a></p> </div> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/fisher/aggbug/90455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fisher/" target="_blank">Fisher</a> 2006-12-28 11:51 <a href="http://www.aygfsteel.com/fisher/articles/90455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Informix-SPL(q程)语法详解http://www.aygfsteel.com/fisher/articles/87698.htmlFisherFisherThu, 14 Dec 2006 06:27:00 GMThttp://www.aygfsteel.com/fisher/articles/87698.htmlhttp://www.aygfsteel.com/fisher/comments/87698.htmlhttp://www.aygfsteel.com/fisher/articles/87698.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/87698.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/87698.html
1.创徏和执行例E?

 (tng) (tng)?创徏例程语法Q?

 (tng) (tng) (tng) (tng) (tng) (tng)CRAETE (tng)PROCEDURE (tng)[OWNER.]PROCEDURE_NAME (tng)(参数1 (tng) (tng)参数cd=[DEFAULT], (tng)参数2 (tng) (tng)参数cd=[DEFAULT],参数n (tng) (tng)参数cd=[DEFAULT]) (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURNING (tng)?cd,?cd,值ncdQ?

 (tng) (tng) (tng) (tng) (tng) (tng)<......>;语句体; (tng) (tng) (tng) (tng) (tng) (tng)END (tng)RPOCEDURE (tng)

例程大小不可过64K,q包括所有的SQL.SPL.I格.x(chng)W?例程名最?8个字W?q在数据库中唯一存在,语句间用";"分隔,例程只能在当前数据库中创?例程创徏后是一标准 (tng)

执行模板块,可在不同的应有中对其调用,q对开发不同版本的应用更Z利。例Q?

create (tng)procedure (tng)"test".upwage() (tng)

define (tng)rev_rev_item_code (tng)varchar(2,0); (tng)

define (tng)rev_p_rev_date (tng)date; (tng)

define (tng)acc_rec_prem_no (tng)decimal(8,2);define (tng)rev_p_rev_amt (tng) (tng)decimal(10,2);define (tng)rev_I_info_branch (tng)varchar(6,0);define (tng)rev_I_info_appl_no (tng)decimal(8,0);define (tng)rev_I_info_date (tng)date;define (tng)rev_o_rev_date (tng)date; (tng)

define (tng)rev_o_rev_amt (tng)decimal(10,2); (tng)

define (tng)acc_ac_rev_amnt (tng)decimal(10,2); (tng)

define (tng)acc_rec_prem_date (tng)date; (tng)

begin (tng)work; (tng)

foreach (tng)cur_rev (tng)for (tng)select (tng)I(yng)_info_appl_branch,I_info_appl_no,I_info_date, (tng)

o_rev_date,o_rev_amt (tng)into (tng)rev_I_info_branch, (tng)

rev_I_info_appl_no,rev_I_info_date,rev_o_rev_date, (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)rev_o_rev_amt (tng)from (tng)rev_rec_tbl (tng)where (tng)

(rev_item_code="PS" (tng)) (tng)and (tng)p_rev_date (tng)is (tng)null (tng)and (tng)

p_rev_amt=0 (tng)and (tng)(I_info_appl_no (tng)is (tng)not (tng)null (tng)or (tng)

I_info_date (tng)is (tng)not (tng)null); (tng)

select (tng)max(rec_prem_acc_no) (tng)into (tng)acc_rec_prem_no (tng)from (tng)rec_prem_acc (tng)where (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)I(yng)_info_appl_branch=rev_I_info_branch (tng)

and (tng)I(yng)_info_appl_no=rev_I_info_appl_no (tng)

and (tng)I(yng)_info_date=rev_I_info_date (tng)

and (tng)o_rev_date=rev_o_rev_date (tng)

and (tng)rev_item_code="PS" (tng)and (tng)

ac_rev_amnt=rev_o_rev_amt; (tng)

select (tng)date(rec_prem_date) (tng)into (tng)acc_rec_prem_date (tng)

from (tng)rec_prem_acc (tng)where (tng)I(yng)_info_appl_branch=rev_I_info_branch (tng)

and (tng)I(yng)_info_appl_no=rev_I_info_appl_no (tng)

and (tng)I(yng)_info_date=rev_I_info_date (tng)

and (tng)o_rev_date=rev_o_rev_date (tng)

and (tng)rev_item_code="PS" (tng)and (tng)

ac_rev_amnt=rev_o_rev_amt (tng)and (tng)

rec_prem_acc_no=acc_rec_prem_no (tng); (tng)

select (tng)ac_rev_amnt (tng)into (tng)acc_ac_rev_amnt (tng)

 (tng) (tng)from (tng)rec_prem_acc (tng)

 (tng)where (tng)I(yng)_info_appl_branch=rev_I_info_branch (tng)

 (tng) (tng)and (tng)I(yng)_info_appl_no=rev_I_info_appl_no (tng)

 (tng) (tng)and (tng)I(yng)_info_date=rev_I_info_date (tng)

 (tng) (tng)and (tng)o_rev_date=rev_o_rev_date (tng)

 (tng) (tng)and (tng)rev_item_code="PS" (tng)

 (tng) (tng)and (tng)rec_prem_acc_no=acc_rec_prem_no (tng)

 (tng) (tng)and (tng)ac_rev_amnt=rev_o_rev_amt; (tng)

if (tng)acc_ac_rev_amnt (tng)is (tng)null (tng)or (tng)acc_rec_prem_date (tng)is (tng)null (tng)then (tng)

 (tng) (tng) (tng)continue (tng)foreach; (tng)

end (tng)if; (tng)

update (tng)rev_rec_tbl (tng)

 (tng) (tng) (tng)set (tng)p_rev_date=acc_rec_prem_date, (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)p_rev_amt (tng)=acc_ac_rev_amnt (tng)

 (tng)where (tng)I(yng)_info_appl_branch=rev_I_info_branch (tng)

 (tng) (tng) (tng)and (tng)I(yng)_info_date=rev_I_info_date (tng)

 (tng) (tng) (tng)and (tng)I(yng)_info_appl_no=rev_I_info_appl_no (tng)

 (tng) (tng) (tng)and (tng)o_rev_date=rev_o_rev_date; (tng)

end (tng)foreach; (tng)

commit (tng)work; (tng)

end (tng)procedure; (tng)

 (tng) (tng)?执行例程语法Q?

 (tng) (tng) (tng) (tng)A):在dbaccess中?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)EXECUTE (tng)PROCEDURE (tng)DBNAME@SERVER_NAME:例程?参数1,参数2,.....)用这U方法可对例E进行调试。?

 (tng) (tng) (tng) (tng)B):在Informix-4GL中?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)PREPARE (tng)PREP (tng)STATTEMENT (tng)FROM (tng)"EXECUTE (tng)PROCEDURE (tng)DBNAME@SERVER_NAME:例程名(?,?,?,...Q?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)DECLARE (tng)P_CURS (tng)SURSOR (tng)FOR (tng)PREP (tng)STMT (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)OPEN (tng)P_CURS (tng)USING (tng)参数1,参数2,.... (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)FETCH (tng)P_CURS (tng)I(yng)NTO (tng)q回?Q返回?Q?.. (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)CLOSE (tng)P_CURS (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)当应用程序不支持EXECUT (tng)PROCEDURE语法,则需使用PREPARE命o(h),如INFORMIX-4GL?而用INFORMIX-NEWEAR则无此限?需注意的是PREPARE语句中变量用?号代?其个数要与例E的参数个数和类型一?q回g是一栗?

 (tng) (tng) (tng) (tng)C):在Informix-ESQL/C中?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)EXEC (tng)SQL (tng)EXECUTE (tng)PROCEDURE (tng)例程?参数1,参数2,...) (tng)I(yng)NTO (tng)Q返回?Q返回?,...Q在EC5.0或更高版本可使用EXECUTE (tng)PROCEDURE (tng)语法,在ESQL/C中宿d量用于想存储例程传递?同时也接收返回? (tng)

 (tng) (tng) (tng) (tng)D):在POWER (tng)BUILDER中?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)DECLARE (tng)逻辑名?tng)PROCEDURE (tng)FOR (tng)例程?:参数1,:参数2:...) (tng)I(yng)NTO (tng):q回?,:q回?,..USING (tng)事物名?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)EXEC (tng)例程?:参数1,:参数2,.....) (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)PB要求ZE制定逻辑?以后的SQL语句以逻辑名ؓ(f)准指向后台数据库例程,当例E即便没有参C必须有小扩号. (tng)

2.程控制语言Q?

在过E中也提供了(jin)其他语言具备的流E控制语a,完成循环判断和分cd理的能力,主要??IF (tng)....ELIF.....ELSE.....END (tng)I(yng)F例:(x) (tng)

CRAETE (tng)PROCEDURE (tng)STR_COM(STR1 (tng)CHAR(20),STR2 (tng)CHAR(20)) (tng)

RETURNING (tng)I(yng)NT; (tng)

DEFINE (tng)REL (tng)I(yng)NT; (tng)

IF (tng)STR1>;STR2 (tng)THEN (tng) (tng)--当STR1>;STR2 (tng)REL=1 (tng)

LET (tng)REL=1; (tng)

ELIF (tng)STR2>;STR1 (tng)THEN (tng)--当STR2>;STR1 (tng)REL=-1 (tng)

LET (tng)REL=-1; (tng)

ELSE (tng)

LET (tng)REL=0; (tng) (tng) (tng)--当STR1=STR2 (tng)REL=0 (tng)

END (tng)I(yng)F (tng)

RETUEN (tng)REL; (tng)

END (tng)PROCEDURE (tng)

当IF的条件ؓ(f)一个SQL语句如SELECT旉用扩Pq且q回gؓ(f)单倹{?

?FOR (tng).....END (tng)FOR (tng)

?FOR (tng)I(yng)NDEX (tng)I(yng)N (tng)(20 (tng)TO (tng)30 (tng)STEP (tng)2,100 (tng)TO (tng)200 (tng)STEP (tng)10) (tng)

 (tng) (tng) (tng)--执行代码 (tng)

 (tng) (tng) (tng)END (tng)FOR (tng)

FOR的条件可以是变量Q常量或一个SQL语句的返回值?

?WHILE.......END (tng)WHILE (tng)

当WHILE的条件ؓ(f)TRUE时执行W(xu)HILE后的语句,为FALSE退出@环。?

?WHILE (tng)I(yng)<10 (tng)

 (tng) (tng) (tng) (tng)I(yng)NSERT (tng)I(yng)NTO (tng)TBB_1 (tng)VALUES(I); (tng)

 (tng) (tng) (tng) (tng)LET (tng)I(yng)=I+1; (tng)

 (tng) (tng) (tng) (tng)END (tng)WHILE; (tng)

?FOREACH........END (tng)FOREACH (tng)

该语句较为特别FOREACH循环能够声明q打开游标,d记录?q关闭游?其完整语? (tng)

 (tng)FOREACH (tng)游标名?tng)[WITH (tng)HOLD] (tng)SELECT (tng)字段名?tng)I(yng)NTO (tng)变量 (tng)FROM (tng)

 (tng) (tng) (tng)TABLE (tng)WHERE (tng)条g (tng)Q?

 (tng)END (tng)FOREACH (tng)

 (tng)FOREACH (tng)EXECUTE (tng)PROCEDURE (tng)例程名(参数1Q参?Q?.Q?tng)I(yng)NTO (tng)

 (tng) (tng)变量 (tng)

 (tng)END (tng)FOREACH (tng)

该@环中语句的执行次CSELECT (tng)和?tng)EXECUTE (tng)PROCEDURE语句q回的行C样多。如果FOREACH语句中包含一条EXECUTE (tng)PROCEDUREQ则循环停止的条件ؓ(f)Q?

.执行?jin)不带Q何参数的RETURN语句 (tng)

.执行?jin)END (tng)PROCEDURE (tng)

如果没有q回行数?则不再执行@环中的语句。存储例E中不允怋用滚动游标。?

当用WITH (tng)HOLDӞ更新游标放|更新锁Q其他q程无法更新该行Q直至事物完成,当在FOREACH循环的语句块中的UPDATE或DELETE有?

WHERE (tng)CURRENT (tng)OF短语Q则存储例程?x)自动用更新游标?

?QBEGIN (tng)WORKQ?

 (tng) (tng) (tng) (tng) (tng)FOREACH (tng)CUR_1 (tng)FOR (tng)SELECT (tng)DATE (tng)I(yng)NTO (tng)V_DATE (tng)FROM (tng)TABLE (tng)

 (tng) (tng) (tng) (tng) (tng)I(yng)F (tng)V_DATE (tng)I(yng)S (tng)NULL (tng)THEN (tng)

 (tng) (tng) (tng) (tng) (tng)DELETE (tng)FROM (tng)TABLE (tng)WHERE (tng)CURRENT (tng)OF (tng)CUR_1; (tng)

 (tng) (tng) (tng) (tng) (tng)END (tng)I(yng)F; (tng)

 (tng) (tng) (tng) (tng) (tng)END (tng)FOREACH; (tng)

 (tng) (tng) (tng) (tng) (tng)COMMIT (tng)WORK; (tng)

?QFOREACH (tng)EXECUTE (tng)PROCEDURE (tng)BAR(10,20) (tng)I(yng)NTO (tng)I(yng) (tng)

 (tng) (tng) (tng) (tng) (tng)I(yng)NSERT (tng)I(yng)NTO (tng)TABLE1 (tng)VALUES(I) (tng)

 (tng) (tng) (tng) (tng) (tng)END (tng)PROCEDURE (tng)

?CONTINUE (tng) (tng) (tng) (tng)适用语句( (tng)FOR (tng)WHILE (tng)FOREACH) (tng) (tng) (tng)执行传递给下一ơ@环⑥.EXIT (tng)

 (tng) (tng) (tng)适用语句( (tng)FOR (tng)WHILE (tng)FOREACH) (tng)

 (tng) (tng) (tng)从@环中退出?

 (tng) (tng) (tng)例:(x)FOR (tng)J=1 (tng)TO (tng)20 (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)I(yng)F (tng)J>;10 (tng)THEN (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)CONTINUE (tng)FOR; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)I(yng)F (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)I(yng),S=J,0; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)WHILE (tng)I(yng)>;0 (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)I(yng)=I-1; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)I(yng)F (tng)I(yng)=5 (tng)THEN (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)EXIT (tng)FOR; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)I(yng)F (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)WHILE (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)FOR (tng)

3.变量的定义与赋? (tng)

 (tng) (tng) (tng)存储例程中用的变量必须在例E开始处用DEFINE语句定义Q变量的数据cd为除SERIAL以外的Q意类型,如果定义一个TEXT或BYTEcd的变量,则该变量为指向数据的指针。传递给E序的变量必dCRAETE (tng)PROCEDURE语句中定义。DEFINE也可使用LIKE语句。变量类型缺省ؓ(f)局部变量,也可引用GLOBAL定义全局变量Q全局变量在例E间保持它的|直至?x)话l束。用户必Mؓ(f)每一个定义的全局变量赋缺省|~省g在例E第一ơ引用该全局变量时用,以后的例E将?x)忽略其~省倹{?

 (tng) (tng)例:(x)CREATE (tng)PROCEDURE (tng)SP1Q)(j) (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURNING (tng)I(yng)NTQ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)DEFINE (tng)GLOBAL (tng)I(yng) (tng)I(yng)NT (tng)DEFAULT (tng)1Q?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)I(yng)=I+1Q?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURN (tng)I(yng)Q?

 (tng) (tng) (tng) (tng) (tng) (tng)END (tng)PROCEDURE (tng)

 (tng) (tng) (tng) (tng) (tng) (tng)CRAETE (tng)PROCEDURE (tng)SP2 (tng)Q)(j) (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURNING (tng)I(yng)NTQ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)DEFINE (tng)GLOBAL (tng)I(yng) (tng)I(yng)NT (tng)DEFAULT (tng)4Q?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)I(yng)=I+1Q?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURN (tng)I(yng); (tng)

 (tng) (tng) (tng) (tng) (tng) (tng)END (tng)PROCEDURE (tng)

 (tng) (tng) (tng) (tng) (tng)当执行顺序ؓ(f)SP1QSP2 (tng)q回?Q当执行序为SP2QSP1q回gؓ(f)6。?

 (tng) (tng) (tng) (tng) (tng)例程也可被声名ؓ(f)变量 (tng)

 (tng) (tng)例:(x)DEFINE (tng)LEN (tng)PROCEDURE (tng)

 (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)X=LENQAQBQCQ?

 (tng) (tng) (tng) (tng)变量赋值必ȝLET关键字,如果不给变量赋|变量?x)有一个不定|M对该变量的用都?x)生错误。?

 (tng) (tng) (tng) (tng) (tng) (tng)BEGIN......END (tng)

 (tng)利用BEGIN....END可以装语句,它允许用户完成以下功? (tng)

 (tng) (tng) (tng) (tng) (tng).定义仅用于该语句块的变量 (tng)

 (tng) (tng) (tng) (tng) (tng).在语句块内以不同方式处理异常情况. (tng)

 (tng) (tng) (tng) (tng) (tng).在某语句块中定义的变?在该语句块以?qing)它所包含的语句块都有?除非又将变量定义一ơ。?

 (tng) (tng) (tng) (tng) (tng) (tng)例? (tng)CREATE (tng)PROCEDURE (tng)SP (tng)Q)(j) (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURNING (tng)I(yng)NTQ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)DEFINE (tng)V1 (tng)I(yng)NTQ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)V1=1Q?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)BEGIN (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)DEFINE (tng)V1 (tng)I(yng)NTQ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)V1=2Q?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURN (tng)V1Q?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)PROCEDURE (tng)

 (tng) (tng) (tng)q回gؓ(f)1。?

4.在例E中执行其他例程和系l命? (tng)

 (tng) (tng) (tng)应用CALL命o(h)可在例程中调用其他的例程。?

 (tng) (tng) (tng)例:(x)CREATE (tng)PROCEDURE (tng)SPQ)(j) (tng) (tng) (tng) (tng) (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)DEFINE (tng)I(yng)QJQKQL (tng)I(yng)NTQ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)CALL (tng)SP1Q?0Q?0Q?tng)RETURNING (tng)I(yng)QJQKQ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)PROCEDURE (tng)

 (tng) (tng) (tng)用SYSTEM可在例程中调用系l命令。?tng)通过SYSTEM命o(h)Q用户可以执行操作系l命令。系l命令放在括号内Q用双管道号Q||Q,q可以ؓ(f)SYSTEM命o(h)串连起多个表辑ּ。但在存储例E中不能使用该命令的q回|如果pȝ调用p|Q返回非零|(j)Q返回值将和SQL错误代码一P攑֜ISAM代码中。?

 (tng) (tng) (tng) (tng)例:(x)SYSTEM (tng)"/usr/exec/exec.sh" (tng)

 (tng) (tng) (tng) (tng)用RETURN命o(h)可以例E运行的l果q回l调用它的应用。当需要多ơ调用同一例程可执行RETURN (tng)WITH (tng)RESUME命o(h)Q它可以保证下一ơ调用该例程Ӟ所有变量保持原|而且从RETURN (tng)WITH (tng)RESUME后的W一条语句执行。?

 (tng) (tng) (tng) (tng)例:(x)RETURN (tng)V_INT (tng)WITH (tng)RESUME; (tng)

5.调试跟踪语句: (tng)

 (tng) (tng) (tng)我们在做应用的时候,当程序完成后都需要进行数据测试,以便验证E序逻辑的严密性,在例E中QINFORMIX也提供了(jin)调试跟踪语句Q其主要有(TRACEQON (tng)EXCEPTIONQRAISE (tng)EXCEPTIONQ。TRACE (tng)语句可以跟踪语句块中每一个活动语句的l果和过E,q且可用SET (tng)DEBUG (tng)FILE (tng)TO (tng)FILENAME (tng)语法写入指定文g中。?

 (tng) (tng) (tng) (tng)ON (tng)EXECEPTION可在例程中设定断点,向一个DEBUGLOG或ERRLOG文g写入错误信息。完整语法ؓ(f): (tng)

 (tng) (tng) (tng) (tng)ON (tng)EXCEPTION (tng)I(yng)N (tng)Qerror_numberQ?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)set (tng)sql错误代码变量Qisam错误代码变量Q错误信息变量?

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)处理语句 (tng)

 (tng) (tng) (tng) (tng)END (tng)EXCEPTION (tng)WITH (tng)RESUME (tng)

 (tng) (tng) (tng) (tng)注意S(chng)ET后的3个变量必dDEFINE中定义,其中sql错误代码QIsam错误代码变量cd为INT,错误信息变量够长的CHAR变量。Error_number是一个SQL错误代码或用RAISE (tng)EXCEPTION讄的陷׃码。WITH (tng)RESUME为可选项,当用WITH (tng)RESUME语句?INFORMIX?x)执行完ON (tng)EXCEPTION语句块的命o(h)后会(x)q回到出错命令行的下一行接着执行,或RAISE (tng)EXCEPTION的下一行执行。?

 (tng) (tng) (tng) (tng)RAISE (tng)EXCEPTIONZؓ(f)讑֮SQL错误代码QISAM错误代码Q错误信息。?

 (tng) (tng) (tng) (tng)RAISE (tng)EXCEPTION与ON (tng)EXCEPTION语法q用很容易跟t例E的错误代码 (tng)

 (tng)例:(x)CREATE (tng)PROCEDURE (tng)TMP_PROCEDURE() (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)DEFINE (tng)SQLCODE (tng)I(yng)NT; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)DEFINE (tng)I(yng)SAMCODE (tng)I(yng)NT; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)DEFINE (tng)ERR_TXT (tng)CHAR(255); (tng)

 (tng) (tng) (tng) (tng) (tng) (tng)ON (tng)EXCEPTION (tng)SET (tng)SQLCODE,ISAMCODE,ERR_TXT (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)I(yng)F (tng)SQLCODE= (tng)-284 (tng)THEN (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RASIE (tng)EXCEPTION (tng)SQLCODE,ISAMCODE,"在TMP_PROCEDURE中查询返回多条记?; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)I(yng)F (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)I(yng)F (tng)SQLCODE= (tng)-1218 (tng)THEN (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)RASIE (tng)EXCEPTION (tng)SQLCODE,ISAMCODE,"在TMP_RPOCEDURE中类型{换错误“; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)END (tng)I(yng)F (tng)

 (tng) (tng) (tng) (tng) (tng)END (tng)EXCEPTION (tng)

 (tng) (tng) (tng) (tng) (tng) (tng)SELECT (tng)....... (tng)

END (tng)PROCEDURE (tng)

 (tng) (tng)

Q?q程实例: (tng)

CREATE (tng)PROCEDURE (tng)YEARS(E_DATE (tng)DATE,B_DATE (tng)DATE) (tng)

RETURNING (tng)I(yng)NT;q回E_DATE与B_DATE之间的整q数(E_DATE大于B_DATE) (tng)

 (tng) (tng) (tng) (tng)DEFINE (tng)V_E (tng) (tng)I(yng)NT; (tng)

 (tng) (tng) (tng) (tng)DEFINE (tng)V_B (tng) (tng)I(yng)NT; (tng)

 (tng) (tng) (tng) (tng)LET (tng)V_E (tng)= (tng)MONTH(E_DATE); (tng)

 (tng) (tng) (tng) (tng)LET (tng)V_B (tng)= (tng)MONTH(B_DATE); (tng)

 (tng) (tng) (tng) (tng)I(yng)F (tng)V_E (tng)< (tng)V_B (tng)THEN (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)V_E (tng)= (tng)YEAR(E_DATE)-YEAR(B_DATE)-1; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURN (tng)V_E; (tng)

 (tng) (tng) (tng) (tng)ELIF (tng)V_E (tng)>; (tng)V_B (tng)THEN (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)V_E (tng)= (tng)YEAR(E_DATE)-YEAR(B_DATE); (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURN (tng)V_E; (tng)

 (tng) (tng) (tng) (tng)END (tng)I(yng)F; (tng)

 (tng) (tng) (tng) (tng)LET (tng)V_E (tng)= (tng)DAY(E_DATE); (tng)

 (tng) (tng) (tng) (tng)LET (tng)V_B (tng)= (tng)DAY(B_DATE); (tng)

 (tng) (tng) (tng) (tng)I(yng)F (tng)V_E (tng)< (tng)V_B (tng)THEN (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)V_E (tng)= (tng)YEAR(E_DATE)-YEAR(B_DATE)-1; (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURN (tng)V_E; (tng)

 (tng) (tng) (tng) (tng)ELSE (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)LET (tng)V_E (tng)= (tng)YEAR(E_DATE)-YEAR(B_DATE); (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng)RETURN (tng)V_E; (tng)

 (tng) (tng) (tng) (tng)END (tng)I(yng)F; (tng)

END (tng)PROCEDURE;


Fisher 2006-12-14 14:27 发表评论
]]>
informix常用命o(h)的用法说?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/fisher/articles/87081.html</guid><wfw:comment>http://www.aygfsteel.com/fisher/comments/87081.html</wfw:comment><comments>http://www.aygfsteel.com/fisher/articles/87081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fisher/comments/commentRss/87081.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fisher/services/trackbacks/87081.html</trackback:ping><description><![CDATA[ <p>语法 oninit (tng) [-s] [-i] [-p] [-y]</p> <p> (tng)oninit将pȝ从off-line模式变(sh)ؓ(f)on-line模式</p> <p>oninit -s ?系l从off-line模式变(sh)ؓ(f)quiescent模式</p> <p>oninit -i ?初始化系l?br /> (tng)<br />oninit -p ?在共享内存初始化Ӟ不搜索,删除临时?/p> <p> (tng)oninit -y ?Ҏ(gu)C动回{yes<br /> (tng)<br /> (tng)oninit (tng) -v (tng) (tng) 加入q个选项昄oninit处理q程</p> <p>oninit-- 键入此命令可以获得用帮?</p> <p> (tng)<br /> (tng)oninit命o(h)用来改变pȝ的运行模式。其?i选项用于初始化系l的root dbspace。注意,root-dbspace一旦被初始化,则等于整个数据库pȝ被初始化?/p> <p>如果用户希望在计机启动时自动自动启动动态服务器pȝQ请在系l初启文Ӟ在许多UNIXpȝ中ؓ(f)/etc/rcQ中加入oninit命o(h)Q不加Q何选项Q?/p> <p> (tng)onmode 命o(h)<br /> (tng)<br /> (tng)语法Q?onmode [-k] [-m] [-s] [-u] [-y]</p> <p>onmode -k 执行立即shutdownQ将pȝ变(sh)ؓ(f)off-line模式</p> <p> (tng)onmode -m 系l从quiescent模式变(sh)ؓ(f)on-line模式</p> <p>onmode -s 执行graceful shutdown<br /> (tng)<br />onmode -u  执行immediate shutdwon</p> <p> (tng)onmode -y ?Ҏ(gu)C动回{yes</p> <p> <br /> (tng)onmode 命o(h)同样用于改变动态服务器的运行模式。除?jin)上q选项?onmodeq有很多与改变系l运行模式无关的选项?br /> (tng)<br />利用onspaces命o(h)创徏数据I间</p> <p> (tng)语法Q?onspaces -c [-b] [-d] [-z] [-m] [-o] [-p] [-s] [-t]<br /> (tng)<br />-c 创建blobspace或dbspace<br /> (tng)<br />-b blobspace blobspace?br /> (tng)<br />-d dbspace dbspace?br /> (tng)<br /> (tng)-g page size?blobpages大小<br /> (tng)<br />-m mirror  镜像讑֤讄全\径名和偏U量QKB)<br /> (tng)<br />-o offset  偏移量(KB)<br /> (tng)<br />-p pathname ?chunk讑֤的全路径?br /> (tng)<br /> (tng)-s sizedbspace大小QKB)</p> <p> (tng)-t 创徏临时dbspace</p> <p> <br />onspaces命o(h)用于创徏数据I间、(f)时空间和存储blob数据的空_(d)blobspace)。键入onspaces--可以获得该命令的联机帮助。利用onstat -D或onstat -d可以看到pȝ中的关于数据I间的重要信息。包括:(x)chunk的状态、空闌Ӏ每一chunkd的次数。系l中可能包括的多个系l空_(d)特别当进行数据分片后Q我们徏议用h好能利用命o(h)行来创徏数据I间?br /> (tng)<br /> (tng)可以利用如下命o(h)创徏数据I间Q?br /> (tng)<br /> (tng)onspaces -c -d datadbs1 -o 0 -p /dev/rrvol3 -s 60000</p> <p> (tng)可以用如下的方式创徏临时数据I间Q?br /> (tng)<br /> (tng)onspaces -c -d tempdbs1 -t -o 0 -p /dev/rrvol5 -s 80000<br /> (tng)<br /> (tng)在系l中Q(f)时数据空间非帔R要,通常情况下,应将多个临时数据I间分布在独立的物理讑֤上?br /> (tng)<br /> (tng)<br />利用onspaces命o(h)删除数据I间</p> <p> (tng)增加或删除chunks</p> <p>语法Q?onspaces -a -d [-m] [-o] [-p]<br /> (tng)<br />-a spacename ؓ(f)dbspace新增chunk<br /> (tng)<br /> (tng)-m pathname镜像讑֤的全路径名和偏移量(KBQ?br /> (tng)<br />-o offset  主设备的偏移量(KB)<br /> (tng)<br />-p pathname ?chunk讑֤的全路径?br /> (tng)<br />-s sizechunk大小<br /> (tng)<br />-d spacename 删除chunk<br /> (tng)<br /> (tng)-o offset  chunk讑֤的偏U量QKB)</p> <p> <br />onspaces不仅能创建数据空间还能删除数据空间、(f)时数据空间或存储blob数据的空间。在删除数据I间Ӟ必须首先保证它是无用的,卌数据I间上无数据库或表?br /> (tng)<br /> (tng)如需删除数据I间Q请键入如下命o(h)Qonspaces -d dbspace_name /blobspace_name</p> <p> (tng)数据I间最初由一个chunkQfirst chunkQ构成,一旦其I间用尽Q用户必追加chunkZ(jin)提高pȝ性能Q用户在为数据空间分配chunk旉要计以保证它的大小能适应未来的需要,否则在追加chunk的时候,它与先前的chunk在物理上不一定相邻,D增加d数据的时间。关于如何计空间需求将在以后章节中阐述。利用onspaces命o(h)可以Ҏ(gu)据空间增加或者删除chunk,除此之外Q利用该命o(h)q可以完成如下Q务:(x)启动镜像、中止镜像或改变chunk的状态?/p> <p> (tng)例如可以用如下命令ؓ(f)数据I间增加chunkQ?/p> <p>onspaces -a -d datadbs1 -0 60002 -p /dev/rrvol3 -s 60000<br /> (tng)<br />再如可以用如下方式从数据I间中删除chunkQ?br /> (tng)<br /> (tng)onspaces -d datadbs1 -o 60002 -p /dev/rrvol3 -s 60000<br /> (tng)</p> <p> (tng)onparams 命o(h)<br /> (tng)<br />语法Qonparams -a -d -p [-d] [-s] [-l]</p> <p>-a 新增逻辑日志<br /> (tng)<br /> (tng)-d dbspace 指定日志存放的dbspace</p> <p> (tng)-s size ?新增逻辑日志的大(KBQ?/p> <p> (tng)-d 删除逻辑日志</p> <p> (tng)-l logid?指定删除一个逻辑日志<br /> (tng)<br /> (tng)-p 改变物理日志<br /> (tng)<br />-d dbspace 新物理日志存攄dbspace?/p> <p>-s size物理日志大小QKB)</p> <p> <br /> (tng)<br />pȝ在初始化时自动地在root dbspace中创建逻辑日志和物理日志。在DBMSpȝ中,其在OLTP环境下,数据库的操作非常频繁Q日志中必须记录大量的信息,所以用h好能多个日志文件分布在不同的设备上。有一U非常简单的Ҏ(gu)Q?x(chng)所需大小创徏逻辑日志Q同时创Z个较?yu)的物理日志Q系l初始化完毕后,再将物理日志U至其它讑֤。关于如何确定所需的物理日志的大小Q将在以后的章节详述?利用onstat -l命o(h)可以看出pȝ中所有新增的逻辑日志被标识ؓ(f)A。这些逻辑日志只有在系l进行归档后才会(x)真正被用。ؓ(f)?jin)激z这些逻辑日志有一U简单的Ҏ(gu)Q执行一ơ“伪”归档。具体步骤如下:(x)参数TAPEDEV讄?dev/null然后q行一ơontape -s。也可以执行onbar -F命o(h)。由于伪归档q不真正归档pȝ信息Q所以千万要适时地对pȝq行真正的归档操作?br /> (tng)<br />只有在逻辑日志真正无用时才能将其删除。利用onstat -l 可以看出所有的I闲日志被标Cؓ(f)F。如果逻辑日志中包含事务回滚或快速恢复所需的信息,该逻辑日志是不能被删除的。利用onstat -l命o(h)可以看出接受当前事务的日志被标记为C。如果逻辑日志包括最后一个检查点记录Q它也是不能被删除的Q只有当(g)查点记录被写入下一个日志忠q且上一个日志被备䆾后,该日志才能被删除。利用onstat -l命o(h)可以看出包含最后一个检查点记录的日志被标记为L。用户可以利用onmode -c命o(h)强制写检查点记录直至最后一个检查点记录被写入所要求的日志ؓ(f)止?/p> <p>onstat 工具<br /> (tng)<br /> (tng)昄动态服务器׃n内存?sh)的信?<br />涉及(qing)量盘I(y)/O操作 <br />对pȝ性能的媄(jing)响极?<br /> (tng)提供关于pȝ有h(hun)值得信息 <br />命o(h)行交互式监控pȝ <br /> (tng)在本章中讲解onstat 的各U重要选项Q请熟?zhn)它们的?<br /> (tng)onstat命o(h)是一U非常有用的pȝ实时监控工具。该命o(h)直接从共享内存的数据l构中读取信息,报告当时的系l状c(din)通常onstat 命o(h)不会(x)q行盘I(y)/O操作Q也不会(x)对系l资源加锁,所以它对系l性能的媄(jing)响减到最。简a之,onstat是informix提供的一U交互式的系l监控工兗?br /> (tng)<br />onstat 的一些常用选项Q?br /> (tng)<br />onstat -- 列出所有选项</p> <p>onstat -i 讄q入交互模式<br /> (tng)<br /> (tng)onstat -  昄q行模式和数据库引擎状?br /> (tng)<br /> (tng)onstat -g sub_option q行多线索选项</p> <p> (tng)onstat -r <value> 每隔<value>U后重复选项<br /> (tng)<br />onstat -g act 昄pȝ中所有的zdU烦(ch)<br /> (tng)<br /> (tng)onstat -g ath -r 2 每隔两秒昄pȝ中所有的zd的线?br /> (tng)<br /> (tng)<br /> (tng)pȝ监控界面<br /> (tng)<br /> (tng)sysmaster数据库在pȝ初始化时自动创徏 <br /> (tng)数据库中包括指向pȝ׃n内存l构数据字典信息 <br />提供瞬时的系l性能和状态信?<br /> (tng)提供SQL界面?jin)解数据字典信?<br />允许理员将pȝ理工作自动?<br /> (tng)用于执行重复性的监控d <br /> (tng)<br /> (tng)<br /> (tng)</p> <p>pȝ监控界面Qsystem Monitoring Interface --SMI)是一U基于SQL的系l工P用户通过SMI可以非常方便地获取系l信息。系l在初始化时Q自动地在root dbapace创徏sysmasterpȝ数据库。每一pȝ包括一个sysmaster数据库,该数据库中的大部分表表,是指向共享内存(sh)数据l构的指针。利用SMI可以自动监控pȝQ特别是在执行重复Q务时?br /> (tng)<br />sysmaster数据库是只读的,即不允许对其q行INSERT UPDATE,或DELETE操作。所有用户都拥有对该数据库的查询权限?/p> <p> (tng)在系l初始化后,用户一定要注意(g)查sysmaster数据库是否徏立成功。创建sysmaster数据库的信息都保存在消息日志文g中(online.log)h意由于所有的DDL语句都将被记录在日志中,所以一定要在日志文件中留出_的空间以保证创徏sysmaster所需?br /> (tng)<br />sysmaster数据库模式记录在$INFORMIXDIR/etc/sysmaster.sql文g中?br /> (tng)<br /> (tng)oncheck 命o(h)</p> <p>(g)查动态服务器盘?sh)的数据l构 <br /> (tng)定位q修补损坏的索引和数?<br />有磁盘I(y)/O操作 <br /> (tng)一些操作在处理时将在表上加?<br />oncheck命o(h)用于修复盘?sh)损坏的索引和数据页Q该命o(h)也可用于(g)查ƈ打印pȝ的数据结构。在使用oncheck时一定要当心(j)Q因为改命o(h)的某些选项?x)对表加׃n锁,例如Qoncheck -pt</p> <p>为防止对pȝ的损坏,pȝ?x)对所有共享内存(sh)的数据进行一ơ一致性检查。一旦发现数据页出现一致性错误或发现索引错误Q系l将把问题和可能的解x(chng)案(利用oncheck)写入消息日志文gQƈq回isam错误代码105?/p> <p>如果发现一致性错误信息,用户应该立即关闭pȝq按消息日志文g中的提示q行oncheck。如果oncheckq行p|Q则应尝试卸?gu)再重新装入;如果是?ch)引得问题Q则应先删除索引再重Z。如果所有这些步骤都p|?jin),只有?gu)原有的系l归档备份来恢复pȝ?/p> <p>下面的命令可以提供extend信息Q?/p> <p>oncheck -pe<br /> (tng)<br />[table=98%][tr][td] 大梦 回复于:(x)2003-05-29 22:37:16 [tr][td]OKQ?/p> <p> (tng)[tr][td] 跑 回复于:(x)2003-05-30 06:07:04 [tr][td]好!Q辛苦大大了(jin)~~</p> <p> (tng)[tr][td] lxs212 回复于:(x)2003-05-30 08:37:34 [tr][td]?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</p> <p>[tr][td] ifx 回复于:(x)2003-05-30 08:47:04 [tr][td]onstat ? oninit.<br /> (tng)<br /> (tng)[tr][td] 蓝色键盘 回复于:(x)2003-05-30 09:51:18 [tr][td]onstat -i应该是:(x)<br /> (tng)<br />oninit -i ?初始化系l?</p> <p> <br />可能是我整理的文档手误。更正如上?/p> <p>[tr][td] ifx 回复于:(x)2003-05-30 10:55:26 [tr][td]"语法 onstat [-s] [-i] [-p] [-y] </p> <p> (tng)onstat 将pȝ从off-line模式变(sh)ؓ(f)on-line模式 <br /> (tng)<br /> (tng)onstat -s ?系l从off-line模式变(sh)ؓ(f)quiescent模式 <br /> (tng)<br /> (tng)onstat -i ?初始化系l?<br /> (tng)<br />onstat -p ?在共享内存初始化Ӟ不搜索,删除临时?<br /> (tng)<br /> (tng)onstat -y ?Ҏ(gu)C动回{yes </p> <p>oninit -- 键入此命令可以获得用帮?</p> <p> (tng)<br /> (tng)onstat 命o(h)用来改变pȝ的运行模式。其?i选项用于初始化系l的root dbspace。注意,root-dbspace一旦被初始化,则等于整个数据库pȝ被初始化?</p> <p> (tng)如果用户希望在计机启动时自动自动启动动态服务器pȝQ请在系l初启文Ӟ在许多UNIXpȝ中ؓ(f)/etc/rcQ中加入onstat命o(h)Q不加Q何选项Q?<br /> (tng)"<br /> (tng)q一D中的所有的onstat均ؓ(f)oninit[/td][/tr][/table]<br /></p> <img src ="http://www.aygfsteel.com/fisher/aggbug/87081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fisher/" target="_blank">Fisher</a> 2006-12-11 22:49 <a href="http://www.aygfsteel.com/fisher/articles/87081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">֦</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϲ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̳</a>| <a href="http://" target="_blank">¦</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">٤ʦ</a>| <a href="http://" target="_blank">ͭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ½</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˼</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӯ</a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ĵ</a>| <a href="http://" target="_blank">ƴ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>