视图、索引、存储过程优缺点
1.視圖
(1).什么是視圖?
視圖(View)作為一種數(shù)據(jù)庫(kù)對(duì)象,為用戶(hù)提供了一個(gè)可以檢索數(shù)據(jù)表中的數(shù)據(jù)方式。用戶(hù)通過(guò)視圖來(lái)瀏覽數(shù)據(jù)表中感興趣的部分或全部數(shù)據(jù),而數(shù)據(jù)的物理存儲(chǔ)位置仍然在表中。
視圖是一個(gè)虛擬表,并不代表任何物理數(shù)據(jù),只是用來(lái)查看數(shù)據(jù)的窗口而已。視圖并不是以一組數(shù)據(jù)的形式存儲(chǔ)在數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)中只存儲(chǔ)視圖的定義,而不存儲(chǔ)視圖對(duì)應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存儲(chǔ)在導(dǎo)出視圖的基本表中。當(dāng)基本表中的數(shù)據(jù)發(fā)生變化時(shí),從視圖中查詢(xún)出來(lái)的數(shù)據(jù)也隨之改變。
視圖中的數(shù)據(jù)行和列都是來(lái)自于基本表,是在視圖被引用時(shí)動(dòng)態(tài)生成的。使用視圖可以集中、簡(jiǎn)化和制定用戶(hù)的數(shù)據(jù)庫(kù)顯示,用戶(hù)可以通過(guò)視圖來(lái)訪(fǎng)問(wèn)數(shù)據(jù),而不必直接去訪(fǎng)問(wèn)該視圖的基本表。
視圖由視圖名和視圖定義兩個(gè)部分組成。視圖是從一個(gè)或多個(gè)表導(dǎo)出來(lái)的表,它實(shí)際上是一個(gè)查詢(xún)結(jié)果,視圖的名字和視圖對(duì)應(yīng)的查詢(xún)存儲(chǔ)在數(shù)據(jù)字典中。
(2).視圖的優(yōu)缺點(diǎn)?
<1>.視圖的優(yōu)點(diǎn)
A.數(shù)據(jù)安全性。
對(duì)不同的用戶(hù)定義不同的視圖,使用戶(hù)只能看到與自己有關(guān)的數(shù)據(jù)。數(shù)據(jù)庫(kù)授權(quán)命令可以使每個(gè)用戶(hù)對(duì)數(shù)據(jù)庫(kù)的檢索限制到特定的數(shù)據(jù)庫(kù)對(duì)象上,但不能授權(quán)到數(shù)據(jù)庫(kù)特定行和特定的列上。通過(guò)視圖,用戶(hù)可以被限制在數(shù)據(jù)的不同子集上。
B.查詢(xún)簡(jiǎn)單化。
為復(fù)雜的查詢(xún)建立一個(gè)視圖,用戶(hù)不必輸入復(fù)雜的查詢(xún)語(yǔ)句,只需針對(duì)此視圖做簡(jiǎn)單的查詢(xún)即可。那些被經(jīng)常使用的查詢(xún)可以被定義為視圖,從而使用戶(hù)不必為以后的操作每次都指定全部的條件。
C.邏輯數(shù)據(jù)獨(dú)立性。
視圖可以使應(yīng)用程序和數(shù)據(jù)庫(kù)表在一定程度上獨(dú)立。如果沒(méi)有視圖,應(yīng)用一定是建立在表上的。有了視圖之后,程序可以建立在視圖之上,從而程序與數(shù)據(jù)庫(kù)表被視圖分割開(kāi)來(lái)。
對(duì)于視圖的操作,例如,查詢(xún)只依賴(lài)于視圖的定義,當(dāng)構(gòu)成視圖的基本表需要修改時(shí),只需要修改視圖定義中的子查詢(xún)部分,而基于視圖的查詢(xún)不用改變。
<2>.視圖的缺點(diǎn)
A.性能。
SQL Server必須把視圖的查詢(xún)轉(zhuǎn)化成對(duì)基本表的查詢(xún),如果這個(gè)視圖是由一個(gè)復(fù)雜的多表查詢(xún)所定義,那么,即使是視圖的一個(gè)簡(jiǎn)單查詢(xún),SQL Server也把它變成一個(gè)復(fù)雜的結(jié)合體,需要花費(fèi)一定的時(shí)間。
B.修改限制。
當(dāng)用戶(hù)試圖修改視圖的某些行時(shí),SQL Server必須把它轉(zhuǎn)化為對(duì)基本表的某些行的修改。事實(shí)上,當(dāng)從視圖中插入或者刪除時(shí),情況也是這樣。對(duì)于簡(jiǎn)單視圖來(lái)說(shuō),這是很方便的,但是,對(duì)于比較復(fù)雜的視圖,可能是不可修改的,這些視圖有如下特征:
a.有UNIQUE等集合操作符的視圖。
b.有GROUP BY子句的視圖。
c.有諸如AVG\SUM\MAX等聚合函數(shù)的視圖。
d.使用DISTINCT關(guān)鍵字的視圖。
e.連接表的視圖(其中有些例外)
(3).創(chuàng)建視圖的限制:
在創(chuàng)建視圖時(shí),還要注意試圖必須滿(mǎn)足以下幾點(diǎn)限制:
<1>.不能將規(guī)則或者DEFAULT定義關(guān)聯(lián)于視圖。
<2>.定義視圖的查詢(xún)中不能含有ORDER BY\COMPURER\COMPUTER BY 子句和INTO關(guān)鍵字
<3>.如果視圖中某一列是一個(gè)算術(shù)表達(dá)式、構(gòu)造函數(shù)或者常數(shù),而且視圖中兩個(gè)或者更多的不同列擁有一個(gè)相同的名字(這種情況通常是因?yàn)樵谝晥D的定義中有一個(gè)連接,而且這兩個(gè)或者多個(gè)來(lái)自不同表的列擁有相同的名字),此時(shí),用戶(hù)需要為視圖的每一列指定列的名稱(chēng)。
參考博客:
《使用SQL Server視圖的優(yōu)缺點(diǎn)》
2.索引
(1).什么是索引?
索引是以表列為基礎(chǔ)的數(shù)據(jù)庫(kù)對(duì)象,它保存著表中排序的索引列,并且記錄了索引列在數(shù)據(jù)表中的物理存儲(chǔ)位置,實(shí)現(xiàn)了表中數(shù)據(jù)的邏輯排序,其主要目的是提高SQL Server系統(tǒng)的性能,加快數(shù)據(jù)的查詢(xún)速度和減少系統(tǒng)的響應(yīng)時(shí)間。索引通過(guò)記錄表中的關(guān)鍵值指向表中的記錄,這樣數(shù)據(jù)庫(kù)引擎就不用掃描整個(gè)表而定位到相關(guān)的記錄。相反,如果沒(méi)有索引,則會(huì)導(dǎo)致SQL Server搜索表中的所有記錄,以獲取匹配結(jié)果。
索引除了可以提高查詢(xún)表內(nèi)數(shù)據(jù)的速度以外,還可以使表和表之間的連接速度加快。例如,在實(shí)現(xiàn)數(shù)據(jù)參照完整性時(shí),可以將表的外鍵制作為索引,這樣將加速表與表之間的連接。
(2).索引的分類(lèi)
有3種索引類(lèi)型:聚集索引、非聚集索引和唯一索引。如果表中存在聚集索引,則非聚集索引使用聚集索引來(lái)加快數(shù)據(jù)查詢(xún)。
<1>.聚集索引
聚集索引會(huì)對(duì)表和視圖進(jìn)行物理排序,所以這種索引對(duì)查詢(xún)非常有效,在表和視圖中只能有一個(gè)聚集索引。當(dāng)建立主鍵約束時(shí),如果表中沒(méi)有聚集索引,SQL Server會(huì)用主鍵列作為聚集索引鍵。可以在表的任何列或列的組合上建立索引,實(shí)際應(yīng)用中一般定義成主鍵約束的列建立聚集索引。
<2>.非聚集索引
非聚集索引不會(huì)對(duì)表和視圖進(jìn)行物理排序。如果表中不存在聚集索引,則表示未排序的。在表或視圖中,最多可以建立250個(gè)非聚集索引,或者249個(gè)非聚集索引和1個(gè)聚集索引。
<3>.唯一索引
唯一索引不允許兩行具有相同的索引值。只要列中數(shù)據(jù)是唯一的,就可在同一個(gè)表上創(chuàng)建一個(gè)唯一的聚集索引。如果必須實(shí)施唯一性以確保數(shù)據(jù)的完整性,則應(yīng)在列上創(chuàng)建UNIQUE或PRIMARY KEY約束,而不要?jiǎng)?chuàng)建唯一索引。
(3).使用索引的代價(jià)
雖然索引有很多優(yōu)點(diǎn),但索引的存在也讓系統(tǒng)付出了一定的代價(jià)。創(chuàng)建索引和維護(hù)索引都會(huì)消耗時(shí)間,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改操作時(shí),索引就要進(jìn)行維護(hù),否則索引的作用就會(huì)下降;另外,每個(gè)索引都會(huì)占用一定的物理空間,如果占用的物理空間過(guò)多,就會(huì)影響到整個(gè)SQL Server系統(tǒng)的性能。
(4).建立索引的原則
創(chuàng)建索引雖然可以提高查詢(xún)速度,但是它是犧牲一定的系統(tǒng)性能。因此,在創(chuàng)建時(shí),哪些列適合創(chuàng)建索引,哪些列不適合創(chuàng)建索引,需要進(jìn)行判斷,具體以下原則:
<1>.有主鍵的數(shù)據(jù)列要建立索引。因?yàn)橹麈I可以加速定位到表中的某一行。
<2>.有外鍵的數(shù)據(jù)列要建立索引。外鍵列通常用于表與表之間的連接,在其上創(chuàng)建索引可以加快表間的連接。
<3>.對(duì)于經(jīng)常查詢(xún)的數(shù)據(jù)列最好建立索引。
A.對(duì)于需要在指定范圍內(nèi)快速或頻繁查詢(xún)的數(shù)據(jù)列,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的,查詢(xún)可以利用索引的排序,加快查詢(xún)的時(shí)間。
B.經(jīng)常用在WHERE子句中的數(shù)據(jù)列,將索引建立在WHERE子句的集合過(guò)程中,對(duì)于需要加速或頻繁檢索的數(shù)據(jù)列,可以讓這些經(jīng)常參與查詢(xún)的數(shù)據(jù)列按照索引的排序進(jìn)行查詢(xún),加快查詢(xún)的時(shí)間。
<4>.對(duì)于那些查詢(xún)中很少涉及的列、重復(fù)值比較多的列不要建立索引。
例如,在查詢(xún)中很少使用的列,有無(wú)索引并不能提高查詢(xún)的速度,相反增加了系統(tǒng)維護(hù)時(shí)間和消耗了系統(tǒng)空間。
<5>.對(duì)于定義為text、image和bit數(shù)據(jù)類(lèi)型的列不要建立索引。因?yàn)檫@些數(shù)據(jù)類(lèi)型的數(shù)據(jù)列的數(shù)據(jù)量要么很大、要么很小,不利于使用索引。
參考博客:
《SQLServer索引調(diào)優(yōu)實(shí)踐》
《SQL Server索引維護(hù)指導(dǎo)(1)》
《詳細(xì)講解SQL Server索引的性能問(wèn)題》
3.存儲(chǔ)過(guò)程
(1).什么是存儲(chǔ)過(guò)程?
當(dāng)開(kāi)發(fā)一個(gè)應(yīng)用程序時(shí),為了易于修改和擴(kuò)充,經(jīng)常會(huì)將負(fù)責(zé)不同功能的語(yǔ)句集中起來(lái)而且按照用途分別放置,以便能夠反復(fù)調(diào)用,而這些獨(dú)立放置且擁有不同功能的語(yǔ)言,即是“過(guò)程”(Procedure)。
存儲(chǔ)過(guò)程(Stored Producedures)是一組為完整特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中。用戶(hù)通過(guò)指定存儲(chǔ)過(guò)程的名字給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。
它能夠包含執(zhí)行各種數(shù)據(jù)庫(kù)操作的語(yǔ)句,并且可以調(diào)用其他的存儲(chǔ)過(guò)程;能夠接受輸入?yún)?shù),并以輸出參數(shù)的形式將多個(gè)數(shù)據(jù)值返回給調(diào)用程序(Calling Procedure)或批處理(Batch);向調(diào)用程序或批處理返回一個(gè)狀態(tài)值,以表明成功或失敗(以及失敗的原因)。
(2).存儲(chǔ)過(guò)程的優(yōu)點(diǎn)
<1>.存儲(chǔ)過(guò)程優(yōu)點(diǎn)
A.執(zhí)行速度快。
存儲(chǔ)過(guò)程只在創(chuàng)造時(shí)進(jìn)行編譯,已經(jīng)通過(guò)語(yǔ)法檢查和性能優(yōu)化,以后每次執(zhí)行存儲(chǔ)過(guò)程都不需再重新編譯,而我們通常使用的SQL語(yǔ)句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過(guò)程可提高數(shù)據(jù)庫(kù)執(zhí)行速度。
B.允許組件式編程。
經(jīng)常會(huì)遇到復(fù)雜的業(yè)務(wù)邏輯和對(duì)數(shù)據(jù)庫(kù)的操作,這個(gè)時(shí)候就會(huì)用SP來(lái)封裝數(shù)據(jù)庫(kù)操作。當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí)(如對(duì)多個(gè)表進(jìn)行Update,Insert,Query,Delete時(shí)),可將此復(fù)雜操作用存儲(chǔ)過(guò)程封裝起來(lái)與數(shù)據(jù)庫(kù)提供的事務(wù)處理結(jié)合一起使用。只需創(chuàng)建存儲(chǔ)過(guò)程一次并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中,以后即可在程序中調(diào)用該過(guò)程任意次。在代碼上看,SQL語(yǔ)句和程序代碼語(yǔ)句的分離,可以提高程序代碼的可讀性。
存儲(chǔ)過(guò)程可以設(shè)置參數(shù),可以根據(jù)傳入?yún)?shù)的不同重復(fù)使用同一個(gè)存儲(chǔ)過(guò)程,從而高效的提高代碼的優(yōu)化率和可讀性。
C.減少網(wǎng)絡(luò)流量。
一個(gè)需要數(shù)百行Transact-SQL代碼的操作由一條執(zhí)行過(guò)程代碼的單獨(dú)語(yǔ)句就可實(shí)現(xiàn),而不需要在網(wǎng)絡(luò)中發(fā)送數(shù)百行代碼。
對(duì)于同一個(gè)針對(duì)數(shù)據(jù)庫(kù)對(duì)象的操作,如果這一操作所涉及到的T-SQL語(yǔ)句被組織成一存儲(chǔ)過(guò)程,那么當(dāng)在客戶(hù)機(jī)上調(diào)用該存儲(chǔ)過(guò)程時(shí),網(wǎng)絡(luò)中傳遞的只是該調(diào)用語(yǔ)句,否則將會(huì)是多條SQL語(yǔ)句。從而減輕了網(wǎng)絡(luò)流量,降低了網(wǎng)絡(luò)負(fù)載。
D.提高系統(tǒng)安全性。
可將存儲(chǔ)過(guò)程作為用戶(hù)存取數(shù)據(jù)的管道。可以限制用戶(hù)對(duì)數(shù)據(jù)表的存取權(quán)限,建立特定的存儲(chǔ)過(guò)程供用戶(hù)使用,避免非授權(quán)用戶(hù)對(duì)數(shù)據(jù)的訪(fǎng)問(wèn),保證數(shù)據(jù)的安全。
<2>.存儲(chǔ)過(guò)程缺點(diǎn):
A.移植性差。依賴(lài)于數(shù)據(jù)庫(kù)廠商,難以移植(當(dāng)一個(gè)小系統(tǒng)發(fā)展到大系統(tǒng)時(shí),對(duì)數(shù)據(jù)庫(kù)的要求也會(huì)發(fā)生改變);
B.難以調(diào)試、維護(hù)。業(yè)務(wù)邏輯大的時(shí)候,封裝性不夠,難調(diào)試難以維護(hù);
C.服務(wù)器不能負(fù)載均衡。復(fù)雜的應(yīng)用用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn),就把業(yè)務(wù)處理的負(fù)擔(dān)壓在數(shù)據(jù)庫(kù)服務(wù)器上了。沒(méi)有辦法通過(guò)中間層來(lái)靈活分擔(dān)負(fù)載和壓力.均衡負(fù)載等。
(3).存儲(chǔ)過(guò)程分類(lèi)
<1>.系統(tǒng)存儲(chǔ)過(guò)程
系統(tǒng)存儲(chǔ)過(guò)程(System Stored Procedures)主要存儲(chǔ)在master數(shù)據(jù)庫(kù)中,并以sp_為前綴,并且系統(tǒng)存儲(chǔ)過(guò)程主要是從系統(tǒng)表中獲取信息,從而為系統(tǒng)管理員管理SQL Server提供支持。
<2>.本地存儲(chǔ)過(guò)程
本地存儲(chǔ)過(guò)程(Local Stored Procedures)也就是用戶(hù)自行創(chuàng)建在用戶(hù)數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程。事實(shí)上一般所說(shuō)的存儲(chǔ)過(guò)程值得就是本地存儲(chǔ)過(guò)程。用戶(hù)創(chuàng)建的存儲(chǔ)過(guò)程是由用戶(hù)創(chuàng)建并能完成某一特定功能(如查詢(xún)用戶(hù)所需的數(shù)據(jù)信息)的存儲(chǔ)過(guò)程。
<3>.臨時(shí)存儲(chǔ)過(guò)程
臨時(shí)存儲(chǔ)過(guò)程(Temporary Stored Procedures)可分為以下兩種:
A.本地臨時(shí)存儲(chǔ)過(guò)程
如果在創(chuàng)建存儲(chǔ)過(guò)程中,以井號(hào)(#)作為其名稱(chēng)的第一個(gè)字符,則該存儲(chǔ)過(guò)程將成為一個(gè)存放在tempdb數(shù)據(jù)庫(kù)中的本地臨時(shí)存儲(chǔ)過(guò)程(例如,CREATE PROCEDURE #book_proc.....)。本地臨時(shí)存儲(chǔ)過(guò)程只有創(chuàng)建它的連接的用戶(hù)才能夠執(zhí)行它,而且一旦這位用戶(hù)斷開(kāi)與SQL Server的連接,本地臨時(shí)存儲(chǔ)過(guò)程就會(huì)自動(dòng)刪除,當(dāng)然,這位用戶(hù)也可以在連接期間用DROP PROCEDURE命令刪除多創(chuàng)建的本地臨時(shí)存儲(chǔ)過(guò)程。
B.全局臨時(shí)存儲(chǔ)過(guò)程
如果在所創(chuàng)建的存儲(chǔ)過(guò)程名稱(chēng)是以?xún)蓚€(gè)井號(hào)(# #)開(kāi)始,則該存儲(chǔ)過(guò)程將成為一個(gè)存儲(chǔ)在tempdb數(shù)據(jù)庫(kù)中的全局臨時(shí)存儲(chǔ)過(guò)程,如果沒(méi)有,便立即將全局臨時(shí)存儲(chǔ)過(guò)程刪除;如果有,SQL Server會(huì)讓這些執(zhí)行中的操作繼續(xù)進(jìn)行,但是不允許任何用戶(hù)再執(zhí)行全局臨時(shí)存儲(chǔ)過(guò)程,等到所有未完成的操作執(zhí)行完畢后,全局臨時(shí)存儲(chǔ)過(guò)程就會(huì)自動(dòng)刪除。
由于全局臨時(shí)存儲(chǔ)過(guò)程能夠被所有的連接用戶(hù)使用,因此,必須注意其名稱(chēng)不能和其他連接所采用的名稱(chēng)相同。
<4>.遠(yuǎn)程存儲(chǔ)過(guò)程
遠(yuǎn)程存儲(chǔ)過(guò)程(Remote Stored Procedures)是位于遠(yuǎn)程服務(wù)器上的存儲(chǔ)過(guò)程,通常可以使用分布式查詢(xún)和EXECUTE命令執(zhí)行一個(gè)遠(yuǎn)程存儲(chǔ)過(guò)程。
<5>.擴(kuò)展存儲(chǔ)過(guò)程
擴(kuò)展存儲(chǔ)過(guò)程(Extended Stored Procedures)是用戶(hù)可以使用外部程序語(yǔ)言編寫(xiě)的存儲(chǔ)過(guò)程。擴(kuò)展存儲(chǔ)過(guò)程在使用和執(zhí)行上與一般的存儲(chǔ)過(guò)程完全相同。可以將參數(shù)傳遞給擴(kuò)展存儲(chǔ)過(guò)程,擴(kuò)展存儲(chǔ)過(guò)程也能夠返回結(jié)果和狀態(tài)值。
為了區(qū)別,擴(kuò)展存儲(chǔ)過(guò)程的名稱(chēng)通常以xp_開(kāi)頭。擴(kuò)展存儲(chǔ)過(guò)程是以動(dòng)態(tài)鏈接庫(kù)(DLLS)的形式存在,能讓SQL Server動(dòng)態(tài)的裝載和執(zhí)行。擴(kuò)展存儲(chǔ)過(guò)程一定要存儲(chǔ)在系統(tǒng)數(shù)據(jù)庫(kù)master中。
參考博客:
《SQL Server 存儲(chǔ)過(guò)程》
4.事務(wù)處理
(1).什么是事務(wù)?
事務(wù)是單個(gè)的工作單元。如果某一事務(wù)成功,則在該事務(wù)中進(jìn)行的所有數(shù)據(jù)更改均會(huì)提交,成為數(shù)據(jù)庫(kù)中的永久組成部分。如果事務(wù)遇到錯(cuò)誤且必須取消或回滾,則所有數(shù)據(jù)更改均被清除。事務(wù)作為一個(gè)邏輯工作單元有4個(gè)屬性,稱(chēng)為ACID(原子性、一致性、隔離性和持久性)屬性。
<1>.原子性:事務(wù)必須是原子工作單元,對(duì)于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。
<2>.一致性:事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致?tīng)顟B(tài)。在相關(guān)數(shù)據(jù)庫(kù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事物結(jié)束時(shí),所有的內(nèi)容數(shù)據(jù)結(jié)果都必須是正確的。
<3>.隔離性:由并發(fā)事務(wù)所作的修改必須與任何其他并發(fā)事務(wù)所作的修改隔離,保證事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)處于的狀態(tài),只能是另一并發(fā)事務(wù)修改它之前的狀態(tài)或者是另一事務(wù)修改它之后的狀態(tài),而不能中間狀態(tài)的數(shù)據(jù)。
<4>.持久性:事務(wù)完成之后對(duì)系統(tǒng)的影響是永久性的。
(2).事務(wù)分類(lèi)
<1>.顯式事務(wù):用begin transaction明確指定事務(wù)的開(kāi)始。
<2>.隱性事務(wù):打開(kāi)隱性事務(wù):set implicit_transactions on,當(dāng)以隱性事務(wù)模式操作時(shí),SQL Servler將在提交或回滾事務(wù)后自動(dòng)啟動(dòng)新事務(wù)。無(wú)法描述事務(wù)的開(kāi)始,只需要提交或回滾事務(wù)。
<3>.自動(dòng)提交事務(wù):SQL Server的默認(rèn)模式,它將每條單獨(dú)的T-SQL語(yǔ)句視為一個(gè)事務(wù)。如果成功執(zhí)行,則自動(dòng)提交,否則回滾。
參見(jiàn)博客:
《SQL SERVER事務(wù)處理》
5.SQL Server內(nèi)部函數(shù)
內(nèi)部函數(shù)的作用是用來(lái)幫助用戶(hù)獲得系統(tǒng)的有關(guān)信息、執(zhí)行有關(guān)計(jì)算、實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換以及統(tǒng)計(jì)功能等。SQL所提供的內(nèi)部函數(shù)又分為系統(tǒng)函數(shù)、日期函數(shù)、字符串函數(shù)、數(shù)學(xué)函數(shù)、集合函數(shù)等幾種。
(1).系統(tǒng)函數(shù)
系統(tǒng)函數(shù)可幫助在不直接訪(fǎng)問(wèn)系統(tǒng)表的情況下,獲取SQL Server系統(tǒng)表中的信息。系統(tǒng)函數(shù)對(duì)SQL Server服務(wù)器和 數(shù)據(jù)庫(kù)對(duì)象進(jìn)行操作,并返回服務(wù)器配置和數(shù)據(jù)庫(kù)對(duì)象數(shù)值等信息。系統(tǒng)函數(shù)可用于選擇列表、WHERE子句以及任何允許使用表達(dá)式的地方。
| APP_NAME() | 返回當(dāng)前會(huì)話(huà)的應(yīng)用程序名稱(chēng)(如果應(yīng)用程序進(jìn)行了設(shè)置) |
| CASE表達(dá)式 | 計(jì)算條件列表,并返回表達(dá)式的多個(gè)可能結(jié)果之一。 |
| CAST(expression AS data_type) | 將表達(dá)式顯示轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型。 |
| CONVERT(data_type[length],expression[,style]) | 將表達(dá)式顯示轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型。CAST和CONVERT提供相似的功能。 |
| COL_LENGTH | 返回列長(zhǎng)度而不是列中存儲(chǔ)的任何單個(gè)字符串的長(zhǎng)度。 |
| CURRENT_TIMESTAMP | 返回當(dāng)前日期和時(shí)間。此函數(shù)等價(jià)于GETDATE()。 |
| CURRENT_USER | 返回當(dāng)前的用戶(hù),此函數(shù)等價(jià)于USER_NAME()。 |
| DATALENGTH(expression) | 返回表達(dá)式所占用的字節(jié)數(shù)。 |
| GETANSINULL(['database']) | 返回會(huì)話(huà)的數(shù)據(jù)庫(kù)的默認(rèn)為空值。當(dāng)給定數(shù)據(jù)庫(kù)為空值時(shí)允許空值并且列或數(shù)據(jù)類(lèi)型為空值沒(méi)有顯示定義,GETANSINULL返回1。 |
| HOST_ID() | 返回主機(jī)標(biāo)識(shí)。 |
| HOST_NAME() | 返回主機(jī)名稱(chēng)。 |
| IDENT_CURRENT('table_name') | 任何會(huì)話(huà)和任何范圍中對(duì)指定的表生成的最后標(biāo)識(shí)值. |
| IDENT_INCR('table_or_view') | 返回表的標(biāo)識(shí)列的標(biāo)識(shí)增量。 |
| IDENT_SEED('table_or_view')? | 返回種子值,該值是在帶有標(biāo)識(shí)列的表或視圖中創(chuàng)建標(biāo)識(shí)列時(shí)指定的值。 |
| IDENTITY(data_type[,seed,increment]) AS ?col_name ? ? ? | 只在SELECT IINTO生成新表中的標(biāo)識(shí)列。 |
| ISDATE(expression) | 表達(dá)式為有效日期格式時(shí)返回1,否則返回0。 |
| ISNULL(check_expression,replacement_value) | 表達(dá)式值為NULL,用指定的替換值進(jìn)行替換 |
| ISNUMERIC(expression) | 表達(dá)式為數(shù)值類(lèi)型時(shí)返回1,否則返回0。 |
| NEWID() | 生成全局唯一標(biāo)識(shí)符。 |
| NULLIF(expression,expression) | 如果兩個(gè)指定的表達(dá)式相等,則返回空值。 |
| PARSENAME('object_name','object_part') | 返回對(duì)象名的指定部分。 |
| PERMISSIONS([objectid[,'column']])? | 返回一個(gè)包含位圖的值,表明當(dāng)前用戶(hù)的語(yǔ)句,對(duì)象或列權(quán)限。 |
| ROWCOUNT_BIG() | 返回執(zhí)行最后一個(gè)語(yǔ)句所影響的行數(shù)。 |
| SCOPE_IDENTITY() | 插入當(dāng)前范圍IDENTITY列中的最后一個(gè)標(biāo)識(shí)值。 |
| SERVERPROPERTY(propertyname) | 返回服務(wù)器屬性的信息。 |
| SESSIONPROPERTY(option) | 會(huì)話(huà)的SET選項(xiàng)。 |
| STATS_DATE(table_id,index_id) | 對(duì)table_id和index_id更新分配頁(yè)的日期。 |
| USER_NAME([id]) | 返回給指定標(biāo)識(shí)號(hào)的用戶(hù)數(shù)據(jù)庫(kù)的用戶(hù)名。 |
(2).日期函數(shù)
日期函數(shù)用來(lái)顯示日期和時(shí)間的信息。它們處理datatime和smalldatetime的值,并對(duì)其進(jìn)行算術(shù)運(yùn)算。
| GETDATE() | 返回服務(wù)器當(dāng)前的系統(tǒng)日期和時(shí)間。 |
| DATENAME(日期元素,日期)? | 返回指定日期的名字,返回字符串。 |
| DATERART(日期元素,日期) | 返回指定日期的一部分,返回整數(shù)。 |
| DATEDIFF(日期元素,日期1,日期2) | 返回兩個(gè)日期間的差值并轉(zhuǎn)換為指定日期元素形式 |
| DATEADD(日期元素,日期) | 將日期元素加上日起產(chǎn)生新的日期。 |
| YEAR(日期) | 返回年份(整數(shù)) |
| MONTH(日期) | 返回月份(整數(shù)) |
| DAY(日期) | 返回某月幾號(hào)的整數(shù)值 |
| GETUTCDATE() | 返回表示當(dāng)前UTC時(shí)間(世界時(shí)間坐標(biāo)和格林尼治報(bào)紙時(shí)間)的日起值 |
日期元素參照:
| year? | yy | 1753-9999 |
| month | mm | 1-12 |
| day? | dd | 1-31 |
| Day of year | dy | 1-366 |
| week | wk | 0-52 |
| weekday | dw | 1-7 |
| hour | hh | 0-23 |
| minute | mi | 0-59 |
| quarter | 1-4 | |
| second | ss | 0-59 |
| millisecond | ms | 0-999 |
(3).字符串函數(shù)
字符串函數(shù)用于對(duì)字符串進(jìn)行連接、截取等操作。
| ASCII(字符表達(dá)式) | 返回字符表達(dá)式最左邊字符的ASCII碼。 |
| CHAR(整型表達(dá)式) | 講一個(gè)ASCII碼轉(zhuǎn)換成字符,ASCII碼應(yīng)在0-255之間。 |
| SPACE(整型表達(dá)式) | 返回n個(gè)空格組成的字符串,n整型表達(dá)式的值。 |
| LEA(字符表達(dá)式) | 返回字符表達(dá)式的字符(而不是字節(jié))個(gè)數(shù),不計(jì)算尾部空格 |
| RIGHT(字符表達(dá)式,整型表達(dá)式) | 從字符表達(dá)式中返回最右邊n個(gè)字符,n為整型表達(dá)式. |
| LEFT(字符表達(dá)式,整型表達(dá)式) | 從字符表達(dá)式中返回最左邊n個(gè)字符,n為 整型表達(dá)式. |
| SUBSTRING(字符表達(dá)式,起始點(diǎn),n) | 返回字符串表達(dá)式中從“起始點(diǎn)”開(kāi)始的n個(gè)字符. |
| STR(浮點(diǎn)表達(dá)式[,長(zhǎng)度[,小數(shù)]]) | 將浮點(diǎn)表達(dá)式轉(zhuǎn)換為所給定長(zhǎng)度的字符串,小數(shù)點(diǎn)后的位數(shù)由所給出的“小數(shù)”決定。 |
| LTRIM(字符表達(dá)式) | 去掉字符表達(dá)式的前導(dǎo)空格。 |
| RTEIM(字符表達(dá)式) | 去掉字符表達(dá)式的尾部空格。 |
| LOWER(字符表達(dá)式) | 將字符表達(dá)式的字母轉(zhuǎn)換為小寫(xiě)字母。 |
| UPPER(字符表達(dá)式) | 將字符表達(dá)式的字母轉(zhuǎn)換為大寫(xiě)字母。 |
| REVERSE(字符表達(dá)式) | 返回字符表達(dá)式的逆序。 |
| DIFFERENCES(字符表達(dá)式1,字符表達(dá)式2) | 返回兩個(gè)字符表達(dá)式發(fā)音的相似程度(0-4),4為發(fā)音最相似。 |
| PATINDEX("%模式%",表達(dá)式) | 返回指定模式在表達(dá)式中的起始位置,找不到時(shí)為0。 |
| PEPLICATE(字符表達(dá)式,整型表達(dá)式) | 將字符表達(dá)式重復(fù)多次,整數(shù)給出的是重復(fù)次數(shù). |
| SOUNDEX(字符表達(dá)式) | 返回字符表達(dá)式所對(duì)應(yīng)的4個(gè)字符的代碼。 |
| NCHAR(整型表達(dá)式) | 返回Unicode的字符。 |
| UNICODE(字符表達(dá)式) | 返回字符表達(dá)式最左側(cè)字符的Unicode代碼。 |
| STUFF(字符表達(dá)式,start,length,字符表達(dá)式2) | 字符表達(dá)式1中從start開(kāi)始的length個(gè)字符換成字符表達(dá)式2。 |
| CHARINDEX(字符表達(dá)式1,字符表達(dá)式2,[開(kāi)始位置]) | 返回字符表達(dá)式1在字符表達(dá)式2的開(kāi)始位置,可以從所給的“開(kāi)始位置”進(jìn)行查找, 如果沒(méi)指定開(kāi)始位置,或者指定為負(fù)數(shù)或0,則默認(rèn)從字符表達(dá)2的開(kāi)始位置查找。 |
(4).數(shù)學(xué)函數(shù)
| ABS(數(shù)值表達(dá)式) | 返回表達(dá)式的絕對(duì)值(正值)。 |
| ACOS(浮點(diǎn)表達(dá)式) | 返回浮點(diǎn)表達(dá)式反余弦值(單位為弧度)。 |
| ASIN(浮點(diǎn)表達(dá)式) | 返回浮點(diǎn)表達(dá)式反正弦值(單位為弧度)。 |
| ATAN(浮點(diǎn)表達(dá)式) | 返回浮點(diǎn)表達(dá)式反正切值(單位為弧度)。 |
| ATAN2(浮點(diǎn)表達(dá)式1,浮點(diǎn)表達(dá)式2) | 返回以弧度為單位的角度值,此值的反正切值在所給的浮點(diǎn)表達(dá)式1和浮點(diǎn)表達(dá)式2之間。 |
| COS(浮點(diǎn)表達(dá)式) | 返回浮點(diǎn)表達(dá)式三角余弦值。 |
| COT(浮點(diǎn)表達(dá)式) | 返回浮點(diǎn)表達(dá)式三角余切值。 |
| CEILIGN(數(shù)值表達(dá)式) | 返回大于或等于數(shù)值表達(dá)式的最小整數(shù)。 |
| DEGREES(數(shù)值表達(dá)式) | 將弧度轉(zhuǎn)換為度。 |
| EXP(浮點(diǎn)表達(dá)式) | 返回?cái)?shù)值的指數(shù)形式。 |
| FLOOR(數(shù)值表達(dá)式)? | 返回大于或等于數(shù)值表達(dá)式的最大整數(shù),CEILIGN的反函數(shù) |
| LOG(浮點(diǎn)表達(dá)式) | 返回?cái)?shù)值的自然對(duì)數(shù)值。 |
| LOG10(浮點(diǎn)表達(dá)式) | 返回以10為底浮點(diǎn)數(shù)的對(duì)數(shù)。? ? ? |
| PI() | 返回的值3.1415962653。 |
| POWER(數(shù)值表達(dá)式,冪)? | 返回?cái)?shù)字表達(dá)式的指定次冪的值。 |
| RADIANS(數(shù)值表達(dá)式) | 將度轉(zhuǎn)換為弧度,DEGREES反函數(shù)。 |
| RAND(整數(shù)表達(dá)式) | 返回一個(gè)0-1之間的隨機(jī)十進(jìn)制數(shù)。 |
| ROUND(數(shù)值表達(dá)式,整數(shù)表達(dá)式)? | 將設(shè)置表達(dá)式四舍五入為整型表達(dá)式所給的精度。 |
| SIGN(數(shù)值表達(dá)式) | 符號(hào)函數(shù),正數(shù)返回1,負(fù)數(shù)返回-1,0返回0。 |
| SQUARE(浮點(diǎn)表達(dá)式) | 返回浮點(diǎn)表達(dá)式的平方。 |
| SIN(浮點(diǎn)表達(dá)式) | 返回浮點(diǎn)表達(dá)式的三角正弦值(弧度為單位)。 |
| SQRT(浮點(diǎn)表達(dá)式) | 返回一個(gè)浮點(diǎn)表達(dá)式的平方根。 |
| TAN(浮點(diǎn)表達(dá)式) | 返回浮點(diǎn)表達(dá)式正切值(弧度為單位)。 |
(5).集合函數(shù)
集合函數(shù)也稱(chēng)為統(tǒng)計(jì)函數(shù),它對(duì)一組進(jìn)行計(jì)算并返回一個(gè)數(shù)值。聚合函數(shù)經(jīng)常與SELECT語(yǔ)句的子句一起使用。
| SUM([ALL|DISTINCT]expression) | 計(jì)算一組數(shù)據(jù)的和 |
| MIN([ALL|DISTINCT]expression) | 給出一組數(shù)據(jù)的最小值 |
| MAX([ALL|DISTINCT]expression) | 給出一組數(shù)據(jù)的最大值 |
| COUNT([ALL|DISTINCT]expression|*) | 計(jì)算總行數(shù)。COUNT(*)返回行數(shù),包括含有空值的行,不能與DISTINCT一起使用? |
| CHECKSUM(*|expression[,...n]) | 對(duì)一組數(shù)值的和進(jìn)行校驗(yàn),可探測(cè)表的變化 |
| BINARY_CHECKSUM(*|expression[,...n]) | 對(duì)二進(jìn)制的和進(jìn)行校驗(yàn),可探測(cè)表的變化 |
| AVG([ALL|DISTINCT]expression) | 計(jì)算一組值的平均值 |
轉(zhuǎn)載地址:http://www.cnblogs.com/SanMaoSpace/p/3147059.html
總結(jié)
以上是生活随笔為你收集整理的视图、索引、存储过程优缺点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hibernate三种状态:临时状态、游
- 下一篇: java IO流面试总结