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

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

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

车站表:
stops(id, name)

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

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

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

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

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

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

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

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

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

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

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

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



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


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

   SELECT   *
  
FROM  testtable


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

   SELECT  nickname,email
  
FROM  testtable


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

   SELECT  늧 = nickname,电子邮g = email
  
FROM  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回的行数等于总行数的癑ֈ之几。例如:

SELECT   TOP   2   * FROM  testtable  SELECT   TOP   20   PERCENT   *   FROM  testtable


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

   SELECT  username,citytable.cityid
  
FROM  usertable,citytable
  
WHERE  usertable.cityid = citytable.cityid


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

  表名  as  别名
  表名 别名


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

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


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

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


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

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

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

ORDER   BY  {column_name  [ ASC|DESC ] [ ,…n ]


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

   SELECT   *
  
FROM  usertable
  
ORDER   BY  age  desc ,userid  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://m.tkk7.com/fisher/articles/92924.htmlFisherFisherWed, 10 Jan 2007 07:28:00 GMThttp://m.tkk7.com/fisher/articles/92924.htmlhttp://m.tkk7.com/fisher/comments/92924.htmlhttp://m.tkk7.com/fisher/articles/92924.html#Feedback0http://m.tkk7.com/fisher/comments/commentRss/92924.htmlhttp://m.tkk7.com/fisher/services/trackbacks/92924.htmlZ从两个或多个表中选出数据Q我们一般用表q接来实现这个功能?/p>

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

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

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

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

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

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

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

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

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

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


二、哪个artist录制了歌?Exodus'

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

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

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

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


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

 

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



Fisher 2007-01-10 15:28 发表评论
]]>
SQL核心语句(非常实用的几个技? http://m.tkk7.com/fisher/articles/92920.htmlFisherFisherWed, 10 Jan 2007 07:26:00 GMThttp://m.tkk7.com/fisher/articles/92920.htmlhttp://m.tkk7.com/fisher/comments/92920.htmlhttp://m.tkk7.com/fisher/articles/92920.html#Feedback0http://m.tkk7.com/fisher/comments/commentRss/92920.htmlhttp://m.tkk7.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 语句的完整句法如下:

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了一条三个字D都有值的完整记录Q?

INSERT mytable (first_column,second_column,third_column)

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

注意

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

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

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

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

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

The column in table mytable may not be null.

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

注意

向一个有标识字段的表中插入新记录后,你可以用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被插入表anothertable的another_first字段。这是因为变量@@identityL保存最后一ơ插入标识字D늚倹{?

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

删除记录

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

DELETE mytable WHERE first_column=’Deltet Me?

DELETE 语句的完整句法如下:

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

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

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

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

注意

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

更新记录

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

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

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

下面是UPDATE语句的完整句法:

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语句。这部分内容Ҏ书来说太高了,因此不加讨论。要了解更多的信息,请参考Microsoft SQL Sever 的文?

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

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

UPDATE mytable SET first_column=’Updated!?

Second_column=’Updated!?

Third_column=’Updated!?

WHERE first_column=’Update Me1?

技?

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

用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=’Copy Me!?

q个语句从anothertable拯记录到mytable.只有表anothertable中字Danother_first的gؓ’Copy MeQ’的记录才被拯?

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

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

SELECT * INTO newtable FROM mytable

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

SELECT first_column INTO newtable

FROM mytable

WHERE second_column=’Copy Me!?

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

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

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

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

INSERT mytable (mycolumn) VALUES (‘some data?

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

INSERT 语句的完整句法如下:

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了一条三个字D都有值的完整记录Q?

INSERT mytable (first_column,second_column,third_column)

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

注意

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

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

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

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

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

The column in table mytable may not be null.

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

注意

向一个有标识字段的表中插入新记录后,你可以用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被插入表anothertable的another_first字段。这是因为变量@@identityL保存最后一ơ插入标识字D늚倹{?

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

删除记录

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

DELETE mytable WHERE first_column=’Deltet Me?

DELETE 语句的完整句法如下:

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

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

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

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

注意

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

更新记录

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

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

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

下面是UPDATE语句的完整句法:

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语句。这部分内容Ҏ书来说太高了,因此不加讨论。要了解更多的信息,请参考Microsoft SQL Sever 的文?

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

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

UPDATE mytable SET first_column=’Updated!?

Second_column=’Updated!?

Third_column=’Updated!?

WHERE first_column=’Update Me1?

技?

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

用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=’Copy Me!?

q个语句从anothertable拯记录到mytable.只有表anothertable中字Danother_first的gؓ’Copy MeQ’的记录才被拯?

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

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

SELECT * INTO newtable FROM mytable

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

SELECT first_column INTO newtable

FROM mytable

WHERE second_column=’Copy Me!?

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

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

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


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


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

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

  FROM join_table join_type join_table
  
[ON (join_condition)]


其中join_table指出参与q接操作的表名,q接可以对同一个表操作Q也可以对多表操作,对同一个表操作的连接又U做自连接?br />  
join_type 指出q接cdQ可分ؓ三种Q内q接、外q接和交叉连接。内q接(INNER JOIN)使用比较q算W进行表间某(?列数据的比较操作Qƈ列出q些表中与连接条件相匚w的数据行。根据所使用的比较方式不同,内连接又分ؓ{D接、自然连接和不等q接三种。外q接分ؓ左外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,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以W二个表中符合查询条件的数据行数?br />  
q接操作中的ON (join_condition) 子句指出q接条gQ它pq接表中的列和比较运符、逻辑q算W等构成?br />  
无论哪种q接都不能对text、ntext和image数据cd列进行直接连接,但可以对q三U列q行间接q接。例如:

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


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

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


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

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


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

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


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

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


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

  SELECT type,pub_name
  
FROM titles CROSS JOIN publishers
  
ORDER BY type

 

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

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

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


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

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

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

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

select * from table1 left join table2 on table1.id=table2.id


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

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

select * from table1 right join table2 on table1.id=table2.id


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

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

select * from table1 full join table2 on table1.id=table2.id


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

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

2.内连接:join ?inner join

3.sql语句

select * from table1 join table2 on table1.id=table2.id


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

4.{hQ与下列执行效果相同Q?/p>

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


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

三、交叉连?完全)

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

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

3.sql语句

select * from table1 cross join table2


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

4.{hQ与下列执行效果相同Q?/p>

A:select * from table1,table2

 



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



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

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

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

SELECT code, name FROM party
  WHERE leader IS NULL

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

SELECT name FROM msp
  WHERE party IS NULL

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

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

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

SELECT msp.name, party.name
  FROM msp JOIN party ON party=code

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

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

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

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

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

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

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

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

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



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

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

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

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

  ?创徏例程语法Q?

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

                    RETURNING ?cd,?cd,值ncdQ?

      <......>;语句体;      END RPOCEDURE 

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

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

create procedure "test".upwage() 

define rev_rev_item_code varchar(2,0); 

define rev_p_rev_date date; 

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; 

define rev_o_rev_amt decimal(10,2); 

define acc_ac_rev_amnt decimal(10,2); 

define acc_rec_prem_date date; 

begin work; 

foreach cur_rev for select I_info_appl_branch,I_info_appl_no,I_info_date, 

o_rev_date,o_rev_amt into rev_I_info_branch, 

rev_I_info_appl_no,rev_I_info_date,rev_o_rev_date,                             rev_o_rev_amt from rev_rec_tbl where 

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

p_rev_amt=0 and (I_info_appl_no is not null or 

I_info_date is not null); 

select max(rec_prem_acc_no) into acc_rec_prem_no from rec_prem_acc where                                   I_info_appl_branch=rev_I_info_branch 

and I_info_appl_no=rev_I_info_appl_no 

and I_info_date=rev_I_info_date 

and o_rev_date=rev_o_rev_date 

and rev_item_code="PS" and 

ac_rev_amnt=rev_o_rev_amt; 

select date(rec_prem_date) into acc_rec_prem_date 

from rec_prem_acc where I_info_appl_branch=rev_I_info_branch 

and I_info_appl_no=rev_I_info_appl_no 

and I_info_date=rev_I_info_date 

and o_rev_date=rev_o_rev_date 

and rev_item_code="PS" and 

ac_rev_amnt=rev_o_rev_amt and 

rec_prem_acc_no=acc_rec_prem_no ; 

select ac_rev_amnt into acc_ac_rev_amnt 

  from rec_prem_acc 

 where I_info_appl_branch=rev_I_info_branch 

  and I_info_appl_no=rev_I_info_appl_no 

  and I_info_date=rev_I_info_date 

  and o_rev_date=rev_o_rev_date 

  and rev_item_code="PS" 

  and rec_prem_acc_no=acc_rec_prem_no 

  and ac_rev_amnt=rev_o_rev_amt; 

if acc_ac_rev_amnt is null or acc_rec_prem_date is null then 

   continue foreach; 

end if; 

update rev_rec_tbl 

   set p_rev_date=acc_rec_prem_date, 

       p_rev_amt =acc_ac_rev_amnt 

 where I_info_appl_branch=rev_I_info_branch 

   and I_info_date=rev_I_info_date 

   and I_info_appl_no=rev_I_info_appl_no 

   and o_rev_date=rev_o_rev_date; 

end foreach; 

commit work; 

end procedure; 

  ?执行例程语法Q?

    A):在dbaccess中?

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

    B):在Informix-4GL中?

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

       DECLARE P_CURS SURSOR FOR PREP STMT 

       OPEN P_CURS USING 参数1,参数2,.... 

       FETCH P_CURS INTO q回?Q返回?Q?.. 

       CLOSE P_CURS 

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

    C):在Informix-ESQL/C中?

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

    D):在POWER BUILDER中?

       DECLARE 逻辑名 PROCEDURE FOR 例程?:参数1,:参数2:...) INTO :q回?,:q回?,..USING 事物名?

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

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

2.程控制语言Q?

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

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

RETURNING INT; 

DEFINE REL INT; 

IF STR1>;STR2 THEN  --当STR1>;STR2 REL=1 

LET REL=1; 

ELIF STR2>;STR1 THEN --当STR2>;STR1 REL=-1 

LET REL=-1; 

ELSE 

LET REL=0;   --当STR1=STR2 REL=0 

END IF 

RETUEN REL; 

END PROCEDURE 

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

?FOR .....END FOR 

?FOR INDEX IN (20 TO 30 STEP 2,100 TO 200 STEP 10) 

   --执行代码 

   END FOR 

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

?WHILE.......END WHILE 

当WHILE的条件ؓTRUE时执行WHILE后的语句,为FALSE退出@环。?

?WHILE I<10 

    INSERT INTO TBB_1 VALUES(I); 

    LET I=I+1; 

    END WHILE; 

?FOREACH........END FOREACH 

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

 FOREACH 游标名 [WITH HOLD] SELECT 字段名 INTO 变量 FROM 

   TABLE WHERE 条g Q?

 END FOREACH 

 FOREACH EXECUTE PROCEDURE 例程名(参数1Q参?Q?.Q INTO 

  变量 

 END FOREACH 

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

.执行了不带Q何参数的RETURN语句 

.执行了END PROCEDURE 

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

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

WHERE CURRENT OF短语Q则存储例程会自动用更新游标?

?QBEGIN WORKQ?

     FOREACH CUR_1 FOR SELECT DATE INTO V_DATE FROM TABLE 

     IF V_DATE IS NULL THEN 

     DELETE FROM TABLE WHERE CURRENT OF CUR_1; 

     END IF; 

     END FOREACH; 

     COMMIT WORK; 

?QFOREACH EXECUTE PROCEDURE BAR(10,20) INTO I 

     INSERT INTO TABLE1 VALUES(I) 

     END PROCEDURE 

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

   适用语句( FOR WHILE FOREACH) 

   从@环中退出?

   例:FOR J=1 TO 20 

       IF J>;10 THEN 

          CONTINUE FOR; 

       END IF 

       LET I,S=J,0; 

         WHILE I>;0 

             LET I=I-1; 

             IF I=5 THEN 

               EXIT FOR; 

             END IF 

         END WHILE 

       END FOR 

3.变量的定义与赋? 

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

  例:CREATE PROCEDURE SP1Q) 

        RETURNING INTQ?

        DEFINE GLOBAL I INT DEFAULT 1Q?

        LET I=I+1Q?

        RETURN IQ?

      END PROCEDURE 

      CRAETE PROCEDURE SP2 Q) 

        RETURNING INTQ?

        DEFINE GLOBAL I INT DEFAULT 4Q?

        LET I=I+1Q?

        RETURN I; 

      END PROCEDURE 

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

     例程也可被声名ؓ变量 

  例:DEFINE LEN PROCEDURE 

      LET X=LENQAQBQCQ?

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

      BEGIN......END 

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

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

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

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

      例? CREATE PROCEDURE SP Q) 

           RETURNING INTQ?

           DEFINE V1 INTQ?

           LET V1=1Q?

           BEGIN 

             DEFINE V1 INTQ?

             LET V1=2Q?

           END 

          RETURN V1Q?

        END PROCEDURE 

   q回gؓ1。?

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

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

   例:CREATE PROCEDURE SPQ)     

       DEFINE IQJQKQL INTQ?

         CALL SP1Q?0Q?0Q RETURNING IQJQKQ?

       END PROCEDURE 

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

    例:SYSTEM "/usr/exec/exec.sh" 

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

    例:RETURN V_INT WITH RESUME; 

