??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产中文v高清在线观看,亚洲AV网站在线观看,亚洲国产成人一区二区精品区http://www.tkk7.com/hulizhong/category/38316.html----Java's Slave----<br> ***Java's Host***zh-cnFri, 04 Dec 2009 15:07:51 GMTFri, 04 Dec 2009 15:07:51 GMT60聚集索引和非聚集索引http://www.tkk7.com/hulizhong/archive/2009/12/04/304779.html二胡二胡Fri, 04 Dec 2009 07:19:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/12/04/304779.htmlhttp://www.tkk7.com/hulizhong/comments/304779.htmlhttp://www.tkk7.com/hulizhong/archive/2009/12/04/304779.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/304779.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/304779.html   聚集索引定表中数据的物理顺序。聚集烦(ch)引类g?sh)话,后者按姓氏排列数据。由于聚集烦(ch)引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集烦(ch)引。但该烦(ch)引可以包含多个列Q组合烦(ch)引)(j)Q就像电(sh)话簿按姓氏和名字q行l织一栗? 
   
  聚集索引对于那些l常要搜索范围值的列特别有效。用聚集烦(ch)引找到包含第一个值的行后Q便可以保包含后箋索引值的行在物理盔R。例如,如果应用E序执行的一个查询经常检索某一日期范围内的记录Q则使用聚集索引可以q速找到包含开始日期的行,然后(g)索表中所有相?c)行,直到到达l束日期。这h助于提高此类查询的性能。同P如果对从表中(g)索的数据q行排序时经常要用到某一列,则可以将该表在该列上聚集Q物理排序)(j)Q避免每ơ查询该列时都进行排序,从而节省成本? 
   
  当烦(ch)引值唯一Ӟ使用聚集索引查找特定的行也很有效率。例如,使用唯一雇员   ID   ?  emp_id   查找特定雇员的最快速的Ҏ(gu)Q是?  emp_id   列上创徏聚集索引?  PRIMARY   KEY   U束  
   
   
  使用非聚集烦(ch)? 
  非聚集烦(ch)引与课本中的索引cM。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位|。烦(ch)引中的项目按索引键值的序存储Q而表中的信息按另一U顺序存储(q可以由聚集索引规定Q。如果在表中未创集烦(ch)引,则无法保证这些行hM特定的顺序? 
   
  与用书中烦(ch)引的方式怼QMicrosoft&reg;   SQL   Server™   2000   在搜索数据值时Q先寚w聚集索引q行搜烦(ch)Q找到数据值在表中的位|,然后从该位置直接(g)索数据。这佉K聚集索引成ؓ(f)_匚w查询的最x(chng)法,因ؓ(f)索引包含描述查询所搜烦(ch)的数据值在表中的精位|的条目。如果基表用聚集烦(ch)引排序,则该位置集键|否则Q该位置为包含行的文件号、页号和槽号的行   ID   (RID)。例如,对于?  emp_id   列上有非聚集索引的表Q如要搜索其雇员   ID   (emp_id)QSQL   Server   ?x)在索引中查找这样一个条目,该条目精列出匹配的   emp_id   列在表中的页和行Q然后直接{到该该行?nbsp; 

-------------------------------------------------------分割U?------------------------------------------------------
        在工作中遇见?jin)SQL性能问题,最后在同事的帮助下解决?jin)此问?是通过?strong>聚集索引的方式解决的!
         原来的SQL中有如下的where语句:
         and  datediff(day, date1,'2009-1-01')<=

     and  datediff(day, date1,'2009-2-03')>=

        在date1Z(jin)聚集索引,SQL修改如下:
          and   date1>='2009-1-01'

     and  date1<='2009-2-03' 

         L?jin)datediff函数,因ؓ(f)用函数的话就不会(x)用到date1?strong>聚集索引! 在此记录一?以备后查!
    


二胡 2009-12-04 15:19 发表评论
]]>
(?SQL ?SET ?SELECT 有什么区别? http://www.tkk7.com/hulizhong/archive/2009/12/02/304533.html二胡二胡Wed, 02 Dec 2009 09:10:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/12/02/304533.htmlhttp://www.tkk7.com/hulizhong/comments/304533.htmlhttp://www.tkk7.com/hulizhong/archive/2009/12/02/304533.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/304533.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/304533.htmlSQL Server 中对已经定义的变量赋值的方式用两U,分别?SET ?SELECT?br /> 对于q两U方式的区别QSQL Server 联机丛书中已l有详细的说明,但很多时候我?br /> q没有注意,其实q两U方式还是有很多差别的?/p>

SQL Server推荐使用 SET 而不?SELECT 对变量进行赋倹{?br /> 当表辑ּq回一个值ƈ对一个变量进行赋值时Q推荐?SET Ҏ(gu)?/p>

下表列出 SET ?SELECT 的区别。请特别注意U色部分?

set select
同时对多个变量同时赋?/td> 不支?/td> 支持
表达式返回多个值时 出错 返回的最后一个Dl变?/font>
表达式未q回?/td> 变量被赋null?/td> 变量保持原?/font>

下面以具体示例来说明问题Q?/p>

create table chinadba1(
userid int ,
addr varchar(128)
)
go
insert into chinadba1(userid,addr) values(1,'addr1')
insert into chinadba1(userid,addr) values(2,'addr2')
insert into chinadba1(userid,addr) values(3,'addr3')
go

表达式返回多个值时Q?SET 赋?


declare @addr varchar(128)
set @addr = (select addr from chinadba1)
/*
--出错信息?br /> 服务? 消息 512Q?16Q状?1Q行 2
子查询返回的值多于一个。当子查询跟随在 =?=?lt;?lt;=?gt;?gt;= 之后Q或子查询用作表辑ּӞq种情况是不允许的?br /> */
go

表达式返回多个值时Q?SELECT 赋?

declare @addr varchar(128)
select @addr = addr from chinadba1
print @addr --l果集中最后一?addr 列的?br /> --l果: addr3
go

表达式未q回值时Q?SET 赋?

declare @addr varchar(128)
set @addr = '初始?
set @addr = (select addr from chinadba1 where userid = 4 )
print @addr --null?
go

表达式未q回值时Q?SELECT 赋?

declare @addr varchar(128)
set @addr = '初始?
select @addr = addr from chinadba1 where userid = 4
print @addr --保持原?br /> go

需要注意的是,SELECT 也可以将标量子查询的Dl变量,如果标量子查询不q回|则变量被|ؓ(f) null 倹{?br /> 此时?使用 SET 赋值是完全相同?br /> Ҏ(gu)量子查询的概念大家应该都觉得陌生QD个例子就能说?/p>

declare @addr varchar(128)
set @addr = '初始?
--select addr from chinadba1 where userid = 4 为标量子查询语句
select @addr = (select addr from chinadba1 where userid = 4)
print @addr --null?br /> go

转自Q?font face="Verdana">http://blog.csdn.net/shouyenet1/archive/2008/12/13/3511818.aspx



二胡 2009-12-02 17:10 发表评论
]]>
case的一个用?-case 嵌套http://www.tkk7.com/hulizhong/archive/2009/12/01/304396.html二胡二胡Tue, 01 Dec 2009 08:28:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/12/01/304396.htmlhttp://www.tkk7.com/hulizhong/comments/304396.htmlhttp://www.tkk7.com/hulizhong/archive/2009/12/01/304396.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/304396.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/304396.html     
    

在查询的时候,有这L(fng)一个需?br /> 数据库内容如下:(x)
iD  description

1     TableClassA.getName()
2     TableClassB.getName(),exception
3     TableClassC,getName()
4     TableClassD,getName().null

我想查询输入以下l果Q?br /> iD  description

1     TableClassA
2     TableClassB
3     TableClassC
4     TableClassD
?qing)查询的l果?h,前的内容
SQL如下

