




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。sql語句妙用,各種sql語句的詳細用法與講解學習SQL應(yīng)知道的動態(tài)SQL語句基本語法1、普通SQL語句可以用Exec執(zhí)行9Kp=ACdaFr1eg:Select*fromtableNameWsc+A:當然將字符串改成變量的形式也可:?Gf%ydeclarefnamevarchar(20)rjXK3setfname=FiledName-設(shè)置字段名!i9mD!Gw(IfnsPdeclaresvarchar(1000)7A_?musets=select+fname+fromtableNameezCY_T9m
2、Exec(s)-成功W=Q!_X$execsp_executesqls-此句會報錯vOwTKUbBy4-_T+A2#sv-v6oHdeclaresNvarchar(1000)-注意此處改為nvarchar(1000)A!?UOEsets=select+fname+fromtableName(/Hv6n3Z&Exec(s)-成功ix9Hhexecsp_executesqls-此句正確7UXt*wLBf0at03、輸出參數(shù)kz/7E/A%+np.MM7Edeclarenumint,3=CUhsqlsnvarchar(4000)cI)10000)AStWHEREa.au_id=ta.au_idAND
3、ta.title_id=t.title_id此例中,將SELECT返回的結(jié)果集合給予一別名t,然后再從中檢索數(shù)據(jù)。(三)使用WHERE子句設(shè)置查詢條件WHERE子句設(shè)置查詢條件,過濾掉不需要的數(shù)據(jù)行。例如下面語句查詢年齡大于20的數(shù)據(jù):SELECT*FROMusertableWHEREage20WHERE子句可包括各種條件運算符:比較運算符(大小比較):、=、=、=、!、!=10ANDage、=、=、!和。3、自然連接:在連接條件中使用等于(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結(jié)果集合中所包括的列,并刪除連接表中的重復(fù)列。例,下面使用等值連接列出authors和publish
4、ers表中位于同一城市的作者和出版社:SELECT*FROMauthorsASaINNERJOINpublishersASpONa.city=p.city又如使用自然連接,在選擇列表中刪除authors和publishers表中重復(fù)列(city和state):SELECTa.*,p.pub_id,p.pub_name,p.countryFROMauthorsASaINNERJOINpublishersASpONa.city=p.city(二)外連接內(nèi)連接時,返回查詢結(jié)果集合中的僅是符合查詢條件(WHERE搜索條件或HAVING條件)和連接條件的行。而采用外連接時,它返回到查詢結(jié)果集合中的不僅包
5、含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數(shù)據(jù)行。如下面使用左外連接將論壇內(nèi)容和作者信息連接起來:SELECTa.*,b.*FROMluntanLEFTJOINusertableasbONa.username=b.username下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:SELECTa.*,b.*FROMcityasaFULLOUTERJOINuserasbONa.username=b.username(三)交叉連接交叉連接不帶WHERE子句,它返回被連接的兩個表所有數(shù)據(jù)行的笛卡爾積,返回到
6、結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個表中符合查詢條件的數(shù)據(jù)行數(shù)。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數(shù)將等。于6*8=48行。SELECTtype,pub_nameFROMtitlesCROSSJOINpublishersORDERBYtypePost=0/Post教你快速掌握一些異常精妙的SQL語句發(fā)布時間:2008.03.1104:58來源:賽迪網(wǎng)作者:錢海歌【賽迪網(wǎng)IT技術(shù)報道】精妙的SQL語句:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a新表名:b)SQL:select*intobfromawhere11拷貝
7、表(拷貝數(shù)據(jù),源表名:a目標表名:b)SQL:insertintob(a,b,c)selectd,e,ffromb;顯示文章、提交人和最后回復(fù)時間SQL:selecta.title,a.username,b.adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable.title=a.title)b說明:外連接查詢(表名1:a表名2:b)SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.c日程安排提前五分鐘提醒SQL:select*from日程安排wheredat
8、ediff(minute,f開始時間,getdate()5兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息SQL:deletefrominfowherenotexists(select*frominfobzwhereinfo.infid=infobz.infid)說明:SQL:SELECTA.NUM,A.NAME,B.UPD_DATE,B.PREV_UPD_DATEFROMTABLE1,(SELECTX.NUM,X.UPD_DATE,Y.UPD_DATEPREV_UPD_DATEFROM(SELECTNUM,UPD_DATE,INBOUND_QTY,STOCK_ONHANDFROMTABLE2WH
9、ERETO_CHAR(UPD_DATE,YYYY/MM)=TO_CHAR(SYSDATE,YYYY/MM)X,(SELECTNUM,UPD_DATE,STOCK_ONHANDFROMTABLE2WHERETO_CHAR(UPD_DATE,YYYY/MM)=TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,YYYY/MM)/01,YYYY/MM/DD)-1,YYYY/MM)Y,WHEREX.NUM=Y.NUM(+)ANDX.INBOUND_QTY+NVL(Y.STOCK_ONHAND,0)X.STOCK_ONHAND)BWHEREA.NUM=B.NUM說明:SQL:select*f
10、romstudentinfowherenotexists(select*fromstudentwherestudentinfo.id=student.id)and系名稱=&strdepartmentname&and專業(yè)名稱=&strprofessionname&orderby性別,生源地,高考總成績實例講解SQLServer中Update的用法發(fā)布時間:2008.02.2805:07來源:賽迪網(wǎng)作者:AlizzeSQLServer中Update的用法:例子:在表中有兩個字段:id_no(varchar),in_date(datetime),把in_date相同的記錄的in_date依次累加1秒
11、,使in_date沒有相同的記錄。以下為原始的數(shù)據(jù):id_noin_date57912003-9-114:42:0257922003-9-114:42:0257942003-9-114:42:0257952003-9-114:42:0357962003-9-114:42:0357972003-9-114:42:0358312003-9-114:42:0458322003-9-114:42:1458332003-9-114:42:14結(jié)果為:id_noin_date57912003-9-114:42:0257922003-9-114:42:0357942003-9-114:42:04579520
12、03-9-114:42:0557962003-9-114:42:0657972003-9-114:42:0758312003-9-114:42:0858322003-9-114:42:1458332003-9-114:42:15處理的方法:-建立測試環(huán)境createtablea(id_novarchar(8),in_datedatetime)goinsertintoaselect5791,2003-9-114:42:02unionallselect5792,2003-9-114:42:02unionallselect5794,2003-9-114:42:02unionallselect5795
13、,2003-9-114:42:03unionallselect5796,2003-9-114:42:03unionallselect5797,2003-9-114:42:03unionallselect5831,2003-9-114:42:04unionallselect5832,2003-9-114:42:04unionallselect5833,2003-9-114:42:04unionallselect5734,2003-9-114:42:02unionallselect6792,2003-9-114:42:22unionallselect6794,2003-9-114:42:22uni
14、onallselect6795,2003-9-114:42:23unionallselect6796,2003-9-114:42:23unionallselect6797,2003-9-114:42:23unionallselect6831,2003-9-114:42:34unionallselect6832,2003-9-114:42:34unionallselect6833,2003-9-114:42:54unionallselect6734,2003-9-114:42:22go-生成臨時表,按照in_date排序select*into#fromaorderbyin_date-相同的時間,
15、加一秒。加完了不帶重復(fù)的declaredate1datetime,date2datetime,datedatetimeupdate#setdate=casewhendate1=in_dateordate2=in_datethendateadd(s,1,date2)elsein_dateend,date1=in_date,date2=date,in_date=date-更新到基本表中去updateaseta.in_date=b.in_datefromaajoin#bona.id_no=b.id_noselect*fromadroptable#,a三種數(shù)據(jù)庫利用SQL語句進行高效果分頁發(fā)布時間:2
16、008.01.2104:50來源:賽迪網(wǎng)作者:10687在程序的開發(fā)過程中,處理分頁是大家接觸比較頻繁的事件,因為現(xiàn)在軟件基本上都是與數(shù)據(jù)庫進行掛釣的。但效率又是我們所追求的,如果是像原來那樣把所有滿足條件的記錄全部都選擇出來,再去進行分頁處理,那么就會多多的浪費掉許多的系統(tǒng)處理時間。為了能夠把效率提高,所以現(xiàn)在我們就只選擇我們需要的數(shù)據(jù),減少數(shù)據(jù)庫的處理時間,以下就是常用SQL分頁處理:1、SQLServer、Access數(shù)據(jù)庫這都微軟的數(shù)據(jù)庫,都是一家人,基本的操作都是差不多,常采用如下分頁語句:PAGESIZE:每頁顯示的記錄數(shù)CURRENTPAGE:當前頁號數(shù)據(jù)表的名字是:compon
17、ents索引主鍵字是:idselecttopPAGESIZE*fromcomponentswhereidnotin(selecttop(PAGESIZE*(CURRENT1)idfromcomponentsorderbyid)orderbyid如下列:selecttop10*fromcomponentswhereidnotin(selecttop10*10idfromcomponentsorderbyid)orderbyid從101條記錄開始選擇,只選擇前面的10條記錄2、Oracle數(shù)據(jù)庫因為Oracle數(shù)據(jù)庫沒有Top關(guān)鍵字,所以這里就不能夠像微軟的數(shù)據(jù)據(jù)那樣操作,這里有兩種方法:(1)、
18、一種是利用相反的。PAGESIZE:每頁顯示的記錄數(shù)CURRENTPAGE:當前頁號數(shù)據(jù)表的名字是:components索引主鍵字是:idselect*fromcomponentswhereidnotin(selectidfromcomponentswhererownum=(PAGESIZE*(CURRENT1)andrownum=PAGESIZEorderbyid;如下例:select*fromcomponentswhereidnotin(selectidfromcomponentswhererownum=100)andrownum=10orderbyid;從101到記錄開始選擇,選擇前面1
19、0條。(2)、使用minus,即中文的意思就是減去。select*fromcomponentswhererownum=(PAGESIZE*(CURRENT1)minusselect*fromcomponentswhererownum=(PAGESIZE*(CURRENT2);如例:select*fromcomponentswhererownum=10minusselect*fromcomponentswhererownum=5;.(3)、一種是利用Oracle的rownum,這個是Oracle查詢自動返回的序號,一般不顯示,但是可以通過selectrownumfrom表名看到,注意,它是從1到
20、當前的記錄總數(shù)。select*from(selectrownumtid,components.*fromcomponentswhererownum=100)wheretid=0LEFTOUTERJOINdbo.syscommentseONa.cdefault=e.idLEFTOUTERJOINdbo.syspropertiesgONa.id=g.idANDa.colid=g.smallidAND=MS_DescriptionLEFTOUTERJOINdbo.syspropertiesfONd.id=f.idANDf.smallid=0AND=MS_Description
21、ORDERBY,a.colorderSQLServer2005數(shù)據(jù)庫字典-表結(jié)構(gòu).sqlSELECTTOP100PERCENT-a.id,CASEWHENa.colorder=1THENELSEENDAS表名,CASEWHENa.colorder=1THENisnull(f.value,)ELSEENDAS表說明,a.colorderAS字段序號,AS字段名,CASEWHENCOLUMNPROPERTY(a.id,,IsIdentity)=1THENELSEENDAS標識,CASEWHENEXISTS(SELECT1FROMdbo.sysinde
22、xessiINNERJOINdbo.sysindexkeyssikONsi.id=sik.idANDsi.indid=sik.indidINNERJOINdbo.syscolumnsscONsc.id=sik.idANDsc.colid=sik.colidINNERJOINdbo.sysobjectssoON=ANDso.xtype=PKWHEREsc.id=a.idANDsc.colid=a.colid)THENELSEENDAS主鍵,AS類型,a.lengthAS長度,COLUMNPROPERTY(a.id,,PRECISION)AS精度
23、,ISNULL(COLUMNPROPERTY(a.id,,Scale),0)AS小數(shù)位數(shù),CASEWHENa.isnullable=1THENELSEENDAS允許空,ISNULL(e.text,)AS默認值,ISNULL(g.value,)AS字段說明,d.crdateAS創(chuàng)建時間,CASEWHENa.colorder=1THENd.refdateELSENULLENDAS更改時間FROMdbo.syscolumnsaLEFTOUTERJOINdbo.systypesbONa.xtype=b.xusertypeINNERJOINdbo.sysobjectsdONa.id=d.id
24、ANDd.xtype=UANDd.status=0LEFTOUTERJOINdbo.syscommentseONa.cdefault=e.idLEFTOUTERJOINdbo.syspropertiesgONa.id=g.idANDa.colid=g.smallidAND=MS_DescriptionLEFTOUTERJOINdbo.syspropertiesfONd.id=f.idANDf.smallid=0AND=MS_DescriptionORDERBY,a.colorderSQLServer數(shù)據(jù)庫字典-索引.sqlSELECTTOP100PERCEN
25、T-a.id,CASEWHENb.keyno=1THENELSEENDAS表名,CASEWHENb.keyno=1THENELSEENDAS索引名稱,AS列名,b.keynoAS索引順序,CASEindexkey_property(c.id,b.indid,b.keyno,isdescending)WHEN1THEN降序WHEN0THEN升序ENDAS排序,CASEWHENp.idISNULLTHENELSEENDAS主鍵,CASEINDEXPROPERTY(c.id,,IsClustered)WHEN1THENWHEN0THENENDAS聚集,
26、CASEINDEXPROPERTY(c.id,,IsUnique)WHEN1THENWHEN0THENENDAS唯一,CASEWHENe.idISNULLTHENELSEENDAS唯一約束,a.OrigFillFactorAS填充因子,c.crdateAS創(chuàng)建時間,c.refdateAS更改時間FROMdbo.sysindexesaINNERJOINdbo.sysindexkeysbONa.id=b.idANDa.indid=b.indidINNERJOINdbo.syscolumnsdONb.id=d.idANDb.colid=d.colidINNERJOINdbo.sysobj
27、ectscONa.id=c.idANDc.xtype=ULEFTOUTERJOINdbo.sysobjectseON=ANDe.xtype=UQLEFTOUTERJOINdbo.sysobjectspON=ANDp.xtype=PKWHERE(OBJECTPROPERTY(a.id,NIsUserTable)=1)AND(OBJECTPROPERTY(a.id,NIsMSShipped)=0)AND(INDEXPROPERTY(a.id,,IsAutoStatistics)=0)ORDERBY,,b.keyno
28、SQLServer數(shù)據(jù)庫字典-主鍵.外鍵.約束.視圖.函數(shù).存儲過程.觸發(fā)器.sqlSELECTDISTINCTTOP100PERCENTo.xtype,CASEo.xtypeWHENXTHEN擴展存儲過程WHENTRTHEN觸發(fā)器WHENPKTHEN主鍵WHENFTHEN外鍵WHENCTHEN約束WHENVTHEN視圖WHENFNTHEN函數(shù)-標量WHENIFTHEN函數(shù)-內(nèi)嵌WHENTFTHEN函數(shù)-表值ELSE存儲過程ENDAS類型,AS對象名,o.crdateAS創(chuàng)建時間,o.refdateAS更改時間,c.textAS聲明語句FROMdbo.sysobjectsoLEFT
29、OUTERJOINdbo.syscommentscONo.id=c.idWHERE(o.xtypeIN(X,TR,C,V,F,IF,TF,FN,P,PK)AND(OBJECTPROPERTY(o.id,NIsMSShipped)=0)ORDERBYCASEo.xtypeWHENXTHEN擴展存儲過程WHENTRTHEN觸發(fā)器WHENPKTHEN主鍵WHENFTHEN外鍵WHENCTHEN約束WHENVTHEN視圖WHENFNTHEN函數(shù)-標量WHENIFTHEN函數(shù)-內(nèi)嵌WHENTFTHEN函數(shù)-表值ELSE存儲過程ENDDESC兩個表間不存在的insert與存在的update發(fā)布時間:200
30、8.02.2905:07來源:賽迪網(wǎng)作者:Alice兩個表間,不存在的insert與存在的update示例:IFOBJECT_ID(dbo.sp_showtable_insert)ISNOTNULLBEGINDROPPROCEDUREdbo.sp_showtable_insertIFOBJECT_ID(dbo.sp_showtable_insert)ISNOTNULLPRINTELSEPRINTENDgoSETANSI_NULLSONgoSETQUOTED_IDENTIFIERONgocreateproceduredbo.sp_showtable_inserttablename1varchar
31、(100),tablename2varchar(100)asbeginDECLAREMAX_IDNUMERIC(18,0)DECLAREMAX_ID2NUMERIC(18,0)createtable#ins_tab(fgint,col_name1nvarchar(150),col_name_valnvarchar(150),col_name2nvarchar(150),colidnumeric(18,0)insertinto#ins_tab(fg,col_name1,col_name_val,colid)values(0,INSERTINTO+tablename1,10)insertinto#
32、ins_tab(fg,col_name1,col_name_val)values(1,(,)insertinto#ins_tab(fg,col_name1,col_name_val,colid)select2,,/*++_Value*/,b.colidfromsysobjectsa,=tablename1anda.id=b.idanda.type=Uinsertinto#ins_tab(fg,col_name1,col_name_val)values(3,),)insertinto#ins_tab(fg,col_name1,c
33、ol_name_val)values(4,SELECT,)insertinto#ins_tab(fg,col_name1,col_name_val,colid)select5,-+,,b.colidfromsysobjectsa,=tablename2anda.id=b.idanda.type=Uupdate#ins_tabsetcol_name2=fromsysobjectsa,syscolumnsb,#ins_=tablename2anda.id=b.idanda.type=Uan
34、dc.col_name1=andc.fg=2update#ins_tabsetcol_name_val=CASEwhenisnull(col_name2,1)=1THENnull+col_name_valelsecol_name2+col_name_valendwherefg=2delete#ins_tabfrom#ins_tabawherea.fg=5andexists(select1from#ins_tabbwhereb.col_name1=a.col_name_valandb.fg=2)insertinto#ins_tab(fg,col_name1,col_name_val,
35、colid)values(6,FROM+tablename2,10)insertinto#ins_tab(fg,col_name1,col_name_val,colid)values(7,UPDATE+tablename1,10)insertinto#ins_tab(fg,col_name1,col_name_val)values(8,SET,)insertinto#ins_tab(fg,col_name1,col_name_val,colid)SELECT9,+substring(tablename1+.+col_name1+,1,60)+=+tablename2+.+col_name1,c
36、olidFROM#ins_tabwherefg=2ANDisnull(col_name2,1)1insertinto#ins_tab(fg,col_name1,col_name_val)SELECT10,FROM+tablename1+,+tablename2,insertinto#ins_tab(fg,col_name1,col_name_val)SELECT11,WHERE+tablename1+.=+tablename2+.,SELECTMAX_ID=MAX(colid)from#ins_tabwherefg=2select0ASFG,-INSERT+tablename1+FROM+ta
37、blename2,0AScolidunionselectfg,col_name1,colidfrom#ins_tabwherefg=0unionselectfg,col_name1,colidfrom#ins_tabwherefg=1unionselectfg,CASEWHENcolid=MAX_IDTHEN+col_name1ELSE+col_name1+,ENDAScol_name1,colidfrom#ins_tabwherefg=2unionselectfg,col_name1,colidfrom#ins_tabwherefg=3unionselectfg,col_name1,coli
38、dfrom#ins_tabwherefg=4unionselect5asfg,CASEWHENcolid=MAX_IDTHEN+col_name_valELSE+col_name_val+,ENDAScol_name1,colidfrom#ins_tabwherefg=2unionselect6asfg,col_name1,colidfrom#ins_tabwherefg=6unionselect6ASFG,WHERENOTEXISTS(SELECT1FROM+tablename1+WHERE+tablename1+.=+tablename2+.,21AScolidunionselect8AS
39、FG,-UPDATE+tablename1+FROM+tablename2,0AScolidUNIONselect7asfg,col_name1,colidfrom#ins_tabwherefg=5-UPDATEunionselect8asfg,col_name1,colidfrom#ins_tabwherefg=7unionselect9asfg,col_name1,colidfrom#ins_tabwherefg=8unionselect10asfg,CASEWHENcolid=MAX_IDTHENcol_name1ELSEcol_name1+,ENDAScol_name1,colidfr
40、om#ins_tabwherefg=9unionselect11asfg,col_name1,colidfrom#ins_tabwherefg=10unionselect12asfg,col_name1,colidfrom#ins_tabwherefg=11unionselect13asfg,col_name1,colidfrom#ins_tabwherefg=12orderbyfg,coliddroptable#ins_tabendgoSETANSI_NULLSOFFgoSETQUOTED_IDENTIFIEROFFgoIFOBJECT_ID(dbo.sp_showtable_insert)
41、ISNOTNULLPRINTELSEPRINTgo實現(xiàn)跨多個表格的數(shù)據(jù)進行組合的SQL語句(1)發(fā)布時間:2008.01.2507:38來源:賽迪網(wǎng)作者:武西在對跨多個表格的數(shù)據(jù)進行組合時,有時很難搞清楚要使用哪一個SQL句法。我將在這里對將多個表格中的查詢合并至單一聲明中的常用方式進行闡述。在這篇文章中的樣本查詢符合SQL92ISO標準。不是所有的數(shù)據(jù)庫生產(chǎn)商都遵循這項標準,而且很多廠商采取的提升措施會帶來一些意料不到的后果。如果你不確定你的數(shù)據(jù)庫是不是支持這些標準,你可以參看生產(chǎn)廠商的有關(guān)資料。SELECT一個簡單的SELECT聲明就是查詢多個表格的最基本的方式。你可以在FROM子句中調(diào)用
42、多個表格來組合來自多個表格的結(jié)果。這里是一個它如何工作的實例:以下為引用的內(nèi)容:SELECTtable1.column1,table2.column2FROMtable1,table2WHEREtable1.column1=table2.column1;這個實例中,我使用點號(table1.column1)來指定專欄來自哪一個表格。如果所涉及的專欄只在一個參考的表格中出現(xiàn),你就不需要加入完整的名稱,但是加入完整名稱會對可讀性起到幫助。在FROM子句中表格之間由逗號來分隔,你可以加入所需的任意多的表格,盡管一些數(shù)據(jù)庫有一個在引入正式的JOIN聲明之前他們可以有效地處理的內(nèi)容這方面的限制,這個將在
43、下面談到。這個句法是一個簡單的INNERJOIN。一些數(shù)據(jù)庫將它看成與一個外部的JOIN是等同的。WHERE子句告知數(shù)據(jù)庫哪一個區(qū)域要做關(guān)聯(lián),而且它返回結(jié)果時,就像列出的表格在給定的條件下組合成一個單獨的表格一樣。值得注意的是,你的比較條件并不需要與你作為結(jié)果組返回的專欄相同。在上面的例子中,table1.column1和table2.column1用來組合表格,但是返回的卻是table2.column2。你可以在WHERE子句中使用AND關(guān)鍵字來將這個功能擴展至多于兩個的表格。你還可以使用這樣的表格組合來限制你的結(jié)果而不用實際地從每個表格返回專欄。在下面的例子中,table3與table1匹
44、配,但是我沒有從table3返回任何東西來顯示。我只是確保來自table1的有關(guān)專欄存在于table3之中。注意此例中table3需要在FROM子句中被引用。以下為引用的內(nèi)容:SELECTtable1.column1,table2.column2FROMtable1,table2,table3WHEREtable1.column1=table2.column1ANDtable1.column1=table3.column1;然而,要注意的是,這個查詢多個表格的方式是一個暗指的JOIN。你的數(shù)據(jù)庫可能對事物進行不同的處理,這取決于它所使用的優(yōu)化引擎。而且,忽略對與WHERE子句的相關(guān)特性的定義將
45、會給你帶來不愿看到的結(jié)果,例如從余下的查詢中返回與每一個可能的結(jié)果相關(guān)的專欄的rogue域,就像在CROSSJOIN之中一樣。如果你習慣于你的數(shù)據(jù)庫處理這種類型的聲明的方式,且你只對兩個或是少數(shù)幾個表格進行組合,一個簡單的SELECT聲明就可以達到目的。JOINJOIN的工作方式與SELECT聲明是相同的,它從不同的表格中返回一個帶有專欄的結(jié)果組。在暗含的JOIN之上使用外部JOIN的優(yōu)勢是對你的結(jié)果組的更好的控制,而且還可能在涉及很多個表格的情況下提升性能表現(xiàn)。JOIN的類型有幾種:LEFT,RIGHT,F(xiàn)ULLOUTER,INNER和CROSS。你所使用的類型是由你想要看到的結(jié)果所決定的。
46、例如,使用LEFTOUTERJOIN將會從列出的第一個表格中返回所有有關(guān)的行,而同時如果沒有信息與第一個表格相關(guān)的話將潛在地從所列出的第二個表格中加入行。在這里INNERJOIN和暗含的JOIN是不同的,INNERJOIN將只返回那些在兩個表格中都有數(shù)據(jù)的行。對第一個SELECT查詢使用如下JOIN聲明:以下為引用的內(nèi)容:SELECTtable1.column1,table2.column2FROMtable1INNERJOINtable2ONtable1.column1=table2.column1;子查詢子查詢,或叫子選擇聲明,是在一個查詢中將結(jié)果組作為資源使用的一個途徑。他經(jīng)常被用來對結(jié)
47、果進行限制或定義,而不是運行多個查詢或操縱應(yīng)用軟件之中的數(shù)據(jù)。有了子查詢,你可以參考表格來決定數(shù)據(jù)的內(nèi)含,或是在一些情況下,返回一個專欄,而這個專欄是一個子選擇的結(jié)果。下面的例子中使用了兩個表格。一個表格中包含了我想要返回的數(shù)據(jù),而另一個表格則給出一個比較點來確定什么數(shù)據(jù)是我確實感興趣的。以下為引用的內(nèi)容:SELECTcolumn1FROMtable1WHEREEXISTS(SELECTcolumn1FROMtable2WHEREtable1.column1=table2.column1);子查詢很重要的一個方面就是性能表現(xiàn)。便利性是有代價的,它取決于你所使用的表格和聲明的大小,數(shù)量和復(fù)雜性,
48、還有你可能會允許你的應(yīng)用軟件做處理工作。每一個查詢在被主查詢作為資源使用之前,都將被完整地單獨處理。如果可能的話,創(chuàng)造性地使用JOIN聲明可以以較少的滯后時間提供出相同的信息。(責任編輯:盧兆林)深入講解SQLUnion和UnionAll的使用方法發(fā)布時間:2008.03.1904:41來源:賽迪網(wǎng)作者:李思【賽迪網(wǎng)IT技術(shù)報道】UNION指令的目的是將兩個SQL語句的結(jié)果合并起來。從這個角度來看,我們會產(chǎn)生這樣的感覺,UNION跟JOIN似乎有些許類似,因為這兩個指令都可以由多個表格中擷取資料。UNION的一個限制是兩個SQL語句所產(chǎn)生的欄位需要是同樣的資料種類。另外,當我們用UNION這個
49、指令時,我們只會看到不同的資料值(類似SELECTDISTINCT)。union只是將兩個結(jié)果聯(lián)結(jié)起來一起顯示,并不是聯(lián)結(jié)兩個表UNION的語法如下:SQL語句1UNIONSQL語句2假設(shè)我們有以下的兩個表格,Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999InternetSales表格DateSalesJan-07-1999$250Jan-10-1999$535Jan-11-1
50、999$320Jan-12-1999$750而我們要找出來所有有營業(yè)額(sales)的日子。要達到這個目的,我們用以下的SQL語句:SELECTDateFROMStore_InformationUNIONSELECTDateFROMInternet_Sales結(jié)果:DateJan-05-1999Jan-07-1999Jan-08-1999Jan-10-1999Jan-11-1999Jan-12-1999有一點值得注意的是,如果我們在任何一個SQL語句(或是兩句都一起)用SELECTDISTINCTDate的話,那我們會得到完全一樣的結(jié)果。SQLUnionAllUNIONALL這個指令的目的也是
51、要將兩個SQL語句的結(jié)果合并在一起。UNIONALL和UNION不同之處在于UNIONALL會將每一筆符合條件的資料都列出來,無論資料值有無重復(fù)。UNIONALL的語法如下:SQL語句1UNIONALLSQL語句2我們用和上一頁同樣的例子來顯示出UNIONALL和UNION的不同。同樣假設(shè)我們有以下兩個表格:Store_Information表格store_nameSalesDateLosAngeles$1500Jan-05-1999SanDiego$250Jan-07-1999LosAngeles$300Jan-08-1999Boston$700Jan-08-1999InternetSale
52、s表格DateSalesJan-07-1999$250Jan-10-1999$535Jan-11-1999$320Jan-12-1999$750而我們要找出有店面營業(yè)額以及網(wǎng)絡(luò)營業(yè)額的日子。要達到這個目的,我們用以下的SQL語句:SELECTDateFROMStore_InformationUNIONALLSELECTDateFROMInternet_Sales結(jié)果:DateJan-05-1999Jan-07-1999Jan-08-1999Jan-08-1999Jan-07-1999Jan-10-1999Jan-11-1999Jan-12-1999=表1ABa1b0c3d0e2表2ABc0e4
53、合并兩個表除去重復(fù)的數(shù)據(jù)(以表2的數(shù)據(jù)為主),我們將會得到以下的表:ABa1b0c0d0e4selectA,Bfrom表1whereAnotin(selectAfrom表2)unionselectA,Bfrom表2巧用一條SQL實現(xiàn)其它進制到十進制轉(zhuǎn)換發(fā)布時間:2007.09.2504:57來源:賽迪網(wǎng)作者:han問:怎樣實現(xiàn)ORACLE中用一條SQL實現(xiàn)其它進制到十進制的轉(zhuǎn)換?答:具體示例如下:二進制轉(zhuǎn)換十進制selectsum(data1)from(selectsubstr(1101,rownum,1)*power(2,length(1101)-rownum)data1fromdualco
54、nnectbyrownum=length(1101)八進制轉(zhuǎn)換十進制selectsum(data1)from(selectsubstr(1101,rownum,1)*power(8,length(1101)-rownum)data1fromdualconnectbyrownum=length(1101)十六進制轉(zhuǎn)換十進制selectsum(data1)from(select(CASEupper(substr(2D,rownum,1)WHENATHEN10WHENBTHEN11WHENCTHEN12WHENDTHEN13WHENETHEN14WHENFTHEN15ELSEsubstr(2D,ro
55、wnum,1)END)*power(16,length(2D)-rownum)data1fromdualconnectbyrownum=length(2D)注釋:對其它進制可以根據(jù)例子將power的底數(shù)改成相應(yīng)的進制就可以了。本文只是一個例子,大家可以把它封裝成一個通用函數(shù)進行實用。大家在試的時候?qū)⒗锩嫦鄳?yīng)的其它進制的數(shù)值換成自己的數(shù)據(jù)就可以了(有多處)。實例講解如何才能讓你的SQL運行得更快(1)發(fā)布時間:2008.01.2204:52來源:賽迪網(wǎng)作者:10633很多人在使用SQL時往往會陷入一個誤區(qū),即太關(guān)注于所得的結(jié)果是否正確,而忽略了不同的實現(xiàn)方法之間可能存在的性能差異,這種性能差異在
56、大型的或是復(fù)雜的數(shù)據(jù)庫環(huán)境中(如聯(lián)機事務(wù)處理OLTP或決策支持系統(tǒng)DSS)中表現(xiàn)得尤為明顯。筆者在工作實踐中發(fā)現(xiàn),不良的SQL往往來自于不恰當?shù)乃饕O(shè)計、不充份的連接條件和不可優(yōu)化的where子句。在對它們進行適當?shù)膬?yōu)化后,其運行速度有了明顯地提高!下面我將從這三個方面分別進行總結(jié):為了更直觀地說明問題,所有實例中的SQL運行時間均經(jīng)過測試,不超過秒的均表示為(19991201anddate2000(25秒)selectdate,sum(amount)fromrecordgroupbydate(55秒)selectcount(*)fromrecordwheredate19990901andpl
57、acein(BJ,SH)(27秒)分析:date上有大量的重復(fù)值,在非群集索引下,數(shù)據(jù)在物理上隨機存放在數(shù)據(jù)頁上,在范圍查找時,必須執(zhí)行一次表掃描才能找到這一范圍內(nèi)的全部行。2.在date上的一個群集索引selectcount(*)fromrecordwheredate19991201anddate2000(14秒)selectdate,sum(amount)fromrecordgroupbydate(28秒)selectcount(*)fromrecordwheredate19990901andplacein(BJ,SH)(14秒)分析:在群集索引下,數(shù)據(jù)在物理上按順序在數(shù)據(jù)頁上,重復(fù)值也排
58、列在一起,因而在范圍查找時,可以先找到這個范圍的起末點,且只在這個范圍內(nèi)掃描數(shù)據(jù)頁,避免了大范圍掃描,提高了查詢速度。3.在place,date,amount上的組合索引selectcount(*)fromrecordwheredate19991201anddate2000(26秒)selectdate,sum(amount)fromrecordgroupbydate(27秒)selectcount(*)fromrecordwheredate19990901andplacein(BJ,SH)(19991201anddate2000(19990901andplacein(BJ,SH)(,=,=)
59、和orderby、groupby發(fā)生的列,可考慮建立群集索引;.經(jīng)常同時存取多列,且每列都含有重復(fù)值可考慮建立組合索引;.組合索引要盡量使關(guān)鍵查詢形成索引覆蓋,其前導(dǎo)列一定是使用最頻繁的列。二、不充份的連接條件:例:表card有7896行,在card_no上有一個非聚集索引,表account有191122行,在account_no上有一個非聚集索引,試看在不同的表連接條件下,兩個SQL的執(zhí)行情況:selectsum(a.amount)fromaccounta,cardbwherea.card_no=b.card_no(20秒)selectsum(a.amount)fromaccounta,ca
60、rdbwherea.card_no=b.card_noanda.account_no=b.account_no(在第一個連接條件下,最佳查詢方案是將account作外層表,card作內(nèi)層表,利用card上的索引,其I/O次數(shù)可由以下公式估算為:外層表account上的22541頁+(外層表account的191122行*內(nèi)層表card上對應(yīng)外層表第一行所要查找的3頁)=595907次I/O在第二個連接條件下,最佳查詢方案是將card作外層表,account作內(nèi)層表,利用account上的索引,其I/O次數(shù)可由以下公式估算為:外層表card上的1944頁+(外層表card的7896行*內(nèi)層表ac
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年超細Γ-AL2O3微粉項目發(fā)展計劃
- 水電設(shè)備合同范本
- 輪子購銷合同范本
- 酒店務(wù)工合同范本
- 定制物料合同范本
- 銀行贊助合同范本
- 基于LiteOS的New TP協(xié)議與TPv4協(xié)議互聯(lián)互通系統(tǒng)的設(shè)計與實現(xiàn)
- 2025年溫泉水開發(fā)利用項目合作計劃書
- 2025年記憶綿枕項目合作計劃書
- 2025年畜禽肉、油脂及食用雜碎項目合作計劃書
- 模具制造發(fā)展前景分析
- 2023音樂廳建筑聲學設(shè)計標準
- 微納光學結(jié)構(gòu)制造
- PEP四年級下冊英語教案(表格)
- 中職語文教學
- 教培機構(gòu)財務(wù)管理文件范本
- 醫(yī)藥行業(yè):創(chuàng)新藥產(chǎn)業(yè)鏈研究培訓框架-20210807-中信建投-79正式版
- 2022四川能投宜賓市敘州電力有限公司招聘試題及答案解析
- 外部干擾排查流程及案例
- 商業(yè)銀行信貸實務(wù):第一章 商業(yè)銀行信貸概述
- 小學2023-2024學年第二學期道德與法治教研組工作計劃
評論
0/150
提交評論