5.调试跟踪语句: 

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

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

    ON EXCEPTION IN Qerror_numberQ?

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

       处理语句 

    END EXCEPTION WITH RESUME 

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

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

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

 例:CREATE PROCEDURE TMP_PROCEDURE() 

       DEFINE SQLCODE INT; 

       DEFINE ISAMCODE INT; 

       DEFINE ERR_TXT CHAR(255); 

      ON EXCEPTION SET SQLCODE,ISAMCODE,ERR_TXT 

        IF SQLCODE= -284 THEN 

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

        END IF 

        IF SQLCODE= -1218 THEN 

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

       END IF 

     END EXCEPTION 

      SELECT ....... 

END PROCEDURE 

  

Q?q程实例: 

CREATE PROCEDURE YEARS(E_DATE DATE,B_DATE DATE) 

RETURNING INT;q回E_DATE与B_DATE之间的整q数(E_DATE大于B_DATE) 

    DEFINE V_E  INT; 

    DEFINE V_B  INT; 

    LET V_E = MONTH(E_DATE); 

    LET V_B = MONTH(B_DATE); 

    IF V_E < V_B THEN 

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

       RETURN V_E; 

    ELIF V_E >; V_B THEN 

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

       RETURN V_E; 

    END IF; 

    LET V_E = DAY(E_DATE); 

    LET V_B = DAY(B_DATE); 

    IF V_E < V_B THEN 

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

       RETURN V_E; 

    ELSE 

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

       RETURN V_E; 

    END IF; 