select id,
     case
    when (CHARINDEX(',',description)>0) and (CHARINDEX('.',description)>0)
     then --在这个做?jin)判?如同时包??则判??那个在前
      case 
       when CHARINDEX(',',description)>CHARINDEX('.',description) then left(description,CHARINDEX('.',description)-1)
       when CHARINDEX(',',description)<CHARINDEX('.',description) then left(description,CHARINDEX(',',description)-1)
      end
    when (CHARINDEX(',',description)>0) then left(description,CHARINDEX(',',description)-1)
    when (CHARINDEX('.',description)>0) then left(description,CHARINDEX('.',description)-1)
    else description
   end
   as description
  from  tablename



二胡 2009-12-01 16:28 发表评论
]]>
SQL字符串处理函数大?/title><link>http://www.tkk7.com/hulizhong/archive/2009/06/23/283666.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Tue, 23 Jun 2009 01:06:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/06/23/283666.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/283666.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/06/23/283666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/283666.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/283666.html</trackback:ping><description><![CDATA[?http://hi.baidu.com/buzhizhe/blog/item/0031c8178664420dc83d6d72.html<br /> <br /> select 字段1 from ? where 字段1.IndexOf("?)=1;<br /> q条语句不对的原因是indexofQ)(j)函数不是sql函数Q改成sql对应的函数就可以?jin)?br /> leftQ)(j)是sql函数?br /> select 字段1 from ? where charindexQ??,字段1Q?1; <div id="qdyioas" class="postbody" twffan="done"> <p>字符串函数对二进制数据、字W串和表辑ּ执行不同的运。此cdC用于CHAR、VARCHAR?BINARY?和VARBINARY 数据cd以及(qing)可以隐式转换为CHAR 或VARCHAR的数据类型。可以在SELECT 语句的SELECT 和W(xu)HERE 子句以及(qing)表达式中使用字符串函数?br /> 常用的字W串函数有:(x)<br /> <br /> <strong>一、字W{换函?/strong><br /> 1、ASCII()<br /> q回字符表达式最左端字符的ASCII 码倹{在ASCIIQ)(j)函数中,U数字的字符串可不用‘’括v来,但含其它字符的字W串必须?#8216;’括v来用,否则?x)出错?br /> 2、CHAR()<br /> ASCII 码{换ؓ(f)字符。如果没有输? ~ 255 之间的ASCII 码|CHARQ)(j) q回NULL ?br /> 3、LOWER()和UPPER()<br /> LOWER()字W串全部转ؓ(f)写QUPPER()字W串全部转ؓ(f)大写?br /> 4、STR()<br /> 把数值型数据转换为字W型数据?br /> STR (<float_expression>[Qlength[Q?<decimal>]])<br /> length 指定q回的字W串的长度,decimal 指定q回的小C数。如果没有指定长度,~省的length gؓ(f)10Q?decimal ~省gؓ(f)0?br /> 当length 或者decimal 值时Q返回NULLQ?br /> 当length 于数点左边(包括W号位)(j)的位数时Q返回length ?Q?br /> 先服从length Q再取decimal Q?br /> 当返回的字符串位数小于length Q左边补空根{?br /> <strong>二、去I格函数</strong><br /> 1、LTRIM() 把字W串头部的空格去掉?br /> <br /> 2、RTRIM() 把字W串N的空格去掉?br /> <br /> <strong>三、取子串函数</strong><br /> 1、left() <br /> LEFT (<character_expression>Q?<integer_expression>)<br /> q回character_expression 左v integer_expression 个字W?br /> <br /> 2、RIGHT() <br /> RIGHT (<character_expression>Q?<integer_expression>)<br /> q回character_expression 双v integer_expression 个字W?br /> <br /> 3、SUBSTRING()<br /> SUBSTRING (<expression>Q?<starting_ position>Q?length)<br /> q回从字W串左边Wstarting_ position 个字Wvlength个字W的部分?br /> <br /> <strong>四、字W串比较函数</strong><br /> 1、CHARINDEX()<br /> q回字符串中某个指定的子串出现的开始位|?br /> CHARINDEX (<’substring_expression’>Q?<expression>)<br /> 其中substring _expression 是所要查扄字符表达式,expression 可ؓ(f)字符串也可ؓ(f)列名表达式。如果没有发现子Ԍ则返? 倹{?br /> 此函C能用于TEXT 和IMAGE 数据cd?br /> 2、PATINDEX()<br /> q回字符串中某个指定的子串出现的开始位|?br /> PATINDEX (<’%substring _expression%’>Q?<column_ name>)其中子串表达式前后必L癑ֈ?#8220;%”否则q回gؓ(f)0?br /> 与CHARINDEX 函数不同的是QPATINDEX函数的子串中可以使用通配W,且此函数可用于CHAR?VARCHAR 和TEXT 数据cd?br /> <br /> <strong>五、字W串操作函数</strong><br /> 1、QUOTENAME()<br /> q回被特定字W括h的字W串?br /> QUOTENAME (<’character_expression’>[Q?quote_ character]) 其中quote_ character 标明括字W串所用的字符Q缺省gؓ(f)“[]”?br /> 2、REPLICATE()<br /> q回一个重复character_expression 指定ơ数的字W串?br /> REPLICATE (character_expression integer_expression) 如果integer_expression gؓ(f)负|则返回NULL ?br /> <br /> 3、REVERSE()<br /> 指定的字符串的字符排列序颠倒?br /> REVERSE (<character_expression>) 其中character_expression 可以是字W串、常数或一个列的倹{?br /> <br /> 4、REPLACE()<br /> q回被替换了(jin)指定子串的字W串?br /> REPLACE (<string_expression1>Q?<string_expression2>Q?<string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2?br /> <br /> 4、SPACE()<br /> q回一个有指定长度的空白字W串?br /> SPACE (<integer_expression>) 如果integer_expression gؓ(f)负|则返回NULL ?br /> <br /> 5、STUFF()<br /> 用另一子串替换字符串指定位|、长度的子串?br /> STUFF (<character_expression1>Q?<start_ position>Q?<length>Q?lt;character_expression2>)<br /> 如果起始位置或长度gؓ(f)负,或者v始位|大于character_expression1 的长度,则返回NULL 倹{?br /> 如果length 长度大于character_expression1 ?start_ position 以右的长度,则character_expression1 只保留首字符?br /> <strong>六、数据类型{换函?/strong><br /> 1、CAST()<br /> CAST (<expression> AS <data_ type>[ length ])<br /> <br /> 2、CONVERT()<br /> CONVERT (<data_ type>[ length ]Q?<expression> [Q?style])<br /> <br /> 1Qdata_type为SQL Serverpȝ定义的数据类型,用户自定义的数据cd不能在此使用?br /> 2Qlength用于指定数据的长度,~省gؓ(f)30?br /> 3Q把CHAR或VARCHARcd转换如INT或SAMLLINTq样的INTEGERcd、结果必L带正h负号的数倹{?br /> 4QTEXTcd到CHAR或VARCHARcd转换最多ؓ(f)8000个字W,即CHAR或VARCHAR数据cd是最大长度?br /> 5QIMAGEcd存储的数据{换到BINARY或VARBINARYcdQ最多ؓ(f)8000个字W?br /> 6Q把整数D{换ؓ(f)MONEY或SMALLMONEYcdQ按定义的国家的货币单位来处理,如h民币、美元、英镑等?br /> 7QBITcd的{换把非零D{换ؓ(f)1Qƈ仍以BITcd存储?br /> 8Q试图{换到不同长度的数据类型,?x)截短{换值ƈ在{换值后昄“+”Q以标识发生?jin)这U截断?br /> 9Q用CONVERTQ)(j)函数的style 选项能以不同的格式显C日期和旉。style 是将DATATIME 和SMALLDATETIME 数据转换为字W串时所选用的由SQL Server pȝ提供的{换样式编P不同的样式编h不同的输出格式?br /> <strong>七、日期函?/strong><br /> 1、day(date_expression) <br /> q回date_expression中的日期?br /> <br /> 2、month(date_expression)<br /> q回date_expression中的月䆾?br /> <br /> 3、year(date_expression)<br /> q回date_expression中的q䆾?br /> <br /> 4、DATEADD()<br /> DATEADD (<datepart>Q?<number>Q?<date>)<br /> q回指定日期date 加上指定的额外日期间隔number 产生的新日期?br /> 5、DATEDIFF()<br /> DATEDIFF (<datepart>Q?<date1>Q?<date2>)<br /> q回两个指定日期在datepart 斚w的不同之处,即date2 过date1的差距|其结果值是一个带有正负号的整数倹{?br /> <br /> 6、DATENAME()<br /> DATENAME (<datepart>Q?<date>)<br /> 以字W串的Ş式返回日期的指定部分此部分。由datepart 来指定?br /> <br /> 7、DATEPART()<br /> DATEPART (<datepart>Q?<date>)<br /> 以整数值的形式q回日期的指定部分。此部分由datepart 来指定?br /> DATEPART (ddQ?date) {同于DAY (date)<br /> DATEPART (mmQ?date) {同于MONTH (date)<br /> DATEPART (yyQ?date) {同于YEAR (date)<br /> <br /> 8、GETDATE()<br /> 以DATETIME 的缺省格式返回系l当前的日期和时间?/p> </div><img src ="http://www.tkk7.com/hulizhong/aggbug/283666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-06-23 09:06 <a href="http://www.tkk7.com/hulizhong/archive/2009/06/23/283666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver日期函数 http://www.tkk7.com/hulizhong/archive/2009/06/22/283541.html二胡二胡Mon, 22 Jun 2009 04:56:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/06/22/283541.htmlhttp://www.tkk7.com/hulizhong/comments/283541.htmlhttp://www.tkk7.com/hulizhong/archive/2009/06/22/283541.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/283541.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/283541.html

