1、SQL編程有許多獨(dú)特之處,如:面向集合的思維方式、查詢(xún)?cè)氐倪壿嬏幚眄樞颉⑷壿?。如果不掌握這些知識(shí)就開(kāi)始用SQL編程,得到的將是冗余的、性能低下的代碼,而且難以維護(hù)。 2、在SQLServer中負(fù)責(zé)生成實(shí)際工作計(jì)劃(執(zhí)行計(jì)劃)的組件是:查詢(xún)優(yōu)化器(que
1、SQL編程有許多獨(dú)特之處,如:面向集合的思維方式、查詢(xún)?cè)氐倪壿嬏幚眄樞?、?#20540;邏輯。如果不掌握這些知識(shí)就開(kāi)始用SQL編程,得到的將是冗余的、性能低下的代碼,而且難以維護(hù)。
2、在SQLServer中負(fù)責(zé)生成實(shí)際工作計(jì)劃(執(zhí)行計(jì)劃)的組件是:查詢(xún)優(yōu)化器(query optimizer)。只有在確保結(jié)果集正確的前提下,優(yōu)化器才會(huì)走捷徑。明確區(qū)分查詢(xún)的邏輯處理和物理處理是非常重要的。
3、邏輯查詢(xún)的各個(gè)階段:
(5) SELECT (5-2) DISTINCT (5-3) TOP () (5-1) (1) FROM (1-J) JOIN ON |(1-A) APPLY AS |(1-P) PIVOT ( ) AS |(1-U) UNPIVOT () AS (2) WHERE (3) GROUP BY (4) HAVING (6) ORDER BY ;
第一步:FROM :表示出查詢(xún)的來(lái)源表,在聯(lián)結(jié)運(yùn)算中涉及的階段是(1-J1)笛卡兒積、(1-J2)ON篩選器和(1-J3)添加外部行。并生成虛擬表VT1。
1.1、笛卡兒積:兩表執(zhí)行笛卡兒積,生成虛擬表VT1-J1。
1.2、ON篩選器:針對(duì)VT1-J1中滿(mǎn)足ON為true的行,插入VT1-J2。
1.3、添加外部行:如果指定了OUTER JOIN (相對(duì)于CROSS JOIN或INNER JOIN ),則將保留表中沒(méi)有匹配的行,作為外部行添加,生成VT1-J3。
第二步:WHERE:根據(jù)WHERE 子句中的謂詞對(duì)VT1中的數(shù)據(jù)進(jìn)行行篩選,只對(duì)結(jié)果為T(mén)RUE的行,插入VT2。
第三步:GROUP BY :根據(jù)group by中的列表,將VT2進(jìn)行分組,每一組只有一個(gè)結(jié)果行,生成VT3。
第四步:HAVING:根據(jù)HAVING出現(xiàn)的謂詞對(duì)VT3金信篩選,只讓結(jié)果為T(mén)RUE的組才插入VT4。
第五步:SELECT:處理SELECT 子句中的元素,產(chǎn)生VT5。
5.1、計(jì)算表達(dá)式:根據(jù)SELECT 列表中的表達(dá)式,生成VT5-1。
5.2、DISTINCT:刪除VT5-1中重復(fù)的行,生成VT5-2。
5.3、TOP:根據(jù)ORDER BY 子句定義邏輯排序,從VT5-2中選擇前面指定數(shù)量或百分比的行,生產(chǎn)VT5-3。
第六步:ORDER BY :根據(jù)ORDER BY 子句中指定的列名,對(duì)VT5-3進(jìn)行排序。生成游標(biāo)VC6。
對(duì)于三值邏輯:
a、所有的查詢(xún)篩選器(ON、WHERE 和HAVING )都把null當(dāng)作FALSE來(lái)處理。
b、check約束中的null值被當(dāng)作TRUE來(lái)對(duì)待。
c、UNIQUE約束、集合運(yùn)算(UNION 和EXCEPT)、及排序和分組操作,認(rèn)為兩個(gè)null是相等的。
注意:
1、如果FROM 子句中有多個(gè)表運(yùn)算符,則按從左到右的順序進(jìn)行處理。每個(gè)表運(yùn)算符的結(jié)果作為下一個(gè)表運(yùn)算符的左輸入,最后生成虛擬表作為下一階段的輸入。
2、因?yàn)樵赪HERE之前還沒(méi)對(duì)數(shù)據(jù)分組,所以WHERE 子句不能使用聚合。在篩選器中,ON對(duì)保留表中部分行的刪除并不是最終的,而WHERE是最終的。只有使用外聯(lián)結(jié)的時(shí)候,ON和WHERE才有邏輯區(qū)別。
3、如果在查詢(xún)中指定了GROUP BY ,后續(xù)所有步驟都只能在指定的分組上操作。
4、HAVING是唯一可用于分組數(shù)據(jù)的篩選器。
5、由于SQL具有多個(gè)運(yùn)算同時(shí)計(jì)算(all-at-once operation),所以SELECT 語(yǔ)句中的邏輯順序是無(wú)關(guān)的。
6、ORDER BY 是唯一可以使用SELECT 中別名的步驟。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com