SQL基礎(chǔ)知識(shí)大全_第1頁
SQL基礎(chǔ)知識(shí)大全_第2頁
SQL基礎(chǔ)知識(shí)大全_第3頁
SQL基礎(chǔ)知識(shí)大全_第4頁
SQL基礎(chǔ)知識(shí)大全_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

SQL基礎(chǔ)知識(shí)大全

SQL語言由命令、子句、運(yùn)算和集合函數(shù)等構(gòu)成。在SQL中,數(shù)據(jù)定義語言DDL(用來

建立及定義數(shù)據(jù)表、字段以及索引等數(shù)據(jù)庫結(jié)構(gòu))包含的命令有CREATE、DROP、ALTER;

數(shù)據(jù)操縱語言DML(用來提供數(shù)據(jù)的查詢、排序以及篩選數(shù)據(jù)等功能)包含的命令有

SELECT,INSERT.UPDATE>DELETE。

一、SQL語句

(1)Select查詢語句

語法:SELECT[ALLIDISTINCT]<目標(biāo)歹ij表達(dá)式〉[AS列名]

[,〈目標(biāo)列表達(dá)式〉IAS列名]...JFROMv表名〉I,〈表名

[WHERE(條件表達(dá)式>[ANDIOR〈條件表達(dá)式

[GROUPBY列名[HAVING<條件表達(dá)式

[ORDERBY歹?。菝跘SCIDESC]]

解釋:[ALLIDISTINCT]ALL:全部;DISTINCT:不包括重復(fù)行

〈目標(biāo)列表達(dá)式》對(duì)字段可使用AVG、COUNT、SUM、MIN、MAX、運(yùn)算符等

〈條件表達(dá)式>

查詢條件謂詞

IL斗父=、

確定范圍BETWEENAND.NOTBETWEENAND

確定集合IN、NOTIN

字符匹配LIKE("%”匹配任何長(zhǎng)度,“一”匹配一個(gè)字符)、NOTLIKE

空值ISNULL、ISNOTNULL

子查詢ANY、ALL、EXISTS

集合查詢UNION(并)、INTERSECT(交)、MINUS(差)

多重條件AND、OR、NOT

<GROUPBY列名〉對(duì)查詢結(jié)果分組

[HAVING〈條件表達(dá)式>]分組篩選條件

[ORDERBY列名[ASCIDESC]]對(duì)查詢結(jié)果排序;ASC:升序DESC:降序

例1:selectstudent.snoas學(xué)號(hào),as姓名,courseas課程名,scoreas成績(jī)from

score,studentwherestudent.sid=score.sidandscore.sid=:sid

例2:selectstudent.snoas學(xué)號(hào),as姓名,AVG(score)as平均分from

score,studentwherestudent.sid=score.sidandstudent.class=:classand(term=5orterm=6)group

bystudent.sno,havingcount(*)>0orderby平均分DESC

例3:select*fromscorewheresidlike'9634'

例4:select*fromstudentwhereclassin(selectclassfromstudentwherename='陳小小')

(2)INSERT插入語句

語法:INSERTINTO〈表名>[(<字段名1>[,〈字段名2>,...])]VALUES(〈常量1>[,<常量

2>,...])

語法:INSERTINTO(表名>[(V字段名1>[,<字段名2>,…])]子查詢

例子:INSERTINTO借書表(rid.bookidx.bdate)VALUES(edit1.text,edit2.text,date)

例子:INSERTINTOscorel(sno,name)SELECTsno,nameFROMstudentWHEREclass='9634’

(3)UPDATE-SQL

語法:UPDATE〈表名〉

SET列名1二常量表達(dá)式列名2=常量表達(dá)式2...]

WHEREv條件表達(dá)式,[ANDIOR〈條件表達(dá)式

例子:updatescoresetcredithour=4wherecourse:'數(shù)據(jù)庫,

(4)DELETE-SQL

語法:DELETEFROM〈表名〉[WHERE<條件表達(dá)式〉[ANDIOR<條件表達(dá)式>...]]

例子:Deletefromstudentwheresid=,OO310T

(5)CREATETABLE

CREATETABLEIDBFTableNamel[NAMELongTableName][FREE]

(FieldNamelFieldType[(nFieldWidth[,nPrecision])]

[NULLINOTNULL]

[CHECKlExpression1[ERRORcMessageTextl]]

[DEFAULTeExpression1]

[PRIMARYKEYIUNIQUE]

[REFERENCESTableName2[TAGTagNamel]]

[NOCPTRANS1

[,FieldName2...]

[,PRIMARYKEYeExpression2TAGTagName2

I,UNIQUEeExpression3TAGTagName3]

[,FOREIGNKEYeExpression4TAGTagName4[NODUP1

REFERENCESTableName3[TAGTagName5]]

[,CHECKlExpression2[ERRORcMessageText2]])

IFROMARRAYArrayName

(6)ALTERTABLE

ALTERTABLETableNamel

ADDIALTERLCOLUMNJFieldNamel

FieldType[(nFieldWidth[,nPrecision])]

[NULLINOTNULL]

[CHECKlExpression1[ERRORcMessageTextl]]

[DEFAULTeExpression1J

[PRIMARYKEYIUNIQUE]

[REFERENCESTableName2"AGTagName1JJ

[NOCPTRANS1

(7)DROPTABLE

DROPTABLE[路徑名.]表名

(8)CREATEINDEX

CREATEINDEXindex-nameONtable-name(column[,column...])

例:CREATEINDEXuspaON口令表(user,password)

(9)DROPINDEX

DROPINDEXtable-name.index-namelPRIMARY

例:DROPINDEX口令表.uspa

二、在程序中使用靜態(tài)SQL語句

在程序設(shè)計(jì)階段,將SQL命令文本作為TQuery組件的SQL屬性值設(shè)置。

三、在程序中使用動(dòng)態(tài)SQL語句

動(dòng)態(tài)SQL語句是指在SQL語句中包含有參數(shù)變量的SQL語句(如:select*fromstudent

whereclass=:class),在程序中可以為參數(shù)賦值。給參數(shù)賦值的方法有:

1、利用參數(shù)編輯器為參數(shù)賦值

選中TQuery組件,在對(duì)象監(jiān)視器01中點(diǎn)取Params項(xiàng),在彈出的參數(shù)編輯窗口中設(shè)置參

數(shù)的值。

例:SELECTbookidxAS書號(hào),藏書表.booknameAS書名,bdateAS借書日期FROM借書

表,藏書表where借書表.bookidx=藏書表.bookidxandrid=:rid

2、在程序運(yùn)行中通過程序?yàn)閰?shù)賦值

(1)根據(jù)參數(shù)在SQL語句中出現(xiàn)的順序,使用TQuery的Params屬性為參數(shù)賦值;

例:在借書表中插入?條記錄

withQuery1do

begin

SQL.clear;

SQL.add('InsertInto借書表(bookidx,rid,rdate)f);

SQLadd('Values(:bookidx,:rid,:rdate)');

Params[0J.AsString:=bookidxEdit.Text;

Params[1].AsString:=ridEdit.Text;

Paramsl2J.AsDate:=date;

ExecSQL;

End;

(2)根據(jù)SQL語句中的參數(shù)名字,調(diào)用ParamByName方法為參數(shù)賦值;

ParamByNameC^ookidx').AsString:=bookidxEdit.Text;

ParamByName(,rid,).AsString:=ridEdit.Text;

ParamByName('rdate').AsDate:=date;

ExecSQL;

有:AsString、AsSmalllnt、Aslnteger、AsWord、AsBoolean、AsFloat、AsCurrency、

AsBCD、AsDate、AsTime、AsDateTime轉(zhuǎn)換函數(shù)

3、使用數(shù)據(jù)源為參數(shù)賦值

把TQuery的DataSource屬性設(shè)置為另一個(gè)數(shù)據(jù)源(TDataSource名字),Delphi會(huì)把未賦

值的參數(shù)與指定的數(shù)據(jù)源中的各字段相比較,并將匹配的字段的值賦給未賦值的參數(shù),可實(shí)

現(xiàn)主表一明細(xì)表應(yīng)用。

四、對(duì)TQuery返回的數(shù)據(jù)集進(jìn)行修改

-一般情況下,TQuery返回的數(shù)據(jù)集是只讀的,不能修改;

對(duì)不包含集操作(如:SUM、COUNT)的單表SELECT查詢,設(shè)置TQuery的RequsetLive

屬性為True,則可修改TQuery返回的數(shù)據(jù)集。

var

I:Integer;

Listitem:string;

begin

forI:=0toQuery1.ParamCount-1do

begin

Listitem:=ListBoxl.Items[I];

caseQuery1.ParamsfI].DataTypeof

ftString:

Queryl.Params[I].AsString:=Listitem;

ftSmalllnt:

Queryl.Params[I].AsSmallInt:=StrToIntDef(ListItem,0);

ftlnteger:

Queryl.Params[I].AsInteger:=StrToIntDef(ListItem,0);

ftWord:

Query1.Params[I].AsWord:=StrToIntDef(ListItem,0);

f(Boolean:

begin

ifListitem=True'then

Queryl.Params[I].AsBoolean:=True

else

Query1.Params[I].AsBoolean:=False;

end;

ftFloat:

Queryl.Params[I].AsFloat:=StrToFloat(ListItem);

ftCurrency:

Query!.Params[IJ.AsCurrency:=StrToFloat(Listltem);

ftBCD:

Query1.Params[IJ.AsBCD:=StrToCurr(Listltem);

ftDate:

Queryl.Params[IJ.AsDate:=StrToDate(Listltem);

ftTime:

Query1.Params[IJ.AsTime:=StrToTime(Listltem);

ftDateTime:

QueryI.Params[I].AsDateTime:=StrToDateTime(Listltem);

end;

end;

end;

2003-11-259:59:00

查看評(píng)語???

2003-11-2510:06:20運(yùn)行期間對(duì)數(shù)據(jù)庫表的

一、數(shù)據(jù)集表的打開與關(guān)閉

打開:設(shè)置數(shù)據(jù)集組件的Active屬性為True或調(diào)用數(shù)據(jù)集組件的Open方法

關(guān)閉:設(shè)置數(shù)據(jù)集組件的Active屬性為False或調(diào)用數(shù)據(jù)集組件的Close方法

二、創(chuàng)建數(shù)據(jù)庫應(yīng)用程序

?利用向?qū)?chuàng)建:使用Database菜單/FormWizard選項(xiàng);

?創(chuàng)建主從表:設(shè)置從表的MasterSource、MaslerField屬性;

?創(chuàng)建查詢表:使用TQueiy組件;

三、數(shù)據(jù)庫表記錄的定位

?使用TDBNavigator組件;

?調(diào)用數(shù)據(jù)集組件的First、Next>Prior,Last方法;

?數(shù)據(jù)集組件的EOF屬性(或BOF屬性)用來判斷記錄指針是否指向第條記錄(或最后

一條記錄);

?使用數(shù)據(jù)集的書簽BookMark(GetBookMark:獲得當(dāng)前記錄的BookMark記號(hào):

GotoBookMark:從當(dāng)前記錄直接轉(zhuǎn)到指定BookMark的那條記錄;FreeBookMark:釋放某

個(gè)BookMark)

?使用GotoKeyFindKey方法查找記錄進(jìn)行定位;

四、數(shù)據(jù)庫表字段對(duì)象的使用

(1)創(chuàng)建永久的字段對(duì)象

雙擊或單擊再右擊TTable(TQuery)對(duì)象打開字段編輯器,使用其彈出菜單增加字段對(duì)象、

刪除字段對(duì)象、定義新的字段對(duì)象(字段編輯器的彈出菜單的NewFields選項(xiàng),可創(chuàng)建計(jì)

算字段);

(2)字段對(duì)象的屬性、方法、事件

字段對(duì)象名:如TablelName、Query1Sid

屬性:Alignment(對(duì)齊方式)、Calculated(是否是從其它字段值計(jì)算得到)、DisplayLabel

(顯示的標(biāo)題)、DisplayWidth(顯示的寬度)、DisplayFormat(顯示的格式)、EditMask(輸

入的限制)、FieldName(字段名)、Readonly(是否只讀)、Visible(是否顯示)

事件:OnChange(字段值發(fā)生變化時(shí)觸發(fā))、OnGetText(當(dāng)字段對(duì)象獲得字段值時(shí)觸發(fā))、

OnSetText(當(dāng)字段對(duì)象被設(shè)置字段值時(shí)觸發(fā))、OnValiData(當(dāng)修改、插入、進(jìn)行有效性檢

驗(yàn)時(shí)觸發(fā))

(3)字段對(duì)象的類型轉(zhuǎn)換

有:AsString、AsSmalllnt、Aslnteger、AsWord、AsBoolean、AsFloat、AsCurrency、

AsBCD、AsDate、AsTime、AsDateTime轉(zhuǎn)換函數(shù)

如:Edit1.Text:=Table1Name.Value;

Table1Bdate.AsString:=DateToStr(DATE);

(4)對(duì)字段對(duì)象的訪問

動(dòng)態(tài)字段對(duì)象的訪問:Tablel.Fields[O].DisplayLabel:=學(xué)生編號(hào)’

Table1.FieldByName('Sid)DisplayLabel:='學(xué)生編號(hào)'Table1.Fields[O].Assignment:=taCenter

Editl.Text:=Table1,FieldByName('Sid').AsString

永久字段對(duì)象的訪問:QuerylSid.DisplayLabel:=學(xué)生編號(hào)’

Query1Sid.DisplayWidth:=12

五、對(duì)數(shù)據(jù)庫表數(shù)據(jù)的操作方法

(1)訪問表中某一字段的數(shù)據(jù)的方法:

?Table1.FieldByName('bookidx').AsString

?Tablel.Field[O].AsInteger

?Tablel.Fieldvaluesf'bookidx'l

(2)數(shù)據(jù)庫表的一些屬性:

?當(dāng)前記錄號(hào):Table1.Recno

?記錄總數(shù):Table1.RecordCount

?得到表的字段名:TableLGetFiekiNames(ListBoxloItems)

(3)數(shù)據(jù)維護(hù)的方法:

?Edit方法:把數(shù)據(jù)集設(shè)置為編輯狀態(tài);

?Append方法:把數(shù)據(jù)集設(shè)置為插入狀態(tài)(最后);

?Insert方法:把數(shù)據(jù)集設(shè)置為插入狀態(tài)(當(dāng)前記錄后);

?Post方法:把修改的記錄寫回?cái)?shù)據(jù)集;

?Cancel方法:取消當(dāng)前的操作;

?Delete方法:刪除表中當(dāng)前記錄;

?AppendRecord方法:

?InsertRecord方法:tablel.InsertRecord(『963409',NIL,NIL,'考試']);

?SetRecords方法:

?Abort方法:取消各種方法的調(diào)用;

(4)輸入數(shù)據(jù)的合法性驗(yàn)證

對(duì)數(shù)據(jù)庫表建立合法性驗(yàn)證機(jī)制(如在DBD設(shè)置表的ValidityCheck、TableLookup>

ReferentialIntegrity等屬性);

?在字段編輯表FieldsEditor(雙擊Ttable對(duì)象),選擇字段,編寫其OnValidate事件,要求

非空可.設(shè)置其Required屬性為True;

?在程序中防止不合法輸入(如:使用TDBcombobox對(duì)象,TDBlookupcombobox對(duì)象);

六、數(shù)據(jù)檢索

(1)利用索引排序

如:TABLEI.IndexName:="uspa'或TABLEI.IndexFieldNames:='user_id'

(2)使用GotoKey方法查找數(shù)據(jù)庫中的記錄

?要求查找字段建立了索弓I,非主索引要設(shè)置Ttable對(duì)象的IndexName屬性。

?調(diào)用SetKey方法,把要查找的Ttable對(duì)象置成查找模塊;

?把查找值送進(jìn)被查找的Field的查找緩沖區(qū);

?調(diào)用Ttable對(duì)象的GotoKey方法,測(cè)試該方法的返回值判斷查找是否成功;

(3)使用FindKey方法查找數(shù)據(jù)庫中的記錄

把查找值作為參數(shù)傳遞給FindKey函數(shù),允許有多個(gè)查找值,要求把要查找的多個(gè)字段的

索引名賦給Ttable對(duì)象的IndexName屬性;

(4)不精確查找

GotoNearest方法

FindNearest方法

(5)使用Locate方法查找數(shù)據(jù)庫中的記錄(不用建索引)

table1.locale('字段名1;字段名2',VarArroyof(「值1',,值2']),[LoCaselnsensitive,

LoPartialKey])

LoCaselnsensitive:忽略大小寫;loPartialKey:不精確查找

(6)設(shè)定查找范圍的方法

SetRangeStart>SetRangeEnd、EditRangeStart、EditRangeEnd、SetRange([StartValues],[End

Value])>ApplyRange、CancelRange

(7)用TQuery組件的動(dòng)態(tài)SQL語句進(jìn)行查找

七、修改數(shù)據(jù)庫中的記錄

在程序中對(duì)數(shù)據(jù)庫記錄進(jìn)行操作可按下列的步驟進(jìn)行:

(1)移動(dòng)數(shù)據(jù)指針到要修改的記錄;

(2)調(diào)用Edit方法將Ttable組件設(shè)置成編輯狀態(tài);

(3)修改字段值;(Tablel.Fieldvalues「字段名']:=值、TableLField[O].AsString:=值)

(4)可用Nil對(duì)字段賦空值;

(5)調(diào)用Post方法將修改后的記錄寫入數(shù)據(jù)庫;

八、插入和刪除記錄

刪除:移動(dòng)指針到相應(yīng)記錄處,調(diào)用Delete方法;

插入:調(diào)用Insert,InsertRecord方法(當(dāng)前記錄處插入)或Append、InsertRecord方法(表

的末尾插入);

2003-11-2510:11:12動(dòng)態(tài)的添加PARADOX表的方法【王寒松】下面給出的函數(shù)

AddMasterPassword完成添加PARADOX表主口令的工作

AddMasterPassword(Table1,'MyNewPassword')

procedureAddMasterPassword(Table:Tlable;pswd:string);

const

RESTRUCTURE_TRUE=WordBool(l);

var

TblDesc:CRTblDesc;

hDb:hDBIDb;

begin

{表打開?表是獨(dú)占嗎?}

if(Table.Active=False)or(Table.Exclusive=False)then

raiseEDatabaseError.CreateC數(shù)據(jù)表必須在獨(dú)占方式才可以添加口令');

{初始化表描述區(qū)}

FillChar(TblDesc,SizeOf(CRTblDesc),0);

withTblDescdo

begin

{把表名放到描述區(qū)}

StrPCopy(szTblName,Table.TableName);

{把表類型放到描述區(qū)}

StrCopy(szTblType,szPARADOX);

StrPCopy(szPassword,pswd);

{設(shè)置BPROTECTED為TRUE}

bProtected:=RESTRUCTURE_TRUE;

end;

{從當(dāng)前的HANDLE里得至ljDATABASE的HANDLE}

Check(DbiGetObjFromObj(hDBIObj(Table.Handle),objDATABASE,hDBIObj(hDb)));

{關(guān)閉表}

Table.Close;

{添加主口令到PARADOX表里}

Check(DbiDoRestructure(hDb,1,@TblDesc,nil,nil,nil,FALSE));

{添加一個(gè)新口令到SESSION}

Session.AddPassword(pswd);

{重新打開表}

Table.Open;

end;

添加副口令的辦法與此類似

2003-11-2511:21:29如何選擇一個(gè)好的數(shù)據(jù)庫【三大數(shù)據(jù)庫比較】

【開放性】

SQLServer

只能在windows上運(yùn)行,沒有絲毫的開放性,操作系統(tǒng)的系統(tǒng)的穩(wěn)定對(duì)數(shù)據(jù)庫是十分重

要的。Windows9X系列產(chǎn)品是偏重于桌面應(yīng)用,NTserver只適合中小型企業(yè)。而且windows

平臺(tái)的可靠性,安全性和伸縮性是非常有限的。它不象unix那樣久經(jīng)考驗(yàn),尤其是在處理

大數(shù)據(jù)量的關(guān)鍵業(yè)務(wù)時(shí).

Oracle

能在所有主流平臺(tái)上運(yùn)行(包括windows)o完全支持所有的工業(yè)標(biāo)準(zhǔn)。采用完全開放策

略??梢允箍蛻暨x擇最適合的解決方案。對(duì)開發(fā)商全力支持。

DB2

能在所有主流平臺(tái)上運(yùn)行(包括windows)o最適于海量數(shù)據(jù)。DB2在企業(yè)級(jí)的應(yīng)用最為

廣泛,在全球的500家最大的企業(yè)中JL乎85%以上用DB2數(shù)據(jù)庫服務(wù)器,而國內(nèi)到97年約占

5%.

【可伸縮性,并行性】

SQLserver

并行實(shí)施和共存模型并不成熟。很難處理日益增多的用戶數(shù)和數(shù)據(jù)卷。伸縮性有限。

Oracle

平行服務(wù)器通過使一組結(jié)點(diǎn)共享同一簇中的工作來擴(kuò)展windownt的能力,提供高可用性和

高伸縮性的簇的解決方案。如果WindowsNT不能滿足需要,用戶可以把數(shù)據(jù)庫移到UNIX

中。

DB2

DB2具有很好的并行性。DB2把數(shù)據(jù)庫管理擴(kuò)充到了并行的、多節(jié)點(diǎn)的環(huán)境.數(shù)據(jù)庫分區(qū)

是數(shù)據(jù)庫的一部分,包含自己的數(shù)據(jù)、索引、配置文件、和事務(wù)日志。數(shù)據(jù)庫分區(qū)有時(shí)被稱

為節(jié)點(diǎn)或數(shù)據(jù)庫節(jié)點(diǎn)

【安全性】

SQLserver

沒有獲得任何安全證書。

OracleServer

獲得最高認(rèn)證級(jí)別的ISO標(biāo)準(zhǔn)認(rèn)證。

DB2

獲得最高認(rèn)證級(jí)別的ISO標(biāo)準(zhǔn)認(rèn)證。

【性能】

SQLServer

多用戶時(shí)性能不佳

Oracle

性能最高,保持WindowsNT下的TPC-D和TPC-C的世界記錄。

DB2

適用于數(shù)據(jù)倉庫和在線事物處理,性能較高。

【客戶端支持及應(yīng)用模式】

SQLServer

C/S結(jié)構(gòu),只支持windows客戶,可以用ADO,DAO,OLEDB,ODBC連接.

Oracle

多層次網(wǎng)絡(luò)計(jì)算,支持多種工業(yè)標(biāo)準(zhǔn),可以用ODBC,JDBC,OCI等網(wǎng)絡(luò)客戶連接

DB2

跨平臺(tái),多層結(jié)構(gòu),支持ODBC,JDBC等客戶

【操作簡(jiǎn)便】

SQLServer

操作簡(jiǎn)單,但只有圖形界面.

Oracle

較復(fù)雜,同時(shí)提供GUI和命令行,在WindowsNT和unix下操作相同

DB2

操作簡(jiǎn)單,同時(shí)提供GUI和命令行,在WindowsNT和unix下操作相同

【使用風(fēng)險(xiǎn)】

SQLserver

完全重寫的代碼,經(jīng)歷了長(zhǎng)期的測(cè)試,不斷延遲,許多功能需要時(shí)間來證明。并不十分兼

容早期產(chǎn)品。使用需要冒一定風(fēng)險(xiǎn)。

Oracle

長(zhǎng)時(shí)間的開發(fā)經(jīng)驗(yàn),完全向下兼容。得到廣泛的應(yīng)用。完全沒有風(fēng)險(xiǎn)。

DB2

在巨型企業(yè)得到廣泛的應(yīng)用,向下兼容性好。風(fēng)險(xiǎn)小。

2003-11-2511:25:37SQL查詢語句使用一、簡(jiǎn)單查詢

簡(jiǎn)單的Transact-SQL查詢只包括選擇列表、FROM子句和WHERE子句。它們分別說明所

查詢列、查詢的表或視圖、以及搜索條件等。

例如,卜.面的語句查詢testtable表中姓名為“張三”的nickname字段和email字段。

SELECTnickname,email

FROMtesttable

WHEREname='張三'

(一?)選擇列表

選擇列表(select」ist)指包所查詢列,它可以是一組列名列表、星號(hào)、表達(dá)式、變量(包括局

部變量和全局變量)等構(gòu)成。

1、選擇所有列

例如,下面語句顯示testtable表中所有列的數(shù)據(jù):

SELECT*

FROMtesttable

2、選擇部分列并指定它們的顯示次序

查詢結(jié)果集合中數(shù)據(jù)的排列順序與選擇列表中所指定的列名排列順序相同。

例如:

SELECTnickname,email

FROMtesttable

3、更改列標(biāo)題

在選擇列表中,可重新指定列標(biāo)題。定義格式為:

列標(biāo)題=列名

列名列標(biāo)題

如果指定的列標(biāo)題不是標(biāo)準(zhǔn)的標(biāo)識(shí)符格式時(shí),應(yīng)使用引號(hào)定界符,例如,下列語句使用漢

字顯示列標(biāo)題:

SELECT昵稱=nickname,電子郵V^email

FROMtesttable

4、刪除重復(fù)行

SELECT語句中使用ALL或DISTINCT選項(xiàng)來顯示表中符合條件的所有行或刪除其中重

復(fù)的數(shù)據(jù)行,默認(rèn)為ALL。使用DISTINCT選項(xiàng)時(shí),對(duì)于所有重復(fù)的數(shù)據(jù)行在SELECT返

回的結(jié)果集合中只保留一行。

5、限制返回的行數(shù)

使用TOPn[PERCENT]選項(xiàng)限制返回的數(shù)據(jù)行數(shù),TOPn說明返回n行,而TOPn

PERCENT時(shí),說明n是表示一百分?jǐn)?shù),指定返回的行數(shù)等于總行數(shù)的百分之幾。

例如:

SELECTTOP2*

FROMtesttable

SELECTTOP20PERCENT*

FROMtesttable

(-)FROM子句

FROM子句指定SELECT語句查詢及與查詢相關(guān)的表或視圖。在FROM子句中最多可指

定256個(gè)表或視圖,它們之間用逗號(hào)分隔。

在FROM子句同時(shí)指定多個(gè)表或視圖時(shí),如果選擇列表中存在同名列,這時(shí)應(yīng)使用對(duì)象

名限定這些列所屬的表或視圖。例如在usertable和citytable表中同時(shí)存在cityid列,在查詢

兩個(gè)表中的cityid時(shí)應(yīng)使用下面語句格式加以限定:

SELECTusername,citytable.cityid

FROMusertable,citytable

WHEREusertable.cityid=citytable.cityid

在FROM子句中可用以下兩種格式為表或視圖指定別名:

表名as別名

表名別名

例如上面語句可用表的別名格式表示為:

SELECTusername,b.cityid

FROMusertablea,citytableb

WHEREa.cityid=b.cityid

SELECT不僅能從表或視圖中檢索數(shù)據(jù),它還能夠從其它查詢語句所返回的結(jié)果集合中查

詢數(shù)據(jù)。

例如:

SELECTa.au_fname+a.au_lname

FROMauthorsa,titleauthorta

(SELECTtitleJd,title

FROMtitles

WHEREytd_sales>10000

)ASt

WHEREa.au_id=ta.au_id

ANDta.title_id=t.title_id

此例中,將SELECT返回的結(jié)果集合給予一別名t,然后再從中檢索數(shù)據(jù)。

(三)使用WHERE子句設(shè)置查詢條件

WHERE子句設(shè)置查詢條件,過濾掉不需要的數(shù)據(jù)行。例如下面語句查詢年齡大于20的

數(shù)據(jù):

SELECT*

FROMusertable

WHEREage>20

WHERE子句可包括各種條件運(yùn)算符:

比較運(yùn)算符(大小比較):>、>=、=、<、<=、<>、!>、?。?/p>

范圍運(yùn)算符(表達(dá)式值是否在指定的范圍):BETWEEN...AND...

NOTBETWEEN...AND...

列表運(yùn)算符(判斷表達(dá)式是否為列表中的指定項(xiàng)):IN(項(xiàng)1,項(xiàng)2……)

NOTIN(項(xiàng)1,項(xiàng)2.......)

模式匹配符(判斷值是否與指定的字符通配格式相符):LIKE、NOTLIKE

空值判斷符(判斷表達(dá)式是否為空):ISNULL、NOTISNULL

邏輯運(yùn)算符(用于多條件的邏輯連接):NOT,AND、OR

1、范圍運(yùn)算符例:ageBETWEEN10AND30相當(dāng)于age>=10ANDagev=30

2^列表運(yùn)算符例:countryIN('Germany','China')

3、模式匹配符例:常用于模糊查找,它判斷列值是否與指定的字符串格式相匹配。可用

于char、varchar、text>ntext、datetime和smalldatetime等類型查詢。

可使用以下通配字符:

百分號(hào)%:可匹配任意類型和長(zhǎng)度的字符,如果是中文,請(qǐng)使用兩個(gè)百分號(hào)即%%。

下劃線二匹配單個(gè)任意字符,它常用來限制表達(dá)式的字符長(zhǎng)度。

方括號(hào)口:指定一個(gè)字符、字符串或范圍,要求所匹配對(duì)象為它們中的任一個(gè)。

ri:其取值也口相同,但它要求所匹配對(duì)象為指定字符以外的任?個(gè)字符。

例如:

限制以Publishing結(jié)尾,使用LIKE%Publishing'

限制以A開頭:LIKE'[A]%,

限制以A開頭外:LIKE'[AA]%'

4、空值判斷符例WHEREageISNULL

5、邏輯運(yùn)算符:優(yōu)先級(jí)為NOT、AND、OR

(四)查詢結(jié)果排序

使用ORDERBY子句對(duì)查詢返回的結(jié)果按?;蚨嗔信判?。ORDERBY子句的語法格式

為:

ORDERBY{column_name[ASCIDESCJ}

其中ASC表示升序,為默認(rèn)值,DESC為降序。ORDERBY不能按ntext,text和image

數(shù)據(jù)類型進(jìn)行排序。

例如:

SELECT*

FROMusertable

ORDERBYagedesc,useridASC

另外,可以根據(jù)表達(dá)式進(jìn)行排序。

二、聯(lián)合查詢

UNION運(yùn)算符可以將兩個(gè)或兩個(gè)以上上SELECT語句的查詢結(jié)果集合合并成一個(gè)結(jié)果集

合顯示,即執(zhí)行聯(lián)合查詢。UNION的語法格式為:

select_statement

UNION[ALL]selectstatement

[UNION[ALLJselectstatement][...nJ

其中selectstatement為待聯(lián)合的SELECT查詢語句。

ALL選項(xiàng)表示將所有行合并到結(jié)果集合中。不指定該項(xiàng)時(shí),被聯(lián)合查詢結(jié)果集合中的重復(fù)

行將只保留一行。

聯(lián)合查詢時(shí),查詢結(jié)果的列標(biāo)題為第一個(gè)查詢語句的列標(biāo)題。因此,要定義列標(biāo)題必須在

第一個(gè)查詢語句中定義。要對(duì)聯(lián)合查詢結(jié)果排序時(shí),也必須使用第一查詢語句中的列名、列

標(biāo)題或者列序號(hào)。

在使用UNION運(yùn)算符時(shí),應(yīng)保證每個(gè)聯(lián)合查詢語句的選擇列表中有相同數(shù)量的表達(dá)式,

并且每個(gè)查詢選擇表達(dá)式應(yīng)具有相同的數(shù)據(jù)類型,或是可以自動(dòng)將它們轉(zhuǎn)換為相同的數(shù)據(jù)類

型。在自動(dòng)轉(zhuǎn)換時(shí),對(duì)于數(shù)值類型,系統(tǒng)將低精度的數(shù)據(jù)類型轉(zhuǎn)換為高精度的數(shù)據(jù)類型。

在包括多個(gè)查詢的UNION語句中,其執(zhí)行順序是自左至右,使用括號(hào)可以改變這--執(zhí)行

順序。例如:

查詢1UNION(查詢2UNION查詢3)

三、連接查詢

通過連接運(yùn)算符可以實(shí)現(xiàn)多個(gè)表查詢。連接是關(guān)系數(shù)據(jù)庫模型的主要特點(diǎn),也是它區(qū)別于

其它類型數(shù)據(jù)庫管理系統(tǒng)的一個(gè)標(biāo)志。

在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,表建立時(shí)各數(shù)據(jù)之間的關(guān)系不必確定,常把一個(gè)實(shí)體的所有信

息存放在一個(gè)表中。當(dāng)檢索數(shù)據(jù)時(shí),通過連接操作查詢出存放在多個(gè)表中的不同實(shí)體的信息。

連接操作給用戶帶來很大的靈活性,他們可以在任何時(shí)候增加新的數(shù)據(jù)類型。為不同實(shí)體創(chuàng)

建新的表,爾后通過連接進(jìn)行查詢。

連接可以在SELECT語句的FROM子句或WHERE子句中建立,似是而非在FROM子句

中指出連接時(shí)有助于將連接操作與WHERE子句中的搜索條件區(qū)分開來。所以,在

Transact-SQL中推薦使用這種方法。

SQL-92標(biāo)準(zhǔn)所定義的FROM子句的連接語法格式為:

FROMjoin_tablejoin_typejoin_table

[ON(join_condition)]

其中join_table指出參與連接操作的表名,連接可以對(duì)同一個(gè)表操作,也可以對(duì)多表操作,

對(duì)同一個(gè)表操作的連接又稱做自連接。

join_type指出連接類型,可分為三種:內(nèi)連接、外連接和交叉連接。內(nèi)連接(INNERJOIN)

使用比較運(yùn)算符進(jìn)行表間某(些)列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)

據(jù)行。根據(jù)所使用的比較方式不同,內(nèi)連接又分為等值連接、自然連接和不等連接三種。

外連接分為左外連接(LEFTOUTERJOIN或LEFTJOIN)、右外連接(RIGHTOUTERJOIN

或RIGHTJOIN)和全外連接(FULLOUTERJOIN或FULLJOIN)三種。與內(nèi)連接不同的是,

外連接不只列出與連接條件相匹配的行,而是列出左表(左外連接時(shí))、右表(右外連接時(shí))或

兩個(gè)表(全外連接時(shí))中所有符合搜索條件的數(shù)據(jù)行。

交叉連接(CROSSJOIN)沒有WHERE子句,它返回連接表中所有數(shù)據(jù)行的笛卡爾積,其

結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢

條件的數(shù)據(jù)行數(shù)。

連接操作中的ON(join_condition)子句指出連接條件,它山被連接表中的列和比較運(yùn)算

符、邏輯運(yùn)算符等構(gòu)成。

無論哪種連接都不能對(duì)text、ntext和image數(shù)據(jù)類型列進(jìn)行直接連接,但可以對(duì)這三種列

進(jìn)行間接連接。例如:

SELECTp1,pub_id,p2.pub_id,p1.pr_info

FROMpubjnfoASplINNERJOINpubjnfoASp2

ONDATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

(一)內(nèi)連接

內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行,它使用比較運(yùn)算符比較被連接列的列值。

內(nèi)連接分三種:

1、等值連接:在連接條件中使用等于號(hào)(=)運(yùn)算符比較被連接列的列值,其查詢結(jié)果中列

出被連接表中的所有列,包括其中的重復(fù)列。

2、不等連接:在連接條件使用除等于運(yùn)算符以外的其它比較運(yùn)算符比較被連接的列的列

值。這些運(yùn)算符包括>、>=^<=>V、?。尽?!v和o。

3、自然連接:在連接條件中使用等于(二)運(yùn)算符比較被連接列的列值,但它使用選擇列表

指出查詢結(jié)果集合中所包括的列,并刪除連接表中的重復(fù)列。

例,下面使用等值連接列Hlauthors和publishers衣中位于同,城市的作者和出?版社:

SELECT*

FROMauthorsASaINNERJOINpublishersASp

ONa.city=p.city

又如使用自然連接,在選擇列表中刪除authors和publishers表中重復(fù)列(city和state):

SELECTa.*,p.pub_id,p.pub_name,p.country

FROMauthorsASaINNERJOINpublishersASp

ONa.city=p.city

(二)外連接

內(nèi)連接時(shí),返回查詢結(jié)果集合中的僅是符合查詢條件(WHERE搜索條件或HAVING條

件)和連接條件的行。而采用外連接時(shí),它返回到查詢結(jié)果集合中的不僅包含符合連接條件

的行,而且還包括左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)邊接表(全外連接)中的所有數(shù)

據(jù)行。

如下面使用左外連接將論壇內(nèi)容和作者信息連接起來:

SELECTFROMluntanLEFTJOINusertableasb

ONa.username=b.usemame

下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:

SELECT

FROMcityasaFULLOUTERJOINuserasb

ONa.username=b.usemame

(三)交叉連接

交叉連接不帶WHERE子句,它返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返回到結(jié)

果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條

件的數(shù)據(jù)行數(shù)。

例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記

錄數(shù)將等于6*8=48行。

SELECTtype,pub_name

FROMtitlesCROSSJOINpublishers

ORDERBYtype

2003-11-2511:31:30SQLServer中ImageDataType的使用技巧【國商網(wǎng)絡(luò)有限公司蔣心

武】MSSQLServer是微軟公司推出的大型數(shù)據(jù)庫軟件,在NT平臺(tái)上擁有近一半的數(shù)據(jù)

庫市場(chǎng),特別是在SQLServer7。推出后,其發(fā)展勢(shì)頭更加迅猛。SQLServer中Image數(shù)據(jù)

類型是用來存儲(chǔ)圖形的。在此我談?wù)勗鯓釉?、?cè)k改此類型數(shù)據(jù)及在主頁中讀出此類型數(shù)據(jù)。

一、在表中添加圖形

Image數(shù)據(jù)類型不同于其它數(shù)據(jù)類型,不能用Insert、Update的標(biāo)準(zhǔn)SQL語法進(jìn)行圖形

的添加和修改。需用到SQLServer中的TEXTPTR、WRITETEXT、UPDATETEXT等函數(shù)

進(jìn)行圖形的添加和修改。

首先假設(shè)在庫Im_Test中建立一張表此表中有兩個(gè)字段,分別為Pr_Id(INT),

Prjnfo(IMAGE),用來存儲(chǔ)圖形編號(hào)及圖形信息。其語法如下:

CREATETEALEImjnfo(

PjIdINTNULL,

PrjnfoIMAGENULL

第一步往表中插入一條記錄,并初始化PR」NFO字段。其語法如下:

INSERTINTOIm_InfoVALUES(1,OxFFFFFFFF)

第二步往表中寫入圖形信息。其語法如下:

DECLARE@@ptrvalvarbinary(16)

SELECT@@ptrval=TEXTPTR(PrJnfo)

FROMIm」nfo

WHEREPr_Id=1

WRITETEXTIm_Text.Im_Info

@@ptrval0x624fd543fd..

其中0x624fd543fd..…為圖形的十六進(jìn)制數(shù)據(jù),可以通過C.Java等工具獲得。注意在

寫入圖形信息前必須先將此數(shù)據(jù)庫的‘selectinto/bulkcopy,屬性設(shè)置為True,其語法如下:

sp_dboptionIm_Test,

'selectinto/bulkcopy*,True

若想修改圖形數(shù)據(jù)可用UPDATETEXT函數(shù)修改,其語法如下:

DECLARE@@ptrvalvarbinary(16)

SELECT@@ptrval=TEXTPTR(Pr_Info)

FROMIm_Info

WHEREPrjd=1

UPDATETEXTIm_Text.Im_Info

@@ptrval0xaa31bcfe543fd.....

二、在主頁中顯示圖形

第一步建立數(shù)據(jù)源

若想將加入的圖形顯示在主頁中,必須先建立數(shù)據(jù)源,打開Windows中的控制面板。通

過ODBC應(yīng)用程序,建立數(shù)據(jù)源(取名Im_Test)連接到Im_Test數(shù)據(jù)庫

第二步編寫程序

<%@LANGUAGE=VBScript%>

<%OptionExplicit%>

<%

DimoConn

DimoRs

DimPic

DimPicSize

Response.Buffer=TRUE

Response.ContentType="image/gif

SetoConn=Server.CreateObject("ADODB.Connection1')

oConn.Open

SetoRs=oConn.Execute("SELECTPrjnfoFROMIm_InfoWHEREPr_Id=T,)

PicSize=oRs(nPr_Info").ActualSize

Pic=oRsC'PrJnfon).GetChunk(PicSize)

Response.BinaryWritePic

Response.End

%>

此程序中先定義四個(gè)變量。然后設(shè)置屬性Response.Buffer=TRU和Response.ContentType=

“image/gif”,再連接數(shù)據(jù)庫取出圖形,在加以顯示。

2003-11-2511:41:44深入SQL編程【關(guān)于存儲(chǔ)過程和索引】這里所指的SQL編程并

不是那些在象ASP,PHP腳本語言里用的某個(gè)SQL語句,如果你是個(gè)程序員并在做DBC/S

開發(fā),我想你會(huì)很清楚的知道SQL編程是很復(fù)雜的,先拋開嵌入語句,動(dòng)態(tài)執(zhí)行,高級(jí)函

數(shù),表達(dá)試等這些不談單就解決性能問題就很頭疼,下面就性能問題給出一些解決放案.(以

下程序均在NT+SP6SQLSERVER7下調(diào)試通過)

一,存儲(chǔ)過程

我的一個(gè)朋友用VC/SQLSERVER做C/S項(xiàng)目開發(fā),再開發(fā)過程中他的程序雖順利執(zhí)行,

但遇到了由于需要大批量插入數(shù)據(jù)而引出的性能問題。他找到了我,雖然我沒有用過VCHH

很明顯在他程序中看出是在前臺(tái)用循環(huán)操作象后臺(tái)插入數(shù)據(jù)。這種方法再處理大批量數(shù)時(shí)無

疑是不可取的,因編譯器并不會(huì)處理SQL語句而是通過ODBC傳輸?shù)胶笈_(tái),再在后臺(tái)解釋

執(zhí)行。

由此可見經(jīng)過以上幾步性能問題以大打折扣,后我將他的程序段改為后臺(tái)SQL編程,用

存儲(chǔ)過程實(shí)現(xiàn)。然后在前臺(tái)用VC調(diào)用,這樣一來問題以得到完美的解決。改后程序如下:

(遇到此類問題的朋友可參考解決)

CREATEPROCusp_insert_temp

@iCountVARCHAR(10),

@TextVARCHAR(50),

?priceVARCHAR(15)

AS

DECLARE@ilndexINT

DECLARE@pMoneyFLOAT

SET@iIndex=CONVERT(INT,@iCount)

SET@pMoney=CONVERT(FLOAT,?price)

BEGINTRAN

SELECTrygl_id,title,price

INTOrygl_tempFROMrqk

WHEREEXISTS

(SELECTrygl_id

FROMrygl

WHERErqk.rygl_id=rygl.rygl_id

ANDqty<30)

ORDERBYtitlejd

IF@@ERROR<>0

ROLLBACKTRAN

ELSE

COMMITTRAN

WHILE@iIndex>0

BEGIN

BEGINTRAN

SET@pMoney=@pMoney+1.1111

INSERTINTOrygl_temp(rygl_id,title,price)

VALUES(@ilndex,@Text,CONVERT(SMALLMONEY,@pMoney))

IF@@ERRORoOOR@@ROWCOUNT=0

ROLLBACKTRAN

ELSE

COMMITTRAN

SET@ilndex=@ilndex-1

END

二,索引測(cè)試,比較

合理的索引建立,運(yùn)用可很大幅度提高程序性能,以下是在工作當(dāng)中得出的經(jīng)驗(yàn),與大家

共享。

1.ORDERBY和GROPUBY

如果用戶經(jīng)常選擇數(shù)據(jù)和使用ORDERBY和GROUPBY短語,任何一種索引都有助于

SELECT的性能提高。如果用戶選擇的是顧客并按其姓名分類,兩種索引都能快速檢索數(shù)據(jù)。

但下面的一些因素會(huì)使用戶選擇使用某一種索引。

2,返回范圍內(nèi)的數(shù)據(jù)

列如,如果擁護(hù)希望返回在SMITH和TALBERT之間的所有顧客姓名,或者返回在日期

“11/1/98”和T1/30/98”之間的訂貨量,并且用戶經(jīng)常做這類事情,那么最好在該范圍所在的

指定列使用聚類索引。因聚類索引已包含了經(jīng)過分類排序的數(shù)據(jù),這對(duì)于在指定范圍內(nèi)檢索

數(shù)據(jù)更為有效。聚類索引只需找到要檢索的所有數(shù)據(jù)中的開頭和結(jié)尾數(shù)據(jù)即可;而不象非聚

類索,必須在數(shù)據(jù)層專查找來字葉層的每一個(gè)數(shù)據(jù)項(xiàng)。

3,列中有一個(gè)或極少的不同值

在用戶表中的某些列中喊有極少不同值,列如狀態(tài)列中只包含INACVTIVE,ACVIVE或

者TERMINATED。在這種情況下,在該列上使用任何類型索引都是不明智的,原因很簡(jiǎn)單:

如果用戶表包含了1500行大概有三分之一的行即500行在狀態(tài)列中含有ACTIVE。掃描整

個(gè)表,如果不是更高效,至少也是同先在索引頁面中查找每個(gè)數(shù)據(jù)項(xiàng)而后尋找到包含

ACTIVE狀態(tài)的行所在的數(shù)

據(jù)頁面也相同的效率。下面這個(gè)列子創(chuàng)建了一個(gè)表,它在有很很多重復(fù)值的列上進(jìn)行索弓I,

而該列具有很少的不同值。運(yùn)行該腳本可能要花幾分鐘。

*/

DROPTABLEIndexTestTable

CREATETABLEIndexTestTable

(

TidINTIDENTITY(IJ)NOTNULL,

StatusCHAR(10)NULL

)

GO

SETIDENTITY_INSERTIndexTestTableON

DECLARE@intCountINT

BEGINTRAN

SET@intCount=l

WHILE@intCount<=1500

BEGIN

INSERTIndexTestTable(Tid,Status)VALUES(@intCount,Active1)

SET@intCount=@intCount+3

END

SET@intCount=2

WHILE@intCount<=1500

BEGIN

INSERTIndexTestTable(Tid,Status)VALUES(@intCount,?inactive1)

SET@intCount=@intCount+3

END

SET@intCount=3

WHILE@intCount<=1500

BEGIN

INSERTIndexTestTable(Tid,Status)VALUES(@intCount,Terminated')

SET@intCount=@intCount+3

END

COMMITTRAN

SETIDENTITYJNSERTIndexTestTableOFF

GO

DUMPTRANSACTIONpubsWITHNO_LOG

GO

CREATEINDEXinTableUniquesStatus

ONIndexTestTable(Status)

GO

-不用索引查詢

SELECT*

FROMIndexTestTableWITH(index(O))

WHEREStatus='inactive'

-用索引查詢

SELECT*

FROMIndexTestTableWITH(index(inTableUniquesStatus))

WHEREStatus=,inactive,

選中SHOWSTATSI/O查看運(yùn)行結(jié)果會(huì)另人吃驚。第一個(gè)SELECT語句引起全表掃描幾乎

不需要內(nèi)存操作(因?yàn)橹皇沁M(jìn)行插入,所有所有數(shù)據(jù)都在內(nèi)存中,并不需要進(jìn)行磁盤或物理

讀操作)。第二個(gè)SELECT語句則需要執(zhí)行500個(gè)讀操作,這就證實(shí)了我們所說的在這種情況

下,使用任何類型索引都是不明智的。

4,

以上舉列說明了在何種情況下不應(yīng)使用索引,現(xiàn)在咱們?cè)俜催^來看看當(dāng)索引列中

不同數(shù)目值增加時(shí)即有較少不同值時(shí)會(huì)怎樣?見如下代碼

*/

DROPTABLEIndexTestTable

GO

CREATETABLEIndexTestTable

(

TidINTIDENTITY(IJ)NOTNULL,

StatusCHAR(IO)NULL,

Co3CHAR(20)NOTNULL,

Co4CHAR(50)NOTNULL

)

GO

DECLARE@intNumINT

SET@intNum=0

BEGINTRAN

WHILE@intNum<=1300

BEGIN

INSERTIndexTestTable

VALUES(CHAR(@intNum%26+65);test3Vtest4')

SET@intNum=@intNum+1

END

COMMITTRAN

GO

--不用索引查詢

SELECT*FROMIndexTestTableWHIT(INDEX(O))

WHEREStatus^B1

--創(chuàng)建聚集索引

CREATECLUSTEREDINDEXicIndexTestTable

ONIndexTestTable(Status)

GO

-使用索引查詢

SELECT*FROMIndexTestTableWITH(INDEX(icIndexTestTable))

WHEREStatus=B

5,

用戶很明顯地能看出,隨著表中行的數(shù)目和列中不同值的增長(zhǎng)。使用索引可以較大幅度提

高效率,由此又引出另一個(gè)問題,在何種情況下用何種索引更有效?上面列子一經(jīng)介紹了聚

類索引,大家都能看出在對(duì)于有較少不同植時(shí)使用聚類索引是有很大幫助的,但當(dāng)不同值的

數(shù)木增加并達(dá)到表中行的樹木時(shí)則應(yīng)該選非聚類索弓I。此時(shí)使用非聚類索在讀操作上和聚類

似索引并無

二異,但在對(duì)表進(jìn)行寫操作上的性能卻提高不少,如果用戶經(jīng)常從表中的一個(gè)或少是數(shù)幾個(gè)

字段中檢索數(shù)據(jù),當(dāng)非聚集索引包含要檢索的所有字段時(shí)就會(huì)減少所需的讀操作,如果不是

那么正如上面第二條所說使用非聚集索引通常是鐘很差的選擇,下面這個(gè)列子說明了在何時(shí)

應(yīng)該使用聚集索引

*/

DROPTABLEIndexTestTable

GO

CREATETABLEIndexTestTable

(

TidINTIDENTITY(1,1)NOTNULL,

StatusCHAR(20)NOTNULL

)

GO

DECLARE@intCountINT

SET@intCount=0

BEGINTRAN

WHILE@intCount<=500

BEGIN

INSERTINTOIndexTestTable(Status)VALUES('test'+CONVERT(CHAR(6),@intCount))

SET@intCount=@intCount+1

END

COMMITTRAN

GO

-創(chuàng)建聚集索引

CREATECLUSTEREDINDEXicIndexTestTable

ONIndexTestTable(Tid)

GO

―創(chuàng)建非聚集索引

CREATEINDEXinlndexTestTable

ONIndexTestTable(Tid)

GO

-使用非聚集索引查詢

SELECTTidFROMIndexTestTableWITH(INDEX(inIndexTestTable))

WHERETidBETWEEN100AND500

-使用聚集索引查詢

SELECTTidFROMIndexTestTableWITH(INDEX(icIndexTestTable))

WHERETidBETWEEN100AND500

集索引包含絕大多數(shù)的檢索數(shù)據(jù),則只需要讀取很少的數(shù)據(jù)頁這種情況下非聚集索引要比

聚集索引好,如果表的數(shù)據(jù)行很龐大效果會(huì)更加明顯。

6,

要說明的是,索引雖有助于提高性能但不是索引越多越好,恰好相反過多的索引會(huì)導(dǎo)致系

統(tǒng)低效。用戶在表中每加進(jìn)一個(gè)索引,維護(hù)索引集合就要做相應(yīng)的更新工作。

2003-11-2511:49:45SQLServer日期計(jì)算通常,你需要獲得當(dāng)前日期和計(jì)算一些其他的

II期,例如,你的程序可能需要判斷一個(gè)月的第一天或者最后一天。你們大部分人大概都知

道怎樣把日期進(jìn)行分割(年、月、日等),然后僅僅用分割出來的年、月、日等放在幾個(gè)函

數(shù)中計(jì)算出自己所需要的口期!在這篇文章里,我將告訴你如何使用DATEADD和

DATEDIFF函數(shù)來計(jì)算出在你的程序中可能你要用到的一些不同日期。

在使用本文中的例子之前,你必須注意以下的問題。大部分可能不是所有例子在不同的機(jī)器

上執(zhí)行的結(jié)果可能不一樣,這完全由哪一天是一個(gè)星期的第一天這個(gè)設(shè)置決定。第一天

(DM'EFIRST)設(shè)定決定了你的系統(tǒng)使用哪一天作為一周的第一天。所有以下的例子都是

以星期天作為一周的第一天來建立,也就是第一天設(shè)置為7。假如你的第一天設(shè)置不一樣,

你可能需要調(diào)整這些例子,使它和不同的第一天設(shè)置相符合。你可以通過@@DATEFIRST

函數(shù)來檢查第一天設(shè)置。

為了理解這些例子,我們先復(fù)習(xí)一下DATEDIFF和DATEADD函數(shù)。DATEDIFF函數(shù)計(jì)

算兩個(gè)日期之間的小時(shí)、天、周、月、年等時(shí)間間隔總數(shù)。DATEADD函數(shù)計(jì)算一個(gè)口期通

過給時(shí)間間隔加減來獲得一個(gè)新的日期。要了解更多的DATEDIFF和DAT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論