SQLServer旉日期函数详解,SQLServer,旉日期,

1.      当前pȝ日期、时?

        select getdate()

2. dateadd      在向指定日期加上一D|间的基础上,q回新的 datetime ?/font>

       例如Q向日期加上2?

       select dateadd(day,2,'2004-10-15')      --q回Q?004-10-17 00:00:00.000

3. datediff q回跨两个指定日期的日期和时间边界数?/font>

       select datediff(day,'2004-09-01','2004-09-18')       --q回Q?7

       select datediff(day,'2004-09-18','2004-09-01')       --q回Q?17

4. datepart q回代表指定日期的指定日期部分的整数?/font>

      SELECT DATEPART(month, '2004-10-15')      --q回 10

5. datename q回代表指定日期的指定日期部分的字符?/font>

       SELECT datename(weekday, '2004-10-15')      --q回Q星期五

6. day(), month(),year() --可以与datepart对照一?/font>

select 当前日期=convert(varchar(10),getdate(),120)

,当前旉=convert(varchar(8),getdate(),114)

select datename(dw,'2004-10-15')

select 本年W多周=datename(week,'2004-10-15')

          ,今天是周?datename(weekday,'2004-10-15')

函数 参数/功能

GetDate( )   q回pȝ目前的日期与旉

DateDiff (interval,date1,date2) 以interval 指定的方式,q回date2 与date1两个日期之间的差?

date2-date1

DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日?

DatePart (interval,date) q回日期date中,interval指定部分所对应的整数?

DateName (interval,date) q回日期date中,interval指定部分所对应的字W串名称

参数 interval的设定值如下:(x)

?~?写(Sql ServerQ?(Access ?ASP) 说明

Year Yy yyyy q?1753 ~ 9999

Quarter Qq q    ?1 ~ 4

Month Mm m    ? ~ 12

Day of year Dy y   一q的日数,一q中的第几日 1-366

Day Dd d    日,1-31

Weekday Dw w 一周的日数Q一周中的第几日 1-7

Week Wk ww   周,一q中的第几周 0 ~ 51

Hour Hh h    ? ~ 23

Minute Mi n   分钟0 ~ 59

Second Ss s U?0 ~ 59

Millisecond Ms - 毫秒 0 ~ 999

access ?asp 中用date()和now()取得pȝ日期旉Q其中DateDiff,DateAdd,DatePart也同是能用于

Access和asp中,q些函数的用法也cM

举例Q?/font>

1.GetDate() 用于sql server :select GetDate()

2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')q回gؓ(f) 514592 U?/font>

DateDiff('d','2005-07-20','2005-7-25 22:56:32')q回gؓ(f) 5 ?/font>

3.DatePart('w','2005-7-25 22:56:32')q回gؓ(f) 2 x(chng)期一(周日?Q周六ؓ(f)7)

DatePart('d','2005-7-25 22:56:32')q回gؓ(f) 25?5?/font>

DatePart('y','2005-7-25 22:56:32')q回gؓ(f) 206卌一q中W?06?/font>

DatePart('yyyy','2005-7-25 22:56:32')q回gؓ(f) 2005?005q?

具体的语法:(x)

日期函数用来操作DATETIME 和SMALLDATETIME cd的数据,执行术q算。与其它函数一P可以?/font>

Select 语句的Select 和W(xu)here 子句以及(qing)表达式中使用日期函数。其使用Ҏ(gu)如下Q?/font>

日期函数参数Q其中参C数应不同的函数而不同?/font>

·DAYQ)(j)

DAYQ)(j) 函数语法如下Q?/font>

DAY Q?lt;date_expression>Q?/font>

DAYQ)(j) 函数q回date_expression 中的日期倹{?/font>

·MONTHQ)(j)

MONTHQ)(j) 函数语法如下Q?/font>

MONTH (<date_expression>)

MONTHQ)(j) 函数q回date_expression 中的月䆾倹{?/font>

与DAYQ)(j) 函数不同的是QMONTHQ)(j) 函数的参Cؓ(f)整数Ӟ一律返回整数?Q即SQL Server 认ؓ(f)?/font>

?900 q? 月?/font>

·YEARQ)(j)

YEARQ)(j) 函数语法如下Q?/font>

YEAR Q?lt;date_expression>Q?/font>

YEARQ)(j) 函数q回date_expression 中的q䆾倹{?/font>

提醒Q在使用日期函数Ӟ其日期值应?753q到9999q之_(d)q是SQL Serverpȝ所能识别的日期?/font>

_(d)否则?x)出现错误?/font>

·DATEADDQ)(j)

DATEADDQ)(j) 函数语法如下Q?/font>

DATEADD Q?lt;datepart>Q?<number>Q?<date>Q?/font>

DATEADDQ)(j) 函数q回指定日期date 加上指定的额外日期间隔number 产生的新日期。参?#8220;datepart

” 在日期函Cl常被用,它用来指定构成日期类型数据的各组Ӟ如年、季、月、日、星期等?/font>

其取值如?-9 所C:(x)

·DATEDIFFQ)(j)

DATEDIFFQ)(j) 函数语法如下Q?/font>

DATEDIFFQ)(j) Q?lt;datepart>Q?<date1>Q?<date2>Q?/font>

DATEDIFFQ)(j) 函数q回两个指定日期在datepart 斚w的不同之处,即date2 过date1的差距|?/font>

l果值是一个带有正负号的整数倹{针对不同的datepartQ?DATEDIFFQ)(j)函数所允许的最大差距g

一P如:(x)datepart 为second ӞDATEDIFFQ)(j) 函数所允许的最大差距gؓ(f)68Q?qdatepart ?/font>

millisecond ӞDATEDIFFQ)(j) 函数所允许的最大差距gؓ(f)24 ?0 时30 ?3 U?47 毫秒?/font>

·DATENAMEQ)(j)

DATENAMEQ)(j) 函数语法如下Q?/font>

DATENAME Q?lt;datepart>Q?<dateQ?gt;

DATENAMEQ)(j) 函数以字W串的Ş式返回日期的指定部分此部分。由datepart 来指定?/font>

·DATEPARTQ)(j)

DATEPARTQ)(j) 函数语法如下Q?/font>

DATEPART Q?lt;datepart>Q?<date>Q?/font>

DATEPARTQ)(j) 函数以整数值的形式q回日期的指定部分。此部分由datepart 来指定?/font>

