




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Good is good, but better carries it.精益求精,善益求善。sql語句妙用,各種sql語句的詳細(xì)用法與講解學(xué)習(xí)SQL應(yīng)知道的動(dòng)態(tài)SQL語句基本語法1、普通SQL語句可以用Exec執(zhí)行9Kp=ACdaFr1eg:Select*fromtableNameWsc+A:當(dāng)然將字符串改成變量的形式也可:?Gf%ydeclarefnamevarchar(20)rjXK3setfname=FiledName-設(shè)置字段名!i9mD!Gw(IfnsPdeclaresvarchar(1000)7A_?musets=select+fname+fromtableNameezCY_T9m
2、Exec(s)-成功W=Q!_X$execsp_executesqls-此句會(huì)報(bào)錯(cuò)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子句可包括各種條件運(yùn)算符:比較運(yùn)算符(大小比較):、=、=、=、!、!=10ANDage、=、=、!和。3、自然連接:在連接條件中使用等于(=)運(yùn)算符比較被連接列的列值,但它使用選擇列表指出查詢結(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)連接時(shí),返回查詢結(jié)果集合中的僅是符合查詢條件(WHERE搜索條件或HAVING條件)和連接條件的行。而采用外連接時(shí),它返回到查詢結(jié)果集合中的不僅包
5、含符合連接條件的行,而且還包括左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)邊接表(全外連接)中的所有數(shù)據(jù)行。如下面使用左外連接將論壇內(nèi)容和作者信息連接起來:SELECTa.*,b.*FROMluntanLEFTJOINusertableasbONa.username=b.username下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:SELECTa.*,b.*FROMcityasaFULLOUTERJOINuserasbONa.username=b.username(三)交叉連接交叉連接不帶WHERE子句,它返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返回到
6、結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數(shù)將等。于6*8=48行。SELECTtype,pub_nameFROMtitlesCROSSJOINpublishersORDERBYtypePost=0/Post教你快速掌握一些異常精妙的SQL語句發(fā)布時(shí)間:2008.03.1104:58來源:賽迪網(wǎng)作者:錢海歌【賽迪網(wǎng)IT技術(shù)報(bào)道】精妙的SQL語句:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a新表名:b)SQL:select*intobfromawhere11拷貝
7、表(拷貝數(shù)據(jù),源表名:a目標(biāo)表名:b)SQL:insertintob(a,b,c)selectd,e,ffromb;顯示文章、提交人和最后回復(fù)時(shí)間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開始時(shí)間,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性別,生源地,高考總成績(jī)實(shí)例講解SQLServer中Update的用法發(fā)布時(shí)間:2008.02.2805:07來源:賽迪網(wǎng)作者:AlizzeSQLServer中Update的用法:例子:在表中有兩個(gè)字段: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處理的方法:-建立測(cè)試環(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-生成臨時(shí)表,按照in_date排序select*into#fromaorderbyin_date-相同的時(shí)間,
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語句進(jìn)行高效果分頁發(fā)布時(shí)間:2
16、008.01.2104:50來源:賽迪網(wǎng)作者:10687在程序的開發(fā)過程中,處理分頁是大家接觸比較頻繁的事件,因?yàn)楝F(xiàn)在軟件基本上都是與數(shù)據(jù)庫進(jìn)行掛釣的。但效率又是我們所追求的,如果是像原來那樣把所有滿足條件的記錄全部都選擇出來,再去進(jìn)行分頁處理,那么就會(huì)多多的浪費(fèi)掉許多的系統(tǒng)處理時(shí)間。為了能夠把效率提高,所以現(xiàn)在我們就只選擇我們需要的數(shù)據(jù),減少數(shù)據(jù)庫的處理時(shí)間,以下就是常用SQL分頁處理:1、SQLServer、Access數(shù)據(jù)庫這都微軟的數(shù)據(jù)庫,都是一家人,基本的操作都是差不多,常采用如下分頁語句:PAGESIZE:每頁顯示的記錄數(shù)CURRENTPAGE:當(dāng)前頁號(hào)數(shù)據(jù)表的名字是:compon
17、ents索引主鍵字是:idselecttopPAGESIZE*fromcomponentswhereidnotin(selecttop(PAGESIZE*(CURRENT1)idfromcomponentsorderbyid)orderbyid如下列:selecttop10*fromcomponentswhereidnotin(selecttop10*10idfromcomponentsorderbyid)orderbyid從101條記錄開始選擇,只選擇前面的10條記錄2、Oracle數(shù)據(jù)庫因?yàn)镺racle數(shù)據(jù)庫沒有Top關(guān)鍵字,所以這里就不能夠像微軟的數(shù)據(jù)據(jù)那樣操作,這里有兩種方法:(1)、
18、一種是利用相反的。PAGESIZE:每頁顯示的記錄數(shù)CURRENTPAGE:當(dāng)前頁號(hào)數(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,這個(gè)是Oracle查詢自動(dòng)返回的序號(hào),一般不顯示,但是可以通過selectrownumfrom表名看到,注意,它是從1到
20、當(dāng)前的記錄總數(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字段序號(hào),AS字段名,CASEWHENCOLUMNPROPERTY(a.id,,IsIdentity)=1THENELSEENDAS標(biāo)識(shí),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長(zhǎng)度,COLUMNPROPERTY(a.id,,PRECISION)AS精度
23、,ISNULL(COLUMNPROPERTY(a.id,,Scale),0)AS小數(shù)位數(shù),CASEWHENa.isnullable=1THENELSEENDAS允許空,ISNULL(e.text,)AS默認(rèn)值,ISNULL(g.value,)AS字段說明,d.crdateAS創(chuàng)建時(shí)間,CASEWHENa.colorder=1THENd.refdateELSENULLENDAS更改時(shí)間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)建時(shí)間,c.refdateAS更改時(shí)間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ù).存儲(chǔ)過程.觸發(fā)器.sqlSELECTDISTINCTTOP100PERCENTo.xtype,CASEo.xtypeWHENXTHEN擴(kuò)展存儲(chǔ)過程WHENTRTHEN觸發(fā)器WHENPKTHEN主鍵WHENFTHEN外鍵WHENCTHEN約束WHENVTHEN視圖WHENFNTHEN函數(shù)-標(biāo)量WHENIFTHEN函數(shù)-內(nèi)嵌WHENTFTHEN函數(shù)-表值ELSE存儲(chǔ)過程ENDAS類型,AS對(duì)象名,o.crdateAS創(chuàng)建時(shí)間,o.refdateAS更改時(shí)間,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擴(kuò)展存儲(chǔ)過程WHENTRTHEN觸發(fā)器WHENPKTHEN主鍵WHENFTHEN外鍵WHENCTHEN約束WHENVTHEN視圖WHENFNTHEN函數(shù)-標(biāo)量WHENIFTHEN函數(shù)-內(nèi)嵌WHENTFTHEN函數(shù)-表值ELSE存儲(chǔ)過程ENDDESC兩個(gè)表間不存在的insert與存在的update發(fā)布時(shí)間:200
30、8.02.2905:07來源:賽迪網(wǎng)作者:Alice兩個(gè)表間,不存在的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實(shí)現(xiàn)跨多個(gè)表格的數(shù)據(jù)進(jìn)行組合的SQL語句(1)發(fā)布時(shí)間:2008.01.2507:38來源:賽迪網(wǎng)作者:武西在對(duì)跨多個(gè)表格的數(shù)據(jù)進(jìn)行組合時(shí),有時(shí)很難搞清楚要使用哪一個(gè)SQL句法。我將在這里對(duì)將多個(gè)表格中的查詢合并至單一聲明中的常用方式進(jìn)行闡述。在這篇文章中的樣本查詢符合SQL92ISO標(biāo)準(zhǔn)。不是所有的數(shù)據(jù)庫生產(chǎn)商都遵循這項(xiàng)標(biāo)準(zhǔn),而且很多廠商采取的提升措施會(huì)帶來一些意料不到的后果。如果你不確定你的數(shù)據(jù)庫是不是支持這些標(biāo)準(zhǔn),你可以參看生產(chǎn)廠商的有關(guān)資料。SELECT一個(gè)簡(jiǎn)單的SELECT聲明就是查詢多個(gè)表格的最基本的方式。你可以在FROM子句中調(diào)用
42、多個(gè)表格來組合來自多個(gè)表格的結(jié)果。這里是一個(gè)它如何工作的實(shí)例:以下為引用的內(nèi)容:SELECTtable1.column1,table2.column2FROMtable1,table2WHEREtable1.column1=table2.column1;這個(gè)實(shí)例中,我使用點(diǎn)號(hào)(table1.column1)來指定專欄來自哪一個(gè)表格。如果所涉及的專欄只在一個(gè)參考的表格中出現(xiàn),你就不需要加入完整的名稱,但是加入完整名稱會(huì)對(duì)可讀性起到幫助。在FROM子句中表格之間由逗號(hào)來分隔,你可以加入所需的任意多的表格,盡管一些數(shù)據(jù)庫有一個(gè)在引入正式的JOIN聲明之前他們可以有效地處理的內(nèi)容這方面的限制,這個(gè)將在
43、下面談到。這個(gè)句法是一個(gè)簡(jiǎn)單的INNERJOIN。一些數(shù)據(jù)庫將它看成與一個(gè)外部的JOIN是等同的。WHERE子句告知數(shù)據(jù)庫哪一個(gè)區(qū)域要做關(guān)聯(lián),而且它返回結(jié)果時(shí),就像列出的表格在給定的條件下組合成一個(gè)單獨(dú)的表格一樣。值得注意的是,你的比較條件并不需要與你作為結(jié)果組返回的專欄相同。在上面的例子中,table1.column1和table2.column1用來組合表格,但是返回的卻是table2.column2。你可以在WHERE子句中使用AND關(guān)鍵字來將這個(gè)功能擴(kuò)展至多于兩個(gè)的表格。你還可以使用這樣的表格組合來限制你的結(jié)果而不用實(shí)際地從每個(gè)表格返回專欄。在下面的例子中,table3與table1匹
44、配,但是我沒有從table3返回任何東西來顯示。我只是確保來自table1的有關(guān)專欄存在于table3之中。注意此例中table3需要在FROM子句中被引用。以下為引用的內(nèi)容:SELECTtable1.column1,table2.column2FROMtable1,table2,table3WHEREtable1.column1=table2.column1ANDtable1.column1=table3.column1;然而,要注意的是,這個(gè)查詢多個(gè)表格的方式是一個(gè)暗指的JOIN。你的數(shù)據(jù)庫可能對(duì)事物進(jìn)行不同的處理,這取決于它所使用的優(yōu)化引擎。而且,忽略對(duì)與WHERE子句的相關(guān)特性的定義將
45、會(huì)給你帶來不愿看到的結(jié)果,例如從余下的查詢中返回與每一個(gè)可能的結(jié)果相關(guān)的專欄的rogue域,就像在CROSSJOIN之中一樣。如果你習(xí)慣于你的數(shù)據(jù)庫處理這種類型的聲明的方式,且你只對(duì)兩個(gè)或是少數(shù)幾個(gè)表格進(jìn)行組合,一個(gè)簡(jiǎn)單的SELECT聲明就可以達(dá)到目的。JOINJOIN的工作方式與SELECT聲明是相同的,它從不同的表格中返回一個(gè)帶有專欄的結(jié)果組。在暗含的JOIN之上使用外部JOIN的優(yōu)勢(shì)是對(duì)你的結(jié)果組的更好的控制,而且還可能在涉及很多個(gè)表格的情況下提升性能表現(xiàn)。JOIN的類型有幾種:LEFT,RIGHT,F(xiàn)ULLOUTER,INNER和CROSS。你所使用的類型是由你想要看到的結(jié)果所決定的。
46、例如,使用LEFTOUTERJOIN將會(huì)從列出的第一個(gè)表格中返回所有有關(guān)的行,而同時(shí)如果沒有信息與第一個(gè)表格相關(guān)的話將潛在地從所列出的第二個(gè)表格中加入行。在這里INNERJOIN和暗含的JOIN是不同的,INNERJOIN將只返回那些在兩個(gè)表格中都有數(shù)據(jù)的行。對(duì)第一個(gè)SELECT查詢使用如下JOIN聲明:以下為引用的內(nèi)容:SELECTtable1.column1,table2.column2FROMtable1INNERJOINtable2ONtable1.column1=table2.column1;子查詢子查詢,或叫子選擇聲明,是在一個(gè)查詢中將結(jié)果組作為資源使用的一個(gè)途徑。他經(jīng)常被用來對(duì)結(jié)
47、果進(jìn)行限制或定義,而不是運(yùn)行多個(gè)查詢或操縱應(yīng)用軟件之中的數(shù)據(jù)。有了子查詢,你可以參考表格來決定數(shù)據(jù)的內(nèi)含,或是在一些情況下,返回一個(gè)專欄,而這個(gè)專欄是一個(gè)子選擇的結(jié)果。下面的例子中使用了兩個(gè)表格。一個(gè)表格中包含了我想要返回的數(shù)據(jù),而另一個(gè)表格則給出一個(gè)比較點(diǎn)來確定什么數(shù)據(jù)是我確實(shí)感興趣的。以下為引用的內(nèi)容:SELECTcolumn1FROMtable1WHEREEXISTS(SELECTcolumn1FROMtable2WHEREtable1.column1=table2.column1);子查詢很重要的一個(gè)方面就是性能表現(xiàn)。便利性是有代價(jià)的,它取決于你所使用的表格和聲明的大小,數(shù)量和復(fù)雜性,
48、還有你可能會(huì)允許你的應(yīng)用軟件做處理工作。每一個(gè)查詢?cè)诒恢鞑樵冏鳛橘Y源使用之前,都將被完整地單獨(dú)處理。如果可能的話,創(chuàng)造性地使用JOIN聲明可以以較少的滯后時(shí)間提供出相同的信息。(責(zé)任編輯:盧兆林)深入講解SQLUnion和UnionAll的使用方法發(fā)布時(shí)間:2008.03.1904:41來源:賽迪網(wǎng)作者:李思【賽迪網(wǎng)IT技術(shù)報(bào)道】UNION指令的目的是將兩個(gè)SQL語句的結(jié)果合并起來。從這個(gè)角度來看,我們會(huì)產(chǎn)生這樣的感覺,UNION跟JOIN似乎有些許類似,因?yàn)檫@兩個(gè)指令都可以由多個(gè)表格中擷取資料。UNION的一個(gè)限制是兩個(gè)SQL語句所產(chǎn)生的欄位需要是同樣的資料種類。另外,當(dāng)我們用UNION這個(gè)
49、指令時(shí),我們只會(huì)看到不同的資料值(類似SELECTDISTINCT)。union只是將兩個(gè)結(jié)果聯(lián)結(jié)起來一起顯示,并不是聯(lián)結(jié)兩個(gè)表UNION的語法如下:SQL語句1UNIONSQL語句2假設(shè)我們有以下的兩個(gè)表格,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íng)業(yè)額(sales)的日子。要達(dá)到這個(gè)目的,我們用以下的SQL語句:SELECTDateFROMStore_InformationUNIONSELECTDateFROMInternet_Sales結(jié)果:DateJan-05-1999Jan-07-1999Jan-08-1999Jan-10-1999Jan-11-1999Jan-12-1999有一點(diǎn)值得注意的是,如果我們?cè)谌魏我粋€(gè)SQL語句(或是兩句都一起)用SELECTDISTINCTDate的話,那我們會(huì)得到完全一樣的結(jié)果。SQLUnionAllUNIONALL這個(gè)指令的目的也是
51、要將兩個(gè)SQL語句的結(jié)果合并在一起。UNIONALL和UNION不同之處在于UNIONALL會(huì)將每一筆符合條件的資料都列出來,無論資料值有無重復(fù)。UNIONALL的語法如下:SQL語句1UNIONALLSQL語句2我們用和上一頁同樣的例子來顯示出UNIONALL和UNION的不同。同樣假設(shè)我們有以下兩個(gè)表格: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íng)業(yè)額以及網(wǎng)絡(luò)營(yíng)業(yè)額的日子。要達(dá)到這個(gè)目的,我們用以下的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、合并兩個(gè)表除去重復(fù)的數(shù)據(jù)(以表2的數(shù)據(jù)為主),我們將會(huì)得到以下的表:ABa1b0c0d0e4selectA,Bfrom表1whereAnotin(selectAfrom表2)unionselectA,Bfrom表2巧用一條SQL實(shí)現(xiàn)其它進(jìn)制到十進(jìn)制轉(zhuǎn)換發(fā)布時(shí)間:2007.09.2504:57來源:賽迪網(wǎng)作者:han問:怎樣實(shí)現(xiàn)ORACLE中用一條SQL實(shí)現(xiàn)其它進(jìn)制到十進(jìn)制的轉(zhuǎn)換?答:具體示例如下:二進(jìn)制轉(zhuǎn)換十進(jìn)制selectsum(data1)from(selectsubstr(1101,rownum,1)*power(2,length(1101)-rownum)data1fromdualco
54、nnectbyrownum=length(1101)八進(jìn)制轉(zhuǎn)換十進(jìn)制selectsum(data1)from(selectsubstr(1101,rownum,1)*power(8,length(1101)-rownum)data1fromdualconnectbyrownum=length(1101)十六進(jìn)制轉(zhuǎn)換十進(jì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)注釋:對(duì)其它進(jìn)制可以根據(jù)例子將power的底數(shù)改成相應(yīng)的進(jìn)制就可以了。本文只是一個(gè)例子,大家可以把它封裝成一個(gè)通用函數(shù)進(jìn)行實(shí)用。大家在試的時(shí)候?qū)⒗锩嫦鄳?yīng)的其它進(jìn)制的數(shù)值換成自己的數(shù)據(jù)就可以了(有多處)。實(shí)例講解如何才能讓你的SQL運(yùn)行得更快(1)發(fā)布時(shí)間:2008.01.2204:52來源:賽迪網(wǎng)作者:10633很多人在使用SQL時(shí)往往會(huì)陷入一個(gè)誤區(qū),即太關(guān)注于所得的結(jié)果是否正確,而忽略了不同的實(shí)現(xiàn)方法之間可能存在的性能差異,這種性能差異在
56、大型的或是復(fù)雜的數(shù)據(jù)庫環(huán)境中(如聯(lián)機(jī)事務(wù)處理OLTP或決策支持系統(tǒng)DSS)中表現(xiàn)得尤為明顯。筆者在工作實(shí)踐中發(fā)現(xiàn),不良的SQL往往來自于不恰當(dāng)?shù)乃饕O(shè)計(jì)、不充份的連接條件和不可優(yōu)化的where子句。在對(duì)它們進(jìn)行適當(dāng)?shù)膬?yōu)化后,其運(yùn)行速度有了明顯地提高!下面我將從這三個(gè)方面分別進(jìn)行總結(jié):為了更直觀地說明問題,所有實(shí)例中的SQL運(yùn)行時(shí)間均經(jīng)過測(cè)試,不超過秒的均表示為(19991201anddate2000(25秒)selectdate,sum(amount)fromrecordgroupbydate(55秒)selectcount(*)fromrecordwheredate19990901andpl
57、acein(BJ,SH)(27秒)分析:date上有大量的重復(fù)值,在非群集索引下,數(shù)據(jù)在物理上隨機(jī)存放在數(shù)據(jù)頁上,在范圍查找時(shí),必須執(zhí)行一次表掃描才能找到這一范圍內(nèi)的全部行。2.在date上的一個(gè)群集索引selectcount(*)fromrecordwheredate19991201anddate2000(14秒)selectdate,sum(amount)fromrecordgroupbydate(28秒)selectcount(*)fromrecordwheredate19990901andplacein(BJ,SH)(14秒)分析:在群集索引下,數(shù)據(jù)在物理上按順序在數(shù)據(jù)頁上,重復(fù)值也排
58、列在一起,因而在范圍查找時(shí),可以先找到這個(gè)范圍的起末點(diǎn),且只在這個(gè)范圍內(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)常同時(shí)存取多列,且每列都含有重復(fù)值可考慮建立組合索引;.組合索引要盡量使關(guān)鍵查詢形成索引覆蓋,其前導(dǎo)列一定是使用最頻繁的列。二、不充份的連接條件:例:表card有7896行,在card_no上有一個(gè)非聚集索引,表account有191122行,在account_no上有一個(gè)非聚集索引,試看在不同的表連接條件下,兩個(gè)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(在第一個(gè)連接條件下,最佳查詢方案是將account作外層表,card作內(nèi)層表,利用card上的索引,其I/O次數(shù)可由以下公式估算為:外層表account上的22541頁+(外層表account的191122行*內(nèi)層表card上對(duì)應(yīng)外層表第一行所要查找的3頁)=595907次I/O在第二個(gè)連接條件下,最佳查詢方案是將card作外層表,account作內(nèi)層表,利用account上的索引,其I/O次數(shù)可由以下公式估算為:外層表card上的1944頁+(外層表card的7896行*內(nèi)層表ac
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 腦卒中中醫(yī)護(hù)理方案
- 哇哈哈創(chuàng)業(yè)計(jì)劃書
- 腦科手術(shù)后護(hù)理
- 物聯(lián)網(wǎng)技術(shù)在物流行業(yè)的應(yīng)用
- 品質(zhì)總監(jiān)年度工作總結(jié)
- 2025年初中地理學(xué)業(yè)水平考試模擬卷:地理環(huán)境演變專題訓(xùn)練
- 2025年消防執(zhí)業(yè)資格考試題庫(綜合案例分析題)消防工程施工合同管理試題
- 2025年消防安全知識(shí)培訓(xùn)考試題庫(火災(zāi)預(yù)防與逃生)應(yīng)急處理試題
- 2025年注冊(cè)會(huì)計(jì)師《會(huì)計(jì)》財(cái)務(wù)報(bào)表分析全真模擬試題解析與答案
- 2025年中考地理模擬卷-聚焦人文地理知識(shí)
- 2025年遼寧省交通高等??茖W(xué)校單招職業(yè)適應(yīng)性測(cè)試題庫必考題
- DB12T 1315-2024城市內(nèi)澇氣象風(fēng)險(xiǎn)等級(jí)
- 歷史-浙江天域全國(guó)名校協(xié)作體2025屆高三下學(xué)期3月聯(lián)考試題和解析
- 高等數(shù)學(xué)(慕課版)教案 教學(xué)設(shè)計(jì)-1.3 極限的運(yùn)算法則;1.4 極限存在準(zhǔn)則與兩個(gè)重要極限
- 2025年淮北職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫附答案
- 2025屆高三化學(xué)一輪復(fù)習(xí) 化學(xué)工藝流程題說題 課件
- 第四周主題班會(huì)教案38婦女節(jié)《“致敬了不起的她”》
- 2025中國(guó)福州外輪代理限公司招聘15人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 醫(yī)院化驗(yàn)室管理制度
- 新課標(biāo)(水平三)體育與健康《籃球》大單元教學(xué)計(jì)劃及配套教案(18課時(shí))
- (2024)湖南省公務(wù)員考試《行測(cè)》真題卷及答案解析
評(píng)論
0/150
提交評(píng)論