版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生蠔購銷合同范例
- 退休人員終止勞務(wù)合同范例
- 苗木栽植養(yǎng)護(hù)合同范例
- 社區(qū)醫(yī)療服務(wù)合同范例
- 車牌識(shí)別合同范例
- 2024年土地復(fù)墾與農(nóng)業(yè)產(chǎn)業(yè)化合作合同3篇
- 空調(diào)委托采購合同范例
- 2024年版小型公司勞動(dòng)用工合同樣本版
- 店鋪轉(zhuǎn)讓不合同范例
- 陜西國防工業(yè)職業(yè)技術(shù)學(xué)院《司法口才訓(xùn)練》2023-2024學(xué)年第一學(xué)期期末試卷
- 碧桂園營銷標(biāo)準(zhǔn)化工作集群與監(jiān)控節(jié)點(diǎn)清單
- SoftMaster使用說明
- 醫(yī)療器械員工培訓(xùn)記錄
- 中國船舶發(fā)展史
- 危險(xiǎn)廢物的培訓(xùn)總結(jié)
- 浙江省公路水運(yùn)工程工地試驗(yàn)室管理暫行辦法
- 國家開放大學(xué)電大《管理英語4》形考任務(wù)5試題及答案
- 六類網(wǎng)線檢測(cè)報(bào)告(共9頁)
- 安徽中電龍子湖工業(yè)園區(qū)12MW光伏發(fā)電示范項(xiàng)目二工區(qū)設(shè)備采購第一批35kV箱式變電站技術(shù)協(xié)議
- 注塑換模作業(yè)指導(dǎo)書
- 國家住宅裝飾裝修工程施工規(guī)范標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論