DATEPART QddQ?dateQ?{同于DAY QdateQ?/font>

DATEPART QmmQ?dateQ?{同于MONTH QdateQ?/font>

DATEPART QyyQ?dateQ?{同于YEAR QdateQ?/font>

·GETDATEQ)(j)

GETDATEQ)(j) 函数语法如下Q?/font>

GETDATEQ)(j)

GETDATEQ)(j) 函数以DATETIME 的缺省格式返回系l当前的日期和时_(d)它常作ؓ(f)其它函数或命令的?/font>

C用?

在开发数据库应用中,l常?x)遇到处理时间的问题Q如查询指定旉的记录等。下面就q些常见的问?/font>

Q结合自q一些经验,和大家探讨一下这c问题?

  首先介绍一下,SQL Server里处理时间的几个主要函数的用法:(x)

getdate()函数Q取得系l当前的日期和时间。返回gؓ(f)datetimecd的?

用法Qgetdate()

例子Q?

select getdate() as dte,dateadd(day,-1,getdate()) as nowdat

输出l果Q?

dte nowdat

1999-11-21 19:13:10.083 1999-11-20 19:13:10.083

(1 row(s) affected)

datepart()函数Q以整数的Ş式返回时间的指定部分?

用法Qdatepart(datepart,date)

参数说明Qdatepart时要q回的时间的部分Q常用取值year、month、day、hour、minute?

date是所指定的时间?

例子Q?

SELECT DATEPART(month, GETDATE()) AS 'Month Number'

输出l果Q?

Month Number

11

(1 row(s) affected)