END PROCEDURE;


Fisher 2006-12-14 14:27 发表评论
]]>
informix常用命o的用法说?/title><link>http://m.tkk7.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://m.tkk7.com/fisher/articles/87081.html</guid><wfw:comment>http://m.tkk7.com/fisher/comments/87081.html</wfw:comment><comments>http://m.tkk7.com/fisher/articles/87081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/fisher/comments/commentRss/87081.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/fisher/services/trackbacks/87081.html</trackback:ping><description><![CDATA[ <p>语法 oninit  [-s] [-i] [-p] [-y]</p> <p> oninit将pȝ从off-line模式变ؓon-line模式</p> <p>oninit -s ?系l从off-line模式变ؓquiescent模式</p> <p>oninit -i ?初始化系l?br /> <br />oninit -p ?在共享内存初始化Ӟ不搜索,删除临时?/p> <p> oninit -y ?ҎC动回{yes<br /> <br /> oninit  -v   加入q个选项昄oninit处理q程</p> <p>oninit-- 键入此命令可以获得用帮?</p> <p> <br /> oninit命o用来改变pȝ的运行模式。其?i选项用于初始化系l的root dbspace。注意,root-dbspace一旦被初始化,则等于整个数据库pȝ被初始化?/p> <p>如果用户希望在计机启动时自动自动启动动态服务器pȝQ请在系l初启文Ӟ在许多UNIXpȝ中ؓ/etc/rcQ中加入oninit命oQ不加Q何选项Q?/p> <p> onmode 命o<br /> <br /> 语法Q?onmode [-k] [-m] [-s] [-u] [-y]</p> <p>onmode -k 执行立即shutdownQ将pȝ变ؓoff-line模式</p> <p> onmode -m 系l从quiescent模式变ؓon-line模式</p> <p>onmode -s 执行graceful shutdown<br /> <br />onmode -u  执行immediate shutdwon</p> <p> onmode -y ?ҎC动回{yes</p> <p> <br /> onmode 命o同样用于改变动态服务器的运行模式。除了上q选项?onmodeq有很多与改变系l运行模式无关的选项?br /> <br />利用onspaces命o创徏数据I间</p> <p> 语法Q?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  镜像讑֤讄全\径名和偏U量QKB)<br /> <br />-o offset  偏移量(KB)<br /> <br />-p pathname ?chunk讑֤的全路径?br /> <br /> -s sizedbspace大小QKB)</p> <p> -t 创徏临时dbspace</p> <p> <br />onspaces命o用于创徏数据I间、时空间和存储blob数据的空_blobspace)。键入onspaces--可以获得该命令的联机帮助。利用onstat -D或onstat -d可以看到pȝ中的关于数据I间的重要信息。包括:chunk的状态、空闌Ӏ每一chunkd的次数。系l中可能包括的多个系l空_特别当进行数据分片后Q我们徏议用h好能利用命o行来创徏数据I间?br /> <br /> 可以利用如下命o创徏数据I间Q?br /> <br /> onspaces -c -d datadbs1 -o 0 -p /dev/rrvol3 -s 60000</p> <p> 可以用如下的方式创徏临时数据I间Q?br /> <br /> onspaces -c -d tempdbs1 -t -o 0 -p /dev/rrvol5 -s 80000<br /> <br /> 在系l中Q时数据空间非帔R要,通常情况下,应将多个临时数据I间分布在独立的物理讑֤上?br /> <br /> <br />利用onspaces命o删除数据I间</p> <p> 增加或删除chunks</p> <p>语法Q?onspaces -a -d [-m] [-o] [-p]<br /> <br />-a spacename ؓdbspace新增chunk<br /> <br /> -m pathname镜像讑֤的全路径名和偏移量(KBQ?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讑֤的偏U量QKB)</p> <p> <br />onspaces不仅能创建数据空间还能删除数据空间、时数据空间或存储blob数据的空间。在删除数据I间Ӟ必须首先保证它是无用的,卌数据I间上无数据库或表?br /> <br /> 如需删除数据I间Q请键入如下命oQonspaces -d dbspace_name /blobspace_name</p> <p> 数据I间最初由一个chunkQfirst chunkQ构成,一旦其I间用尽Q用户必追加chunkZ提高pȝ性能Q用户在为数据空间分配chunk旉要计以保证它的大小能适应未来的需要,否则在追加chunk的时候,它与先前的chunk在物理上不一定相邻,D增加d数据的时间。关于如何计空间需求将在以后章节中阐述。利用onspaces命o可以Ҏ据空间增加或者删除chunk,除此之外Q利用该命oq可以完成如下Q务:启动镜像、中止镜像或改变chunk的状态?/p> <p> 例如可以用如下命令ؓ数据I间增加chunkQ?/p> <p>onspaces -a -d datadbs1 -0 60002 -p /dev/rrvol3 -s 60000<br /> <br />再如可以用如下方式从数据I间中删除chunkQ?br /> <br /> onspaces -d datadbs1 -o 60002 -p /dev/rrvol3 -s 60000<br /> </p> <p> onparams 命o<br /> <br />语法Qonparams -a -d -p [-d] [-s] [-l]</p> <p>-a 新增逻辑日志<br /> <br /> -d dbspace 指定日志存放的dbspace</p> <p> -s size ?新增逻辑日志的大(KBQ?/p> <p> -d 删除逻辑日志</p> <p> -l logid?指定删除一个逻辑日志<br /> <br /> -p 改变物理日志<br /> <br />-d dbspace 新物理日志存攄dbspace?/p> <p>-s size物理日志大小QKB)</p> <p> <br /> <br />pȝ在初始化时自动地在root dbspace中创建逻辑日志和物理日志。在DBMSpȝ中,其在OLTP环境下,数据库的操作非常频繁Q日志中必须记录大量的信息,所以用h好能多个日志文件分布在不同的设备上。有一U非常简单的ҎQ?x所需大小创徏逻辑日志Q同时创Z个较的物理日志Q系l初始化完毕后,再将物理日志U至其它讑֤。关于如何确定所需的物理日志的大小Q将在以后的章节详述?利用onstat -l命o可以看出pȝ中所有新增的逻辑日志被标识ؓA。这些逻辑日志只有在系l进行归后才会真正被用。ؓ了激z这些逻辑日志有一U简单的ҎQ执行一ơ“伪”归。具体步骤如下:参数TAPEDEV讄?dev/null然后q行一ơontape -s。也可以执行onbar -F命o。由于伪归档q不真正归档pȝ信息Q所以千万要适时地对pȝq行真正的归操作?br /> <br />只有在逻辑日志真正无用时才能将其删除。利用onstat -l 可以看出所有的I闲日志被标CؓF。如果逻辑日志中包含事务回滚或快速恢复所需的信息,该逻辑日志是不能被删除的。利用onstat -l命o可以看出接受当前事务的日志被标记为C。如果逻辑日志包括最后一个检查点记录Q它也是不能被删除的Q只有当查点记录被写入下一个日志忠q且上一个日志被备䆾后,该日志才能被删除。利用onstat -l命o可以看出包含最后一个检查点记录的日志被标记为L。用户可以利用onmode -c命o强制写检查点记录直至最后一个检查点记录被写入所要求的日志ؓ止?/p> <p>onstat 工具<br /> <br /> 昄动态服务器׃n内存中的信息 <br />涉及量盘I/O操作 <br />对pȝ性能的媄响极?<br /> 提供关于pȝ有h值得信息 <br />命o行交互式监控pȝ <br /> 在本章中讲解onstat 的各U重要选项Q请熟悉它们的?<br /> onstat命o是一U非常有用的pȝ实时监控工具。该命o直接从共享内存的数据l构中读取信息,报告当时的系l状c通常onstat 命o不会q行盘I/O操作Q也不会对系l资源加锁,所以它对系l性能的媄响减到最。简a之,onstat是informix提供的一U交互式的系l监控工兗?br /> <br />onstat 的一些常用选项Q?br /> <br />onstat -- 列出所有选项</p> <p>onstat -i 讄q入交互模式<br /> <br /> onstat -  昄q行模式和数据库引擎状?br /> <br /> onstat -g sub_option q行多线索选项</p> <p> onstat -r <value> 每隔<value>U后重复选项<br /> <br />onstat -g act 昄pȝ中所有的zdU烦<br /> <br /> onstat -g ath -r 2 每隔两秒昄pȝ中所有的zd的线?br /> <br /> <br /> pȝ监控界面<br /> <br /> sysmaster数据库在pȝ初始化时自动创徏 <br /> 数据库中包括指向pȝ׃n内存l构数据字典信息 <br />提供瞬时的系l性能和状态信?<br /> 提供SQL界面了解数据字典信息 <br />允许理员将pȝ理工作自动?<br /> 用于执行重复性的监控d <br /> <br /> <br /> </p> <p>pȝ监控界面Qsystem Monitoring Interface --SMI)是一U基于SQL的系l工P用户通过SMI可以非常方便地获取系l信息。系l在初始化时Q自动地在root dbapace创徏sysmasterpȝ数据库。每一pȝ包括一个sysmaster数据库,该数据库中的大部分表表,是指向共享内存中数据l构的指针。利用SMI可以自动监控pȝQ特别是在执行重复Q务时?br /> <br />sysmaster数据库是只读的,即不允许对其q行INSERT UPDATE,或DELETE操作。所有用户都拥有对该数据库的查询权限?/p> <p> 在系l初始化后,用户一定要注意查sysmaster数据库是否徏立成功。创建sysmaster数据库的信息都保存在消息日志文g中(online.log)h意由于所有的DDL语句都将被记录在日志中,所以一定要在日志文件中留出_的空间以保证创徏sysmaster所需?br /> <br />sysmaster数据库模式记录在$INFORMIXDIR/etc/sysmaster.sql文g中?br /> <br /> oncheck 命o</p> <p>查动态服务器盘上的数据l构 <br /> 定位q修补损坏的索引和数?<br />有磁盘I/O操作 <br /> 一些操作在处理时将在表上加?<br />oncheck命o用于修复盘上损坏的索引和数据页Q该命o也可用于查ƈ打印pȝ的数据结构。在使用oncheck时一定要当心Q因为改命o的某些选项会对表加׃n锁,例如Qoncheck -pt</p> <p>为防止对pȝ的损坏,pȝ会对所有共享内存中的数据进行一ơ一致性检查。一旦发现数据页出现一致性错误或发现索引错误Q系l将把问题和可能的解x案(利用oncheck)写入消息日志文gQƈq回isam错误代码105?/p> <p>如果发现一致性错误信息,用户应该立即关闭pȝq按消息日志文g中的提示q行oncheck。如果oncheckq行p|Q则应尝试卸再重新装入;如果是烦引得问题Q则应先删除索引再重Z。如果所有这些步骤都p|了,只有Ҏ原有的系l归备份来恢复pȝ?/p> <p>下面的命令可以提供extend信息Q?/p> <p>oncheck -pe<br /> <br />[table=98%][tr][td] 大梦 回复于:2003-05-29 22:37:16 [tr][td]OKQ?/p> <p> [tr][td] 跑 回复于:2003-05-30 06:07:04 [tr][td]好!Q辛苦大大了~~</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 ?初始化系l?</p> <p> <br />可能是我整理的文档手误。更正如上?/p> <p>[tr][td] ifx 回复于:2003-05-30 10:55:26 [tr][td]"语法 onstat [-s] [-i] [-p] [-y] </p> <p> onstat 将pȝ从off-line模式变ؓon-line模式 <br /> <br /> onstat -s ?系l从off-line模式变ؓquiescent模式 <br /> <br /> onstat -i ?初始化系l?<br /> <br />onstat -p ?在共享内存初始化Ӟ不搜索,删除临时?<br /> <br /> onstat -y ?ҎC动回{yes </p> <p>oninit -- 键入此命令可以获得用帮?</p> <p> <br /> onstat 命o用来改变pȝ的运行模式。其?i选项用于初始化系l的root dbspace。注意,root-dbspace一旦被初始化,则等于整个数据库pȝ被初始化?</p> <p> 如果用户希望在计机启动时自动自动启动动态服务器pȝQ请在系l初启文Ӟ在许多UNIXpȝ中ؓ/etc/rcQ中加入onstat命oQ不加Q何选项Q?<br /> "<br /> q一D中的所有的onstat均ؓoninit[/td][/tr][/table]<br /></p> <img src ="http://m.tkk7.com/fisher/aggbug/87081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/fisher/" target="_blank">Fisher</a> 2006-12-11 22:49 <a href="http://m.tkk7.com/fisher/articles/87081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://44168888.com" target="_blank">Ƶ</a>| <a href="http://nxeea.com" target="_blank">޾Ʒþþþþþ</a>| <a href="http://wwwdf221.com" target="_blank">һëƬ߹ۿվ</a>| <a href="http://d8139.com" target="_blank">þþž޾Ʒ</a>| <a href="http://svvnn.com" target="_blank">30Ů˺ѹۿ</a>| <a href="http://hjndgb.com" target="_blank">޹ƷþþžŴƬ </a>| <a href="http://cuuka.com" target="_blank">պɬɬҹ˽ӰԺ</a>| <a href="http://77sosoo.com" target="_blank">޹Ů߹ۿ</a>| <a href="http://ztxfkj.com" target="_blank">Ƶ߹ۿ </a>| <a href="http://449892.com" target="_blank">ŮƵƵȫƵ</a>| <a href="http://400209.com" target="_blank">ٶ100%ڵѹۿ</a>| <a href="http://ynxxrh.com" target="_blank">޾ƷŮþþ</a>| <a href="http://zjhydouyaji.com" target="_blank">һAV</a>| <a href="http://2023852.com" target="_blank">ղһ</a>| <a href="http://wanguoshan.com" target="_blank">69˾ƷƵ</a>| <a href="http://xyflash.com" target="_blank">ƷŮٸaѾþ</a>| <a href="http://22youjizz.com" target="_blank">ƷƵ</a>| <a href="http://nnlxl.com" target="_blank">˾Ʒҹapp</a>| <a href="http://kyqp0033.com" target="_blank">һƵ</a>| <a href="http://xingqiu1.com" target="_blank">þù˾Ʒ</a>| <a href="http://ybcin.com" target="_blank">޾Ʒ</a>| <a href="http://lshwork.com" target="_blank">aëƬѹۿ</a>| <a href="http://longcais.com" target="_blank">ҹþþþþþþõӰ</a>| <a href="http://87fulitv.com" target="_blank">+ɫ++</a>| <a href="http://nuosheying.com" target="_blank">99ƵƷƵ76</a>| <a href="http://m8va.com" target="_blank">ۺһ</a>| <a href="http://zblinghang.com" target="_blank">ĻmvֻѸ</a>| <a href="http://7299jj.com" target="_blank">ձһ߲Ͷ</a>| <a href="http://clever-ad.com" target="_blank">˸徫Ʒ</a>| <a href="http://jogador1.com" target="_blank">avѵӰ</a>| <a href="http://zbhongtai.com" target="_blank">ɫɫBwwW</a>| <a href="http://hbgksy.com" target="_blank">þþƷ޾Ʒ2020</a>| <a href="http://www-533999.com" target="_blank">޵һӰԺ</a>| <a href="http://www91v.com" target="_blank">ѹۿ91Ƶ</a>| <a href="http://34pmpm.com" target="_blank">޹Ƭ߹ۿ</a>| <a href="http://gzmandala.com" target="_blank">һAV</a>| <a href="http://tha2008.com" target="_blank">ձ˻ʿxxxxƵ</a>| <a href="http://jyd56.com" target="_blank">91Ʒѹ</a>| <a href="http://5gg1.com" target="_blank">еİjŽŮƵ</a>| <a href="http://liulaogendawutai.com" target="_blank">У԰޴ɫС˵ϼ</a>| <a href="http://sdzhly.com" 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>