版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
知識(shí)點(diǎn):1、SQL查詢語(yǔ)句邏輯執(zhí)行順序下面是一個(gè)查詢語(yǔ)句的邏輯執(zhí)行順序(每段語(yǔ)句都標(biāo)明了執(zhí)行順序號(hào)): 執(zhí)行1:FROM 執(zhí)行2:ON 執(zhí)行3:JOIN 執(zhí)行4:WHERE 執(zhí)行5:GROUPBY 執(zhí)行6:HAVING 執(zhí)行7:SELECT 執(zhí)行8:DISTINCT 執(zhí)行9:ORDERBY 執(zhí)行10:TOP下面是一個(gè)查詢語(yǔ)句的邏輯執(zhí)行順序(每段語(yǔ)句都標(biāo)明了執(zhí)行順序號(hào)): 執(zhí)行7:SELECT 執(zhí)行8:DISTINCT<select_list> 執(zhí)行1:FROM<left_table> 執(zhí)行3:<join_type>JOIN<right_table> 執(zhí)行2:ON<join_condition> 執(zhí)行4:WHERE<where_condition> 執(zhí)行5:GROUPBY<group_by_list> 執(zhí)行6:HAVING<having_condition> 執(zhí)行9:ORDERBY<order_by_condition> 執(zhí)行10:TOP<limit_number>2、SQL查詢語(yǔ)句邏輯執(zhí)行過(guò)程原始數(shù)據(jù)庫(kù)原始數(shù)據(jù)庫(kù)FROM語(yǔ)句VT1(虛擬表)WHERE語(yǔ)句VT2(虛擬表)GROUPBY語(yǔ)句VT3(虛擬表)HAVING語(yǔ)句VT4(虛擬表)ORDERBY語(yǔ)句VT5(虛擬表)SELECT語(yǔ)句最終結(jié)果(1)FROM:對(duì)FROM子句中的前兩個(gè)表執(zhí)行笛卡爾積(Cartesianproduct)(交叉聯(lián)接),生成虛擬表VT1(2)執(zhí)行ON:對(duì)VT1應(yīng)用ON篩選器。只有那些使JOIN<join_condition>為真的行才被插入VT2。(3)OUTER(JOIN):如果指定了OUTERJOIN(相對(duì)于CROSSJOIN或(INNERJOIN),保留表(preservedtable:左外部聯(lián)接把左表標(biāo)記為保留表,右外部聯(lián)接把右表標(biāo)記為保留表,完全外部聯(lián)接把兩個(gè)表都標(biāo)記為保留表)中未找到匹配的行將作為外部行添加到VT2,生成VT3.如果FROM子句包含兩個(gè)以上的表,則對(duì)上一個(gè)聯(lián)接生成的結(jié)果表和下一個(gè)表重復(fù)執(zhí)行步驟1到步驟3,直到處理完所有的表為止。(4)WHERE:對(duì)VT3應(yīng)用WHERE篩選器。只有使<where_condition>為true的行才被插入VT4.(5)GROUPBY:按GROUPBY子句中的列列表對(duì)VT4中的行分組,生成VT5.(6)HAVING:對(duì)VT5應(yīng)用HAVING篩選器。只有使<having_condition>為true的組才會(huì)被插入VT6.(7)SELECT:處理SELECT列表,產(chǎn)生VT7.(8)DISTINCT:將重復(fù)的行從VT7中移除,產(chǎn)生VT8.(9)ORDERBY:將VT8中的行按ORDERBY子句中的列列表排序,生成游標(biāo)(VC9).(10)TOP:從VC9的開始處選擇指定數(shù)量或比例的行,生成表VT10,并返回調(diào)用者。備注:步驟10,按ORDERBY子句中的列列表排序上步返回的行,返回游標(biāo)VC10.這一步是第一步也是唯一一步可以使用SELECT列表中的列別名的步驟。這一步不同于其它步驟的是,它不返回有效的表,而是返回一個(gè)游標(biāo)。SQL是基于集合理論的。集合不會(huì)預(yù)先對(duì)它的行排序,它只是成員的邏輯集合,成員的順序無(wú)關(guān)緊要。對(duì)表進(jìn)行排序的查詢可以返回一個(gè)對(duì)象,包含按特定物理順序組織的行。ANSI把這種對(duì)象稱為游標(biāo)。理解這一步是正確理解SQL的基礎(chǔ)。因?yàn)檫@一步不返回表(而是返回游標(biāo)),使用了ORDERBY子句的查詢不能用作表表達(dá)式。表表達(dá)式包括:視圖、內(nèi)聯(lián)表值函數(shù)、子查詢、派生表和共用表達(dá)式。它的結(jié)果必須返回給期望得到物理記錄的客戶端應(yīng)用程序。例如,下面的派生表查詢無(wú)效,并產(chǎn)生一個(gè)錯(cuò)誤:select*from(selectorderid,customeridfromordersorderbyorderid)asd下面的視圖也會(huì)產(chǎn)生錯(cuò)誤:createviewmy_viewasselect*fromordersorderbyorderid在SQL中,表表達(dá)式中不允許使用帶有ORDERBY子句的查詢,而在T—SQL中卻有一個(gè)例外(應(yīng)用TOP選項(xiàng))。所以要記住,不要為表中的行假設(shè)任何特定的順序。換句話說(shuō),除非你確定要有序行,否則不要指定ORDERBY子句。排序是需要成本的。3、案例演練createdatabasedbtestcreatetablecust( numbervarchar(10), cityvarchar(10))createtable[order]( idint, custnovarchar(100))INSERTINTOcust(number,city)VALUES('163','杭州');INSERTINTOcust(number,city)VALUES('九游','上海');INSERTINTOcust(number,city)VALUES('騰迅','杭州');INSERTINTOcust(number,city)VALUES('百度','杭州');INSERTINTO[order](id,custno)VALUES(1,'163');INSERTINTO[order](id,custno)VALUES(2,'163');INSERTINTO[order](id,custno)VALUES(3,'九游');INSERTINTO[order](id,custno)VALUES(4,'九游');INSERTINTO[order](id,custno)VALUES(5,'九游');INSERTINTO[order](id,custno)VALUES(6,'騰迅');INSERTINTO[order](id,custno)VALUES(7,NULL);3.0、準(zhǔn)備測(cè)試的SQl語(yǔ)句SELECTt1.number,COUNT(t2.id)ascountnoFROMcustt1LEFTJOIN[order]t2ONt1.number=t2.custnoWHEREt1.city='杭州'GROUPBYt1.numberHAVINGcount(t2.id)<2ORDERBYcountnoDESC;3.1、執(zhí)行1:FROM語(yǔ)句經(jīng)過(guò)FROM語(yǔ)句對(duì)兩個(gè)表執(zhí)行笛卡爾積,會(huì)得到一個(gè)虛擬表,暫且叫VT1,內(nèi)容如下:NumberCityIdcustno163杭州1163163杭州2163163杭州3九游163杭州4九游163杭州5九游163杭州6騰迅163杭州7NULL九游上海1163九游上海2163九游上海3九游九游上海4九游九游上海5九游九游上海6騰迅九游上海7NULL騰迅杭州1163騰迅杭州2163騰迅杭州3九游騰迅杭州4九游騰迅杭州5九游騰迅杭州6騰迅騰迅杭州7NULL百度杭州1163百度杭州2163百度杭州3九游百度杭州4九游百度杭州5九游百度杭州6騰迅百度杭州7NULL總共有4*7=28(cust的記錄條數(shù)*order的記錄條數(shù))條記錄。這就是VT1的結(jié)果,接下來(lái)的操作就在VT1的基礎(chǔ)上進(jìn)行。3.2、執(zhí)行2:ON過(guò)濾執(zhí)行完笛卡爾積以后,接著就進(jìn)行ONt1.number=t2.custno條件過(guò)濾,根據(jù)ON中指定的條件,去掉那些不符合條件的數(shù)據(jù),得到VT2表,內(nèi)容如下:NumberCityIdcustno163杭州1163163杭州2163九游上海3九游九游上海4九游九游上海5九游騰迅杭州6騰迅VT2就是經(jīng)過(guò)ON條件篩選以后得到的有用數(shù)據(jù),而接下來(lái)的操作將在VT2的基礎(chǔ)上繼續(xù)進(jìn)行。3.3、執(zhí)行3:添加外部行這一步只有在連接類型為OUTERJOIN時(shí)才發(fā)生,如LEFTOUTERJOIN、RIGHTOUTERJOIN和FULLOUTERJOIN。在大多數(shù)的時(shí)候,我們都是會(huì)省略掉OUTER關(guān)鍵字的,但OUTER表示的就是外部行的概念。LEFTOUTERJOIN把左表記為保留表,得到的結(jié)果為:NumberCityIdcustno163杭州1163163杭州2163九游上海3九游九游上海4九游九游上海5九游騰迅杭州6騰迅百度杭州NULLNULLRIGHTOUTERJOIN把右表記為保留表,得到的結(jié)果為:NumberCityIdcustno163杭州1163163杭州2163九游上海3九游九游上海4九游九游上海5九游騰迅杭州6騰迅NULLNULL7NULLFULLOUTERJOIN把左右表都作為保留表,得到的結(jié)果為:NumberCityIdcustno163杭州1163163杭州2163九游上海3九游九游上海4九游九游上海5九游騰迅杭州6騰迅百度杭州NULLNULLNULLNULL7NULL添加外部行的工作就是在VT2表的基礎(chǔ)上添加保留表中被過(guò)濾條件過(guò)濾掉的數(shù)據(jù),非保留表中的數(shù)據(jù)被賦予NULL值,最后生成虛擬表VT3。本例使用的是LEFTJOIN,過(guò)濾掉了以下這條數(shù)據(jù):NumberCityIdcustno百度杭州NULLNULL現(xiàn)在就把這條數(shù)據(jù)添加到VT2表中,得到的VT3表如下:NumberCityIdcustno163杭州1163163杭州2163九游上海3九游九游上海4九游九游上海5九游騰迅杭州6騰迅百度杭州NULLNULL3.4、執(zhí)行4:WHERE過(guò)濾對(duì)添加外部行得到的VT3進(jìn)行WHERE過(guò)濾,只有符合<where_condition>的記錄才會(huì)輸出到虛擬表VT4中。當(dāng)我們執(zhí)行WHEREt1.city='杭州'的時(shí)候,就會(huì)得到以下內(nèi)容,并存在虛擬表VT4中:NumberCityIdcustno163杭州1163163杭州2163騰迅杭州6騰迅百度杭州NULLNULL但是在使用WHERE子句時(shí),需要注意以下兩點(diǎn):由于數(shù)據(jù)還沒(méi)有分組,因此現(xiàn)在還不能在WHERE過(guò)濾器中使用where_condition=MIN(col)這類對(duì)分組統(tǒng)計(jì)的過(guò)濾;由于還沒(méi)有進(jìn)行列的選取操作,因此在SELECT中使用列的別名也是不被允許的,如:SELECTcityascFROMtWHEREc='shanghai';是不允許出現(xiàn)的。3.5、執(zhí)行5:GROUPBY分組GROUPBY子句主要是對(duì)使用WHERE子句得到的虛擬表進(jìn)行分組操作。我們執(zhí)行測(cè)試語(yǔ)句中的GROUPBYt1.number,以number列的數(shù)值開始分組,值一樣的分為一組,就會(huì)得到以下內(nèi)容:NumberCityIdcustno163杭州1163騰迅杭州6騰迅百度杭州NULLNULL得到的內(nèi)容會(huì)存入虛擬表VT5中,此時(shí),我們就得到了一個(gè)VT5虛擬表,接下來(lái)的操作都會(huì)在該表上完成。3.6、執(zhí)行6:HAVING過(guò)濾HAVING子句主要和GROUPBY子句配合使用,對(duì)分組得到的VT5虛擬表進(jìn)行條件過(guò)濾。當(dāng)我執(zhí)行測(cè)試語(yǔ)句中的HAVINGcount(t2.id)<2時(shí),在執(zhí)行5對(duì)number列分組時(shí),163有兩行數(shù)據(jù)合并,在這里不符合HAVING過(guò)濾,將得到以下內(nèi)容:NumberCityIdcustno騰迅杭州6騰迅百度杭州NULLNULL這就是虛擬表VT6。3.7、執(zhí)行7:SELECT列表現(xiàn)在才會(huì)執(zhí)行到SELECT子句,不要以為SELECT子句被寫在第一行,就是第一個(gè)被執(zhí)行的。我們執(zhí)行測(cè)試語(yǔ)句中的SELECTt1.number,COUNT(t2.id)ascountno,從虛擬表VT6中選擇出我們需要的內(nèi)容。我們將得到以下內(nèi)容:numbercountno騰迅1百度0不,還沒(méi)有完,這只是虛擬表VT7。3.8、執(zhí)行8:DISTINCT子句如果在查詢中指定了DISTINCT子句,則會(huì)創(chuàng)建一張內(nèi)存臨時(shí)表(如果內(nèi)存放不下,就需要存放在硬盤了)。這張臨時(shí)表的表結(jié)構(gòu)和上一步產(chǎn)生的虛擬表VT7是一樣的,不同的是對(duì)進(jìn)行DISTINCT操作的列增加了一個(gè)唯一索引,以此來(lái)除重復(fù)數(shù)據(jù)。由于我的測(cè)試SQL語(yǔ)句中并沒(méi)有使用DISTINCT,所以,在該查詢中,這一步不會(huì)生成一個(gè)虛擬表。3.9、執(zhí)行9:ORDERBY子句對(duì)虛擬表中的內(nèi)容按照指定的列進(jìn)行排序,然后返回一個(gè)新的虛擬表,我們執(zhí)行測(cè)試SQL語(yǔ)句中的ORDERBYcountnoDESC,會(huì)把countno數(shù)字大的排前面,就會(huì)得到
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ī)?;鸨O(jiān)管與醫(yī)院成本核算標(biāo)準(zhǔn)化
- 區(qū)域健康差異背景下健康教育資源配置精準(zhǔn)化
- 前列腺癌放療與PSA動(dòng)態(tài)監(jiān)測(cè)預(yù)后價(jià)值
- 上海市民立中學(xué)2026屆生物高一第一學(xué)期期末達(dá)標(biāo)測(cè)試試題含解析
- 云南省馬關(guān)縣第二中學(xué)2026屆高一數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)檢測(cè)試題含解析
- 黑龍江省肇東一中2026屆高二上生物期末統(tǒng)考試題含解析
- 兒童腫瘤個(gè)體化治療的特殊考量
- 兒童焦慮的認(rèn)知行為治療中的家庭作業(yè)設(shè)計(jì)
- 兒科門診兒童誤服藥物家屬防范教育的效果
- 兒科知情同意中的游戲化溝通設(shè)計(jì)
- 2025年查對(duì)制度考核考試題庫(kù)(答案+解析)
- 云南省2025年普通高中學(xué)業(yè)水平合格性考試歷史試題
- 四川省2025年高職單招職業(yè)技能綜合測(cè)試(中職類)汽車類試卷(含答案解析)
- GB/T 24002.1-2023環(huán)境管理體系針對(duì)環(huán)境主題領(lǐng)域應(yīng)用GB/T 24001管理環(huán)境因素和應(yīng)對(duì)環(huán)境狀況的指南第1部分:通則
- 高考英語(yǔ)閱讀理解專項(xiàng)練習(xí)100篇
- 燃機(jī)三菱控制系統(tǒng)簡(jiǎn)述課件
- 2022年醫(yī)務(wù)科年度工作總結(jié)范文
- 稽核管理培訓(xùn)課件
- 貨幣銀行學(xué)課件(完整版)
- 臨時(shí)電箱日常巡查記錄表
- 公民戶口遷移審批表
評(píng)論
0/150
提交評(píng)論