dateadd()函数Q通过l指定的旉的指定部分加上一个整数gq回一个新旉倹{?

用法Qdateadd(datepart,number,date)

参数说明Qdatepart(同上Q?

date(同上)

number要增加的|整型Q可正可负,正D回date之后的时间|负D回date

之前的时间?

例子Q?

select getdate() as today

select dateadd(day,-1,getdate())

select dateadd(day,1,getdate())

输出Q?

today

1999-11-21 19:42:41.410

(1 row(s) affected)

yesterday

1999-11-20 19:42:41.410

(1 row(s) affected)

tomorrow

1999-11-22 19:42:41.410

(1 row(s) affected)

datediff()函数Q返回两个时间以指定旉部分来计的差倹{返回整数倹{如1991-6-12?991-6-21

之间以天

来算相差9?1998-6-12?999-6-23按年相?q_(d)1999-12-1?999-3-12按月相?个月

用法Qdatediff(darepart,date1,date2)

参数说明QdatepartQ同?

date1、date2(同上date)

例子Q?

select datediff(month,'1991-6-12','1992-6-21') as a



二胡 2009-06-22 12:56 发表评论
]]>
ER?/title><link>http://www.tkk7.com/hulizhong/archive/2009/05/14/270621.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 14 May 2009 07:47:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/05/14/270621.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/270621.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/05/14/270621.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/270621.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/270621.html</trackback:ping><description><![CDATA[        查询?jin)ER囄兌?如下:<br />         单说Ҏ(gu)代表实体Q椭圆代表属性;菱Ş框代表关pR?br />         下图是在|上扑ֈ?都是说是ER?它们有什么不?<br /> <img height="730" alt="" src="http://www.tkk7.com/images/blogjava_net/hulizhong/er.jpg" width="572" border="0" /><img src ="http://www.tkk7.com/hulizhong/aggbug/270621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-05-14 15:47 <a href="http://www.tkk7.com/hulizhong/archive/2009/05/14/270621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ER?/title><link>http://www.tkk7.com/hulizhong/archive/2009/05/14/270588.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Thu, 14 May 2009 05:50:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/05/14/270588.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/270588.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/05/14/270588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/270588.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/270588.html</trackback:ping><description><![CDATA[<span id="reply_content_62914559">单说Ҏ(gu)代表实体Q椭圆代表属性;菱Ş框代表关pR?/span><img src ="http://www.tkk7.com/hulizhong/aggbug/270588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-05-14 13:50 <a href="http://www.tkk7.com/hulizhong/archive/2009/05/14/270588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?五种提高 SQL 性能的方?/title><link>http://www.tkk7.com/hulizhong/archive/2009/05/10/269888.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Sun, 10 May 2009 05:14:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/05/10/269888.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/269888.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/05/10/269888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/269888.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/269888.html</trackback:ping><description><![CDATA[有时Q? Z(jin)让应用程序运行得更快Q所做的全部工作是在这里或那里做一些很调整。啊Q但关键在于定如何q行调整Q迟早?zhn)会(x)遇到这U情况:(x)应用E序中的 SQL 查询不能按照(zhn)想要的方式q行响应。它要么不返回数据,要么耗费的时间长得出奇。如果它降低?jin)报告或?zhn)的企业应用E序的速度Q用户必ȝ待的旉q长Q他 们就?x)很不满意。就像?zhn)的父母不惛_(zhn)解释ؓ(f)什么在深更半夜才回来一P用户也不?x)听你解释?f)什么查询耗费q么长时间。(“对不P妈妈Q我使用?jin)太多? LEFT JOIN?#8221;Q用户希望应用程序响应迅速,他们的报告能够在瞬间之内q回分析数据。就我自p言Q如果在 Web 上冲时某个面要耗费十多U才能加载(好吧Q五U更实际一些)(j)Q我也会(x)很不耐烦(ch)?<br /> <br /> Z(jin)解决q些问题Q重要的是找到问题的Ҏ(gu)。那么,从哪里开始呢Q根本原因通常在于数据库设计和讉K它的查询。在本月的专栏中Q我讲q四Ҏ(gu)术,q些技 术可用于提高Z SQL Server? 的应用程序的性能或改善其可׾~性。我仔l说?LEFT JOIN、CROSS JOIN 的用以? IDENTITY 值的(g)索。请CQ根本没有神奇的解决Ҏ(gu)。调整?zhn)的数据库及(qing)其查询需要占用时间、进行分析,q需要大量的试。这些技术都已被证明行之有效Q但Ҏ(gu)的应 用程序而言Q可能其中一些技术比另一些技术更适用?<br /> <br /> ?INSERT q回 IDENTITY <br /> 我决定从遇到许多问题的内容入手:(x)如何在执?SQL INSERT 后检?IDENTITY 倹{通常Q问题(sh)在于如何~写(g)索值的查询Q而在于在哪里以及(qing)何时q行(g)索。在 SQL Server 中,下面的语句可用于(g)索由最新在zd数据库连接上q行?SQL 语句所创徏?IDENTITY |(x) <br /> <br /> SELECT @@IDENTITYq个 SQL 语句q不复杂Q但需要记住的一Ҏ(gu)Q如果这个最新的 SQL 语句不是 INSERTQ或者?zhn)针对?INSERT SQL 的其他连接运行了(jin)?SQLQ则不会(x)获得期望的倹{?zhn)必须q行下列代码才能(g)索紧跟在 INSERT SQL 之后且位于同一q接上的 IDENTITYQ如下所C:(x) <br /> <br /> INSERT INTO Products (ProductName) VALUES ('Chalk') <br /> SELECT @@IDENTITY在一个连接上针对 Northwind 数据库运行这些查询将q回一个名UCؓ(f) Chalk 的新产品?IDENTITY 倹{所以,在?ADO ?Visual Basic? 应用E序中,可以q行以下语句Q?<br /> <br /> Set oRs = oCn.Execute("SET NOCOUNT ON;INSERT INTO Products _ <br /> (ProductName) VALUES ('Chalk');SELECT @@IDENTITY") <br /> lProductID = oRs(0)此代码告?SQL Server 不要q回查询的行计数Q然后执?INSERT 语句Qƈq回刚刚个新行创建的 IDENTITY 倹{SET NOCOUNT ON 语句表示q回的记录集有一行和一列,其中包含?jin)这个新? IDENTITY 倹{如果没有此语句Q则?x)首先返回一个空的记录集Q因?INSERT 语句不返回Q何数据)(j)Q然后会(x)q回W二个记录集Q第二个记录集中包含 IDENTITY 倹{这可能有些令h困惑Q尤其是因ؓ(f)(zhn)从来就没有希望q? INSERT ?x)返回记录集。之所以会(x)发生此情况,是因?SQL Server 看到?jin)这个行计数Q即一行受到媄(jing)响)(j)q将其解释ؓ(f)表示一个记录集。因此,真正的数据被推回C(jin)W二个记录集。当然?zhn)可以使?ADO 中的 NextRecordset Ҏ(gu)获取此第二个记录集,但如果总能够首先返回该记录集且只返回该记录集,则会(x)更方便,也更有效率?<br /> <br /> 此方法虽然有效,但需要在 SQL 语句中额外添加一些代码。获得相同结果的另一Ҏ(gu)是在 INSERT 之前使用 SET NOCOUNT ON 语句Qƈ?SELECT @@IDENTITY 语句攑֜表中?FOR INSERT 触发器中Q如下面的代码片D|C。这PMq入该表? INSERT 语句都将自动q回 IDENTITY 倹{?<br /> <br /> CREATE TRIGGER trProducts_Insert ON Products FOR INSERT AS <br />     SELECT @@IDENTITY <br /> GO <br /> 触发器只?Products 表上发生 INSERT 时启动,所以它L?x)在成?INSERT 之后q回一?IDENTITY。用此技术,(zhn)可以始l以相同的方式在应用E序中检?IDENTITY 倹{?<br /> <br /> 内嵌视图与(f)时表 <br /> 某些时候,查询需要将数据与其他一些可能只能通过执行 GROUP BY 然后执行标准查询才能攉的数据进行联接。例如,如果要查询最C个定单的有关信息Q?zhn)首先需要知道是哪些定单。这可以使用q回定单 ID ?SQL 查询来检索。此数据׃(x)存储在(f)时表Q这是一个常用技术)(j)中,然后?Products 表进行联接,以返回这些定单售出的产品数量Q?<br /> <br /> CREATE TABLE #Temp1 (OrderID INT NOT NULL, _ <br />                     OrderDate DATETIME NOT NULL) <br /> INSERT INTO #Temp1 (OrderID, OrderDate) <br /> SELECT    TOP 5 o.OrderID, o.OrderDate <br /> FROM Orders o ORDER BY o.OrderDate DESC <br /> SELECT    p.ProductName, SUM(od.Quantity) AS ProductQuantity <br /> FROM    #Temp1 t <br />     INNER JOIN [Order Details] od ON t.OrderID = od.OrderID <br />     INNER JOIN Products p ON od.ProductID = p.ProductID <br /> GROUP BY p.ProductName <br /> ORDER BY p.ProductName <br /> DROP TABLE #Temp1q些 SQL 语句?x)创Z个(f)时表Q将数据插入该表中,其他数据与该表q行联接Q然后除去该临时表。这?x)导致此查询q行大量 I/O 操作Q因此,可以重新~写查询Q用内嵌视囑֏代(f)时表。内嵌视囑֏是一个可以联接到 FROM 子句中的查询。所以,(zhn)不用在 tempdb 中的临时表上耗费大量 I/O 和磁盘访问,而可以用内嵌视囑־到同L(fng)l果Q?<br /> <br /> SELECT p.ProductName, <br />     SUM(od.Quantity) AS ProductQuantity <br /> FROM    ( <br />     SELECT TOP 5 o.OrderID, o.OrderDate <br />     FROM    Orders o <br />     ORDER BY o.OrderDate DESC <br />     ) t <br />     INNER JOIN [Order Details] od ON t.OrderID = od.OrderID <br />     INNER JOIN Products p ON od.ProductID = p.ProductID <br /> GROUP BY <br />     p.ProductName <br /> ORDER BY <br />     p.ProductName此查询不仅比前面的查询效率更高,而且长度更短。(f)时表?x)消耗大量资源。如果只需要将数据联接到其他查询,则可以试试用内嵌视图,以节省资源?<br /> <br /> 避免 LEFT JOIN ?NULL <br /> 当然Q有很多时候?zhn)需要执?LEFT JOIN 和?NULL 倹{但是,它们q不适用于所有情c(din)改?SQL 查询的构建方式可能会(x)产生一个花几分钟运行的报告~短到只花几U钟q样的天壤之别的效果。有Ӟ必须在查询中调整数据的Ş态,使之适应应用E序所要求? 昄方式。虽?TABLE 数据cd?x)减大量占用资源的情况Q但在查询中q有许多区域可以q行优化。SQL 的一个有价值的常用功能?LEFT JOIN。它可以用于(g)索第一个表中的所有行、第二个表中所有匹配的行、以?qing)第二个表中与第一个表不匹配的所有行。例如,如果希望q回每个客户?qing)其定单Q? 使用 LEFT JOIN 则可以显C有定单和没有定单的客户?<br /> <br /> 此工具可能会(x)被过度用。LEFT JOIN 消耗的资源非常之多Q因为它们包含与 NULLQ不存在Q数据匹配的数据。在某些情况下,q是不可避免的,但是代h(hun)可能非常高。LEFT JOIN ? INNER JOIN 消耗资源更多,所以如果?zhn)可以重新~写查询以得该查询不用Q?LEFT JOINQ则?x)得到非常可观的回报Q请参阅?1 中的图)(j)?<br /> <br /> ?1 查询 <br /> <br /> 加快使用 LEFT JOIN 的查询速度的一Ҏ(gu)术涉?qing)创Z? TABLE 数据cdQ插入第一个表QLEFT JOIN 左侧的表Q中的所有行Q然后用第二个表中的值更?TABLE 数据cd。此技术是一个两步的q程Q但与标准的 LEFT JOIN 相比Q可以节省大量时间。一个很好的规则是尝试各U不同的技术ƈ记录每种技术所需的时_(d)直到获得用于(zhn)的应用E序的执行性能最佳的查询?<br /> <br /> 试查询的速度Ӟ有必要多ơ运行此查询Q然后取一个^均倹{因为查询(或存储过E)(j)可能?x)存储?SQL Server 内存?sh)的q程~存?sh),因此W一ơ尝试耗费的时间好像稍长一些,而所有后l尝试耗费的时间都较短。另外,q行(zhn)的查询Ӟ可能正在针对相同的表q行其他? 询。当其他查询锁定和解锁这些表Ӟ可能?x)导致(zhn)的查询要排队{待。例如,如果(zhn)进行查询时某h正在更新此表中的数据Q则在更新提交时(zhn)的查询可能需要? Ҏ(gu)长时间来执行?<br /> <br /> 避免使用 LEFT JOIN 旉度降低的最单方法是可能多地围l它们设计数据库。例如,假设某一产品可能hcd也可能没有类别。如?Products 表存储了(jin)其类别的 IDQ而没有用于某个特定品的cdQ则(zhn)可以在字段中存?NULL 倹{然后?zhn)必须执?LEFT JOIN 来获取所有品及(qing)其类别。?zhn)可以创徏一个gؓ(f)“No Category”的类别,从而指定外键关pM允许 NULL 倹{通过执行上述操作Q现在?zhn)可以?INNER JOIN (g)索所有品及(qing)其类别了(jin)。虽然这看v来好像是一个带有多余数据的变通方法,但可能是一个很有h(hun)值的技术,因ؓ(f)它可以消?SQL 批处理语句中消耗资源较多的 LEFT JOIN。在数据库中全部使用此概念可以ؓ(f)(zhn)节省大量的处理旉。请CQ对于?zhn)的用戯(g)言Q即使几U钟的时间也非常重要Q因为当(zhn)有许多用户正在讉K? 一个联机数据库应用E序Ӟq几U钟实际上的意义?x)非帔R大?<br /> <br /> 灉|使用W卡?dng)乘U? <br /> 对于此技巧,我将q行非常详细的介l,q提倡在某些情况下用笛卡尔乘积。出于某些原因,W卡?dng)乘U?(CROSS JOIN) 遭到?jin)很多谴责,开发h员通常?x)被警告?gu)׃要用它们。在许多情况下,它们消耗的资源太多Q从而无法高效用。但是像 SQL 中的M工具一P如果正确使用Q它们也?x)很有h(hun)倹{例如,如果(zhn)想q行一个返回每月数据(即某一特定月䆾客户没有定单也要q回Q的查询Q?zhn)可以很? 便地使用W卡?dng)乘U??2 中的 SQL 执行了(jin)上述操作?<br /> <br /> 虽然q看h好像没什么神奇的Q但是请考虑一下,如果(zhn)从客户到定单(q些定单按月份进行分lƈ寚w售额q行计Q进行了(jin)标准?INNER JOINQ则只会(x)获得客户有定单的月䆾。因此,对于客户未订购Q何品的月䆾Q?zhn)不?x)获得 0 倹{如果?zhn)想?f)每个客户都绘制一个图Q以昄每个月和该月销售额Q则可能希望此图包括月销售额?0 的月份,以便直观标识?gu)些月份。如果?? 2 中的 SQLQ数据则?x)蟩q销售额?0 元的月份,因ؓ(f)在定单表中对于零销售额不会(x)包含M行(假设(zhn)只存储发生的事Ӟ(j)?<br /> <br /> ?3 中的代码虽然较长Q但是可以达到获取所有销售数据(甚至包括没有销售额的月份)(j)的目标。首先,它会(x)提取d所有月份的列表Q然后将它们攑օW一? TABLE 数据cd?(@tblMonths) 中。下一步,此代码会(x)获取在该旉D内有销售额的所有客户公司的名称列表Q然后将它们攑օ另一? TABLE 数据cd?(@tblCus-tomers) 中。这两个表存储了(jin)创徏l果集所必需的所有基本数据,但实际销售数量除外? W一个表中列Z(jin)所有月份(12 行)(j)Q第二个表中列出?jin)这个时间段内有销售额的所有客P对于我是 81 个)(j)。ƈ非每个客户在q去 12 个月中的每个月都购买?jin)品,所以,执行 INNER JOIN ?LEFT JOIN 不会(x)q回每个月的每个客户。这些操作只?x)返回购C品的客户和月份?<br /> <br /> W卡?dng)乘U则可以q回所有月份的所有客戗笛卡尔乘积基本上是第一个表与第二个表相乘,生成一个行集合Q其中包含第一个表中的行数与第二个表中的行数相 乘的l果。因此,W卡?dng)乘U会(x)向表 @tblFinal q回 972 行。最后的步骤是用此日期范围内每个客L(fng)月销售额总计更新 @tblFinal 表,以及(qing)选择最l的行集?<br /> <br /> 如果׃W卡?dng)乘U占用的资源可能?x)很多,而不需要真正的W卡?dng)乘U,则可以}慎地使用 CROSS JOIN。例如,如果对品和cd执行? CROSS JOINQ然后?WHERE 子句、DISTINCT ?GROUP BY 来筛选出大多数行Q那么?INNER JOIN ?x)获得同L(fng)l果Q而且效率高得多。如果需要ؓ(f)所有的可能性都q回数据Q例如在(zhn)希望用每月销售日期填充一个图表时Q,则笛卡尔乘积可能?x)非常有帮助? 但是Q?zhn)不应该将它们用于其他用途,因ؓ(f)在大多数Ҏ(gu)?INNER JOIN 的效率要高得多?<br /> <br /> N补零 <br /> q里介绍其他一些可帮助提高 SQL 查询效率的常用技术。假设?zhn)按区域?gu)有销售h员进行分lƈ他们的销售额q行计Q但是?zhn)只想要那些数据库中标Cؓ(f)处于zd状态的销售h员。?zhn)可以? 区域寚w售h员分l,q?HAVING 子句消除那些未处于活动状态的销售h员,也可以在 WHERE 子句中执行此操作。在 WHERE 子句中执行此操作?x)减需要分l的行数Q所以比?HAVING 子句中执行此操作效率更高。HAVING 子句中基于行的条件的{选会(x)强制查询寚w些在 WHERE 子句中会(x)被去除的数据q行分组?<br /> <br /> 另一个提高效率的技巧是使用 DISTINCT 关键字查找数据行的单独报表,来代替?GROUP BY 子句。在q种情况下,使用 DISTINCT 关键字的 SQL 效率更高。请在需要计聚合函敎ͼSUM、COUNT、MAX {)(j)的情况下再?GROUP BY。另外,如果(zhn)的查询L自己q回一个唯一的行Q则不要使用 DISTINCT 关键字。在q种情况下,DISTINCT 关键字只?x)增加系l开销?<br /> <br /> (zhn)已l看C(jin)Q有大量技术都可用于优化查询和实现特定的业务规则,技巧就是进行一些尝试,然后比较它们的性能。最重要的是要测试、测试、再试。在此专? 的将来各期内容中Q我l深入讲q?SQL Server 概念Q包括数据库设计、好的烦(ch)引实践以?SQL Server 安全范例?br />    ◆尽量不要在where中包含子查询;<br /> <br /> 关于旉的查询,量不要写成Qwhere to_char(dif_date,'yyyy-mm-dd')=to_char('2007-07-01','yyyy-mm-dd');<br /> <br /> ◆在qo(h)条g中,可以qo(h)掉最大数量记录的条g必须攑֜where子句的末?<br /> <br /> FROM子句中写在最后的?基础表,driving table)被最先处理,在FROM子句中包含多个表的情况下Q你必须选择记录条数最的表作为基表。如果有三个以上的连接查询,那就需要选择交叉? (intersection table)作ؓ(f)基础表,交叉表是指那个被其他表所引用的表;<br /> <br /> ◆采用绑定变?br /> <br /> ◆在WHERE中尽量不要用OR<br /> <br /> ◆用EXISTS替代IN、用NOT EXISTS替代NOT IN;<br /> <br /> ◆避免在索引列上使用计算QWHERE SAL*12>25000;<br /> <br /> ◆用IN来替代ORQ?WHERE LOC_ID=10 OR LOC_ID=15 OR LOC_ID=20<br /> <br /> ◆避免在索引列上使用IS NULL和IS NOT NULL;<br /> <br /> ◆L使用索引的第一个列;<br /> <br /> ◆用UNION-ALL替代UNION;<br /> <br /> ◆避免改变烦(ch)引列的类型:(x)SELECT...FROM EMP WHERE EMPNO='123'Q由于隐式数据类型{换,to_char(EMPNO)='123'Q因此,不采用索引Q一般在采用字符串拼凑动态SQL语句出现;<br /> <br /> ?!=' 不使用索引;<br /> <br /> ◆优化GROUP BY;<br /> <br /> ◆避免带有LIKE参数的通配W,LIKE '4YE%'使用索引Q但LIKE '%YE'不用烦(ch)?br /> <br /> ◆避免用困隄正规表达式,例如select * from customer where zipcode like "98___"Q即便在zipcode上徏立了(jin)索引Q在q种情况下也q是采用序扫描的方式。如果把语句Ҏ(gu)select * from customer where zipcode>"98000"Q在执行查询时就?x)利用?ch)引来查询Q显然会(x)大大提高速度;<br /> <br /> ◆尽量明的完成SQL语句Q尽量少让数据库工作。比如写SELECT语句Ӟ需要把查询的字D|指?gu)名。尽量不要用SELECT *语句。组lSQL语句的时候,量按照数据库的?fn)惯q行l织?img src ="http://www.tkk7.com/hulizhong/aggbug/269888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-05-10 13:14 <a href="http://www.tkk7.com/hulizhong/archive/2009/05/10/269888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?SQLQchar、varchar、text和nchar、nvarchar、ntext的区?http://www.tkk7.com/hulizhong/archive/2009/04/21/266664.html二胡二胡Tue, 21 Apr 2009 01:17:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/04/21/266664.htmlhttp://www.tkk7.com/hulizhong/comments/266664.htmlhttp://www.tkk7.com/hulizhong/archive/2009/04/21/266664.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/266664.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/266664.html
SQL中char、varchar、text和nchar、nvarchar、ntext的区?br />      1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率U高Q比如定义char(10)Q那么不Z存储的数据是否达C(jin)10个字节,都要占去10个字节的I间?br />      2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字D可能的值是不固定长度的Q我们只知道它不可能过10个字W,把它定义? VARCHAR(10)是最合算的。VARCHARcd的实际长度是它的值的实际长度+1。ؓ(f)什?#8220;+1”呢?q一个字节用于保存实际用了(jin)多大的长度?br />     从空间上考虑Q用varchar合适;从效率上考虑Q用char合适,关键是根据实际情冉|到权衡点?br />     3、TEXT。text存储可变长度的非Unicode数据Q最大长度ؓ(f)2^31-1(2,147,483,647)个字W?br />     4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了(jin)?#8220;N”。它表示存储的是Unicode数据cd的字W。我们知 道字W中Q英文字W只需要一个字节存储就_?jin),但汉字众多,需要两个字节存储,英文与汉字同时存在时Ҏ(gu)造成混ؕQUnicode字符集就是ؓ(f)?jin)解军_ W集q种不兼容的问题而生的Q它所有的字符都用两个字节表示Q即英文字符也是用两个字节表C。nchar、nvarchar的长度是??000? 间。和char、varchar比较hQnchar、nvarchar则最多存?000个字W,不论是英文还是汉字;而char、varchar最? 能存?000个英文,4000个汉字。可以看Z用nchar、nvarchar数据cd时不用担?j)输入的字符是英文还是汉字,较?f)方便Q但在存储英? 时数量上有些损失?br />      所以一般来_(d)如果含有中文字符Q用nchar/nvarcharQ如果纯英文和数字,用char/varchar?br />      如果是存储文章等大段内容的时候,U英文和数字Q用textQ含有中文字W的Q用ntext?



二胡 2009-04-21 09:17 发表评论
]]>
?select into ?insert into select 两种表复制语?/title><link>http://www.tkk7.com/hulizhong/archive/2009/04/20/266549.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Mon, 20 Apr 2009 05:56:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/04/20/266549.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/266549.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/04/20/266549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/266549.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/266549.html</trackback:ping><description><![CDATA[?http://www.cftea.com/c/2006/12/128KWTC67M14NQJD.asp<br /> <br /> <span style="color: blue">select</span> * <span style="color: blue">into</span> destTbl <span style="color: blue">from</span> srcTbl<br /> <span style="color: blue">insert</span> <span style="color: blue">into</span> destTbl(fld1, fld2) <span style="color: blue">selec</span>t fld1, 5 <span style="color: blue">from</span> srcTbl <p>以上两句都是?srcTbl 的数据插入到 destTblQ但两句又有区别的:(x)</p> <ul> <li>W一句(select into fromQ要求目标表QdestTblQ?span class="caution">不存?/span>Q因为在插入时会(x)自动创徏? <li>W二句(insert into select fromQ要求目标表QdestTblQ?span class="caution">存在</span>Q由于目标表已经存在Q所以我们除?jin)插入源表(srcTblQ的字段外,q?span class="caution">可以插入帔R</span>Q如例中的:(x)5?</li> </ul> <p>列出所有的表名:<br /> select name from sysobjects where type='u'<br /> <br /> 列出表中列名: <br /> select name from syscolumns where id=object_id(tablename)</p> <br /> 判断临时表是否存?br />  if   object_id('tempdb..#avg_tbl')   is  not null <br />     print 'yes'<br /> else<br />     print 'no'<br /> <br /><img src ="http://www.tkk7.com/hulizhong/aggbug/266549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-04-20 13:56 <a href="http://www.tkk7.com/hulizhong/archive/2009/04/20/266549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>? Oracle 10G -- Pl/sql 基础 http://www.tkk7.com/hulizhong/archive/2009/03/25/261824.html二胡二胡Wed, 25 Mar 2009 03:24:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/25/261824.htmlhttp://www.tkk7.com/hulizhong/comments/261824.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/25/261824.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/261824.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/261824.html

1.   ?/span>

1.1     l构

DECLARE -- 定义

BEGIN  -- 执行部分

EXCEPTION  -- 例外处理

END;  -- l束

 

set serveroutput on;
DECLARE v_ename VARCHAR2(
5 );
BEGIN
SELECT ename INTO v_ename FROM emp WHERE empno=&no;
dbms_output.put_line(
'¹ÍÔ±Ãû:' || v_ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line(
'please input correct employees no!' );
END;
/

 

1.2     块分c?/span>

<<outer>> <<inner>>

1.3     子程?/span>

1.1.1       q程

执行特定的操?/span>

  CREATE or replace PROCEDURE update_sal(nameVARCHAR2,newsal NUMBER)
IS
BEGIN
     UPDATE emp SET sal=newsal WHERE lower(ename)=lower(name);
END;
/

调用Q?/span>

exec update_sal( 'SMITH' , 10 )
call update_sal(
'SMITH' , 800 )

1.1.2       函数

q回特定数据

CREATE or replace FUNCTION annual_income(nameVARCHAR2)
RETURNNUMBERIS
       annual_salary NUMBER(
7 , 2 );
BEGIN
SELECT sal*
12 + nvl(comm, 0 )  into annual_salary FROM emp WHERE lower(ename)=lower(name);
RETURN annual_salary;
END;
/

调用 :

SQL> VAR income NUMBER

SQL> CALL annual_income('scott') INTO : income;

调用完成?/span>

SQL> print income

    INCOME

----------

     36000

1.1.3       ?/font>

逻辑l合相关的过E和函数

-- 包规?/span>
CREATE or replace PACKAGE emp_pkg IS
  PROCEDURE update_sal(nameVARCHAR2, newsal NUMBER);
  FUNCTION annual_income(nameVARCHAR2) RETURNNUMBER;
END;

-- 包体
CREATE or replace PACKAGE BODY emp_pkg IS
       PROCEDURE update_sal(nameVARCHAR2, newsal NUMBER)
       IS
       BEGIN
            UPDATE emp SET sal = newsal WHERE lower(ename) = lower(name);
       END;
      
       FUNCTION annual_income(nameVARCHAR2) RETURNNUMBER
       IS
         annual_salary NUMBER(
7 , 2 );
       BEGIN
            SELECT sal *
12 + nvl(comm, 0 ) into annual_salary FROM emp WHERE lower(ename) = lower(name);
            RETURN annual_salary;
       END;
END;
/

调用Q?/span>

SQL> call emp_pkg .update_sal('SMITH',1500);

Or

SQL> VAR income NUMBER

SQL> CALL emp_pkg . annual_income('scott') INTO : income;

调用完成?/span>

SQL> print income

    INCOME

----------

     36000

1.4     触发?/span>

     是隐含执行的存储q程?/span>

create or replace trigger update_cascade
 afterupdateof deptno on dept
 foreachrow
begin
     update emp set deptno=:new.deptno
     where deptno=:old.deptno;
end;
/    

2.   定义q用变?/span>

1.5     标量变量

1.1.4       Ҏ(gu)变量说明

LONG(32760 字节 ) ?/span> VARCHAR2(32767 字节 ) cMQ定义变长的字符?/span>

LONG RAW 用于定义变长的二q制数据 (32760 字节 )

BINARY_INTEGER 定义整数Q范围ؓ(f)Q?/span> -2147483647~2147483647 ( 非表列?/span> )

BOOLEAN ?/span> TRUE/FALSE/NULL ( 非表列?/span> )

BINARY_FLOAT/BINARY_DOUBLE Q?/span> ORACLE10 所?/span>

1.1.5       定义使用

Identifier [CONSTANT] datatype [not null] [:= | default expr]

例如Q?/span> v_valid BOOLEAN NOT NULL DEFAULT FALSE;

C_tax_rate CONSTANT NUMBER(3,2):=0.03;

V_ename emp.ename%TYPE;

1.6     复合变量

1.1.6       Pl/sql 记录

cM于高U语a中的l构

DECLARE
TYPE emp_record_type ISRECORD(
    name emp.ename%TYPE,
    salary emp.sal%TYPE,
  title emp.job%TYPE
);
emp_record emp_record_type;
BEGIN
     SELECT ename,sal,job INTO emp_record FROM emp WHERE empno=
7788 ;
     dbms_output.put_line(
' 雇员?/span> ' ||emp_record.name);
end;
/    

1.1.7       Pl/sql ?/span>

cM于高U语a中的数组Q下标可以ؓ(f)?/span> , 个数无限制?/span>

DECLARE
TYPE ename_table_type ISTABLEOF emp.ename%TYPE
     INDEXBYBINARY_INTEGER;
     ename_table ename_table_type;
BEGIN
     SELECT ename  INTO ename_table(-
1 ) FROM emp WHERE empno= 7788 ;
     dbms_output.put_line(
' 雇员?/span> ' ||ename_table(- 1 ));
end;
/    

1.1.8       嵌套?/font>

cM于高U语a中的数组Q下标不可以Q个数无限制?/span>

CREATE OR REPLACE TYPE emp_type  ASOBJECT(
       nameVARCHAR2(
10 ),
       salary NUMBER(
6 , 2 ),
       hiredate DATE
);
/
CREATEORREPLACETYPE emp_array ISTABLEOF emp_type;
/

CREATEORREPLACEtable department(
       deptno NUMBER(
2 ),
       dname VARCHAR2(
10 ),
       employee emp_array      
)nestedtable employee storeas employee;

 

1.1.9       VARRAY

VARRAY cM于嵌套表Q它可以作ؓ(f)表列和对象类型属性的数据cdQ个数有限制?/span>

CREATE OR REPLACE TYPE article_type  ASOBJECT(
       title VARCHAR2(
30 ),
       pubdate DATE
);
/
CREATEORREPLACETYPE article_array ISVARRAY(
20 ) OF article_type;
/

CREATEORREPLACEtable author(
       idNUMBER(
6 ),
       nameVARCHAR2(
10 ),
       article article_array      
);

1.7     参照变量

用于存放数值指针的变量。得应用程序共享相同对象,从而降低占用空间?/span>

1.1.10 REF CURSOR

游标变量

DECLARE
  TYPE c1 ISREFCURSOR;
  emp_cursor c1;
  v_ename emp.ename%TYPE;
  v_sal   emp.sal%TYPE;
BEGIN
  OPEN emp_cursor FOR
    SELECT ename, sal FROM emp ;
--WHERE deptno = 10;
  LOOP
    FETCH emp_cursor
      INTO v_ename, v_sal;
    EXITWHEN emp_cursor%NOTFOUND;
    dbms_output.put_line(v_ename);
  ENDLOOP;
  CLOSE emp_cursor;
END;
/

1.1.11 REF obj_type

Z(jin)׃n相同对象Q可以用 ref 引用对象cd?/span>

CREATE OR REPLACE TYPE home_type AS OBJECT(

       street VARCHAR2(50),city VARCHAR2(20),

       state VARCHAR2(20),zipcode VARCHAR2(6),

       owner VARCHAR2(10)

);

/

CREATE TABLE homes OF home_type;

INSERT INTO homes VALUES(' gu北\ 12 ?/span> ',' 呼和特 ',' 内蒙 ','010010',' 马鸣 ');

INSERT INTO homes VALUES(' gu北\ 13 ?/span> ',' 呼和特 ',' 内蒙 ','010010',' U斌 ');

CREATE TABLE person(

       id NUMBER(6) PRIMARY KEY,

       name VARCHAR2(10), addr REF home_type

);

INSERT INTO  person SELECT 1,' 马鸣 ',ref(p) FROM homes p WHERE p.owner=' 马鸣 ';

1.8     LOB 变量

内部 : CLOB ?/span> BLOB ?/span> NCLOB Q外部:(x) BFILE ?/span>

1.9     ?/span> PL/SQL 变量

1.1.12 使用 sql*plus 变量

var namevarchar2( 10 )
begin
     select ename into :namefrom emp
     where empno=
7788 ;
end;
/
print name  

 

1.1.13 使用 procedure Builder 变量

.createcharname length 10
begin
     select ename into :namefrom emp
     where empno=
7788 ;
end;
/
text_to.put_line(:name);  

1.1.14 使用 pro*c/c++ 变量

char name[ 10 ];
execsqlexecute
begin
     select ename into :namefrom emp
     where empno=
7788 ;
end-exec;
printf(
' 雇员名:(x) %s\n' ,name);



二胡 2009-03-25 11:24 发表评论
]]>
学习(fn)W记--PL/SQL入门http://www.tkk7.com/hulizhong/archive/2009/03/16/260061.html二胡二胡Mon, 16 Mar 2009 09:43:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/16/260061.htmlhttp://www.tkk7.com/hulizhong/comments/260061.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/16/260061.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/260061.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/260061.html    pl/sql代表面向q程化的语言与SQL语言的结合。在SQL语言中扩展了(jin)面向q程语言中用的E序l构?br />    *变量和类?br />    *控制语句和@?br />    *q程和函?br />    *对象cd和方?br />
PL/SQL的基本特点:(x)
   块结构:(x)
   PL/SQLE序的基本结构是块。所有的PLE序都是由块l成Q这些块可以互相{֥。通常Q程序中的每一块都实现一个逻辑操作Q从而把不同的Q务进行分剌Ӏ?br />     DECLARE
    /*
      declare variables,types,cursors and local  
       subprograms
     */
     BEGIN
     /*
      executable section
     */
     EXCEPTION
     /*
      exception -handling
     */
      END;
      执行部分是必ȝQ声明部分和异常处理部分是可选的。PL/SQL块采用这U分D늻构将E序不同功能各自独立出来?br />       变量和类?br />       信息在数据库与PL/SQLE序间通过变量q行传递的。变量是在PL/SQL块的生命部分定义的。变量还支持自定义的数据cdQ如记录cd{,使用用户自定义的数据cd可以让你定制E序中用的数据cdl构?br />        DECLARE
         TYPE T_stu  IS RECORD(
              firstname VARCHAR2(10)
          );
          v_student T_stu;
      游标
      游标是用来处理用SELECT语句从数据库中检琐到的多行记录的工具。数据库应用E序可以对一l记录逐个q行处理Q每ơ处理一行?br />        q程和函?br />        是PL/SQL块的一U特D类型,可以以编译的形式存放在数据库中,Z后的E序块调用?br />         ?br />         包有2部分l成Q说明部分和包体。一个包可以带有多个相关的过E?br />         动态SQL
        在运行期间构造ƈ执行SQL语句?br />         对象cdQoracle8上的版本Q?br />         由属性和Ҏ(gu)l成q可以存储在数据库表中?br />     
     


二胡 2009-03-16 17:43 发表评论
]]>
վ֩ģ壺 þ޹ƷAVϼ| һĹ˾| aaaƵѹۿ| ҹӰӴȫѹۿ| ޾ƷƷþ99| պһ234| ޳ɫۺվ| ޴߹ۿ| ޹һ߹ۿ| ɫһëƬѿ| 182tvƵ߹ۿ| ӰԺѹۿ| ɫˬƵ| ˳7777777| ޹ŮƷþ| 㽶Ƶһ| ձ߿Ƭ| ѹۿһƬ| ҹ717| һƵ| jizzѹۿƵ| ٺٺƵվ߹ۿ| ַѹۿ| ޳avѿ| ޹av߲| Ƶ߹ۿ| þҹҹ³³Ƭ| ŮɫëƬѿ| 337pձŷ޴| ޹Ů߹ۿ| һȫٸɫƬ| պ尡Ƶ߹ۿ| ձ߹ۿv| ަvþþ| ŷպĸwww777| ëƬؿ| ҪWWWѿƵ| ޾Ʒ| ޳a޳wwwţţ| þѾƷһ| ͹Ƶ|