范式
◆ 第一范式(1NF):強調(diào)的是列的原子性行冰,即列不能夠再分成其他幾列被碗。
◆ 第二范式(2NF):首先是 1NF撒犀,另外包含兩部分內(nèi)容福压,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴于主鍵或舞,而不能只依賴于主鍵的一部分荆姆。
◆ 第三范式(3NF):首先是 2NF,另外非主鍵列必須直接依賴于主鍵嚷那,不能存在傳遞依賴胞枕。即不能存在:非主鍵列 A 依賴于非主鍵列 B,非主鍵列 B 依賴于主鍵的情況魏宽。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,區(qū)分它們的關(guān)鍵點在于决乎,2NF:非主鍵列是否完全依賴于主鍵队询,還是依賴于主鍵的一部分;3NF:非主鍵列是直接依賴于主鍵构诚,還是直接依賴于非主鍵列蚌斩。
連接
一、內(nèi)連接
內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行范嘱,它使用比較運算符比較被連接列的列值送膳。內(nèi)連接分三種:
1、等值連接:在連接條件中使用等于號(=)運算符比較被連接列的列值丑蛤,其查詢結(jié)果中列出被連接表中的所有列叠聋,包括其中的重復(fù)列。
2受裹、不等連接:在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值碌补。這些運算符包括>虏束、>=、<=厦章、<镇匀、!>、!<袜啃、!=和<>汗侵。
3、自然連接:在連接條件中使用等于(=)運算符比較被連接列的列值群发,但它使用選擇列表指出查詢結(jié)果集合中所包括的列晰韵,并刪除連接表中的重復(fù)列。
二也物、外連接
返回到查詢結(jié)果集合中的不僅包含符合連接條件的行宫屠,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數(shù)據(jù)行滑蚯。
左連接以左表為基準進行查詢,左表數(shù)據(jù)會全部顯示出來,右表如果和左表匹配的數(shù)據(jù)則顯示相應(yīng)字段的數(shù)據(jù),如果不匹配,則顯示為NULL;右連接剛好相反浪蹂。
全連接就是先以左表進行左外連接,然后以右表進行右外連接告材。
說明:所謂的基準,就是以某張表的限制條件查詢條件為準!
具體如下:
三坤次、交叉連接
交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數(shù)據(jù)行的笛卡爾積斥赋,返回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個表中符合查詢條件的數(shù)據(jù)行數(shù)缰猴。例,titles表中有6類圖書疤剑,而publishers表中有8家出版社滑绒,則下列交叉連接檢索到的記錄數(shù)將等于6*8=48行。
事物
事務(wù)(Transaction)是并發(fā)控制的基本單位隘膘。所謂的事務(wù)疑故,它是一個操作序列,這些操作要么都執(zhí)行弯菊,要么都不執(zhí)行纵势,它是一個不可分割的工作單位。事務(wù)是數(shù)據(jù)庫維護數(shù)據(jù)一致性的單位管钳,在每個事務(wù)結(jié)束時钦铁,都能保持數(shù)據(jù)一致性。
針對上面的描述可以看出才漆,事務(wù)的提出主要是為了解決并發(fā)情況下保持數(shù)據(jù)一致性的問題牛曹。
事務(wù)具有以下4個基本特征。
● Atomic(原子性):事務(wù)中包含的操作被看做一個邏輯單元栽烂,這個邏輯單元中的操作要么全部成功躏仇,要么全部失敗恋脚。
● Consistency(一致性):只有合法的數(shù)據(jù)可以被寫入數(shù)據(jù)庫,否則事務(wù)應(yīng)該將其回滾到最初狀態(tài)焰手。
● Isolation(隔離性):事務(wù)允許多個用戶對同一個數(shù)據(jù)進行并發(fā)訪問糟描,而不破壞數(shù)據(jù)的正確性和完整性。同時书妻,并行事務(wù)的修改必須與其他并行事務(wù)的修改相互獨立船响。
● Durability(持久性):事務(wù)結(jié)束后,事務(wù)處理的結(jié)果必須能夠得到固化躲履。
2.事務(wù)的語句
開始事務(wù):BEGIN TRANSACTION
提交事務(wù):COMMIT TRANSACTION
回滾事務(wù):ROLLBACK TRANSACTION
3.事務(wù)的4個屬性
①原子性(Atomicity):事務(wù)中的所有元素作為一個整體提交或回滾见间,事務(wù)的個元素是不可分的,事務(wù)是一個完整操作工猜。
②一致性(Consistemcy):事物完成時米诉,數(shù)據(jù)必須是一致的,也就是說篷帅,和事物開始之前史侣,數(shù)據(jù)存儲中的數(shù)據(jù)處于一致狀態(tài)。保證數(shù)據(jù)的無損魏身。
③隔離性(Isolation):對數(shù)據(jù)進行修改的多個事務(wù)是彼此隔離的惊橱。這表明事務(wù)必須是獨立的,不應(yīng)該以任何方式以來于或影響其他事務(wù)箭昵。
④持久性(Durability):事務(wù)完成之后税朴,它對于系統(tǒng)的影響是永久的,該修改即使出現(xiàn)系統(tǒng)故障也將一直保留家制,真實的修改了數(shù)據(jù)庫正林。
鎖
數(shù)據(jù)庫大并發(fā)操作要考慮死鎖和鎖的性能問題。 2
鎖的種類
共享鎖(Shared lock)颤殴。
共享鎖不阻止其它session同時讀資源卓囚,但阻
止其它session update
更新鎖(Update lock)
為解決死鎖,引入更新鎖诅病。
一個事物只能有一個更新鎖獲此資格。
共享鎖和更新鎖可以同時在同一個資源上粥烁。這被稱為共享鎖和更新鎖是兼容的贤笆。
當(dāng)一個表中的某一行被加上排他鎖后,該表就不能再被加表鎖讨阻。數(shù)據(jù)庫程序如何知道該表不能被加表鎖芥永?一種方式是逐條的判斷該
表的每一條記錄是否已經(jīng)有排他鎖,另一種方式是直接在表這一層級檢查表本身是否有意向鎖钝吮,不需要逐條判斷埋涧。顯然后者效率高板辽。
如何加鎖,何時加鎖棘催,加什么鎖劲弦,你可以通過hint手工強行指定,但大多是數(shù)據(jù)庫系統(tǒng)自動決定的醇坝。這就是為什么我們可以不懂鎖也可
以高高興興的寫SQL邑跪。
悲觀鎖:利用數(shù)據(jù)庫本身的鎖機制實現(xiàn)。通過上面對數(shù)據(jù)庫鎖的了解呼猪,可以根據(jù)具體業(yè)務(wù)情況綜合使用事務(wù)隔離級別與合理的手工指定鎖的方式比如降低鎖的粒度等減少并發(fā)等待画畅。
樂觀鎖:利用程序處理并發(fā)。原理都比較好理解宋距,基本一看即懂轴踱。方式大概有以下3種
對記錄加版本號.
對記錄加時間戳.
對將要更新的數(shù)據(jù)進行提前讀取、事后對比谚赎。
不論是數(shù)據(jù)庫系統(tǒng)本身的鎖機制淫僻,還是樂觀鎖這種業(yè)務(wù)數(shù)據(jù)級別上的鎖機制,本質(zhì)上都是對狀態(tài)位的讀沸版、寫嘁傀、判斷。
視圖
視圖(View)是從一個或多個表(或視圖)導(dǎo)出的表视粮。視圖與表(有時為與視圖區(qū)別细办,也稱表為基本表——Base Table)不同,視圖是一個虛表蕾殴,即視圖所對應(yīng)的數(shù)據(jù)不進行實際存儲笑撞,數(shù)據(jù)庫中只存儲視圖的定義,在對視圖的數(shù)據(jù)進行操作時钓觉,系統(tǒng)根據(jù)視圖的定義去操作與視圖相關(guān)聯(lián)的基本表茴肥。
視圖的優(yōu)點
- 1簡化用戶操作
視圖不僅可以簡化用戶對數(shù)據(jù)的理解,也可以簡化他們的操作荡灾。那些被經(jīng)常使用的查詢可以被定義為視圖瓤狐,從而使用戶不必為以后的操作每次都指定全部的條件。 - 2對重構(gòu)數(shù)據(jù)庫提供了一定程度上的邏輯獨立性
視圖可以使應(yīng)用程序和數(shù)據(jù)庫表在一定程度上獨立批幌。如果沒有視圖础锐,應(yīng)用一定是建立在表上的。有了視圖之后荧缘,程序可以建立在視圖之上皆警,從而程序與數(shù)據(jù)庫表被視圖分割開來。 - 3安全性
通過視圖用戶只能查詢和修改他們所能見到的數(shù)據(jù)截粗。數(shù)據(jù)庫中的其他數(shù)據(jù)則既看不見也取不到信姓。數(shù)據(jù)庫授權(quán)命令可以使每個用戶對數(shù)據(jù)庫的檢索限制到特定的數(shù)據(jù)庫對象上鸵隧,但不能授權(quán)到數(shù)據(jù)庫特定行和特定的列上。通過視圖意推,用戶可以被限制在數(shù)據(jù)的不同子集上豆瘫。
視圖的缺點
● 性能:SQL Server必須把視圖的查詢轉(zhuǎn)化成對基本表的查詢,如果這個視圖是由一個復(fù)雜的多表查詢所定義左痢,那么靡羡,即使是視圖的一個簡單查詢,SQL Server也把它變成一個復(fù)雜的結(jié)合體俊性,需要花費一定的時間略步。
● 修改限制:當(dāng)用戶試圖修改視圖的某些行時,SQL Server必須把它轉(zhuǎn)化為對基本表的某些行的修改定页。對于簡單視圖來說趟薄,這是很方便的,但是典徊,對于比較復(fù)雜的視圖杭煎,可能是不可修改的。
存儲過程
存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集卒落。經(jīng)編譯后存儲在數(shù)據(jù)庫中羡铲。
存儲過程是數(shù)據(jù)庫中的一個重要對象,用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它儡毕。
存儲過程是由 流控制 和 SQL語句書寫的過程也切,這個過程經(jīng)編譯和優(yōu)化后存儲在數(shù)據(jù)庫服務(wù)器中。
存儲過程 可由應(yīng)用程序通過一個調(diào)用來執(zhí)行腰湾,而且允許用戶聲明變量雷恃。
同時,存儲過程可以接收和輸出參數(shù)费坊、返回執(zhí)行存儲過程的狀態(tài)值倒槐,也可以嵌套調(diào)用。
【存儲過程的優(yōu)點】
① 存儲過程的能力大大增強了SQL語言的功能和靈活性附井。
存儲過程可以用流控制語句編寫讨越,有很強的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的 運算永毅。
② 可保證數(shù)據(jù)的安全性和完整性谎痢。
理由1:通過存儲過程可以使沒有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫,從而保證數(shù)據(jù)的安全卷雕。
理由2:通過存儲過程可以使相關(guān)的動作在一起發(fā)生,從而可以維護數(shù)據(jù)庫的完整性票从。
③ 在運行存儲過程前漫雕,數(shù)據(jù)庫已對其進行了語法和句法分析滨嘱,并給出了優(yōu)化執(zhí)行方案。
這種已經(jīng)編譯好的過程可極大地改善SQL語句的性能浸间。
由于執(zhí)行SQL語句的大部分工作已經(jīng)完成太雨,所以存儲過程能以極快的速度執(zhí)行。
④ 可以降低網(wǎng)絡(luò)的通信量魁蒜。
理由:客戶端調(diào)用存儲過程只需要傳存儲過程名和相關(guān)參數(shù)即可囊扳,與傳輸SQL語句相比自然數(shù)據(jù)量少了很多。
⑤ 使體現(xiàn)企業(yè)規(guī)則的運算程序放入數(shù)據(jù)庫服務(wù)器中兜看,以便:
1). 集中控制锥咸。
2). 當(dāng)企業(yè)規(guī)則發(fā)生變化時在服務(wù)器中改變存儲過程即可,無須修改任何應(yīng)用程序细移。
企業(yè)規(guī)則的特點是要經(jīng)常變化搏予,如果把體現(xiàn)企業(yè)規(guī)則的運算程序放入應(yīng)用程序中,則當(dāng)企業(yè)規(guī)則發(fā)生變化時弧轧,就需要修改應(yīng)用程序工作量非常之大(修改雪侥、發(fā)行和安裝應(yīng)用程序)。
如果把體現(xiàn)企業(yè)規(guī)則的運算放入存儲過程中精绎,則當(dāng)企業(yè)規(guī)則發(fā)生變化時速缨,只要修改存儲過程就可以了,應(yīng)用程序無須任何變化代乃。
【存儲過程優(yōu)點概括】
① 存儲過程只在創(chuàng)造時進行編譯旬牲,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度襟己。
② 當(dāng)對數(shù)據(jù)庫進行復(fù)雜操作時(如對多個表進行Update,Insert,Query,Delete時)引谜,可將此復(fù)雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用。
③ 存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量擎浴。
④ 安全性高,可設(shè)定只有某些用戶才具有對指定存儲過程的使用權(quán)
【存儲過程缺點】
① 調(diào)試麻煩员咽,但是用 PL/SQL Developer 調(diào)試很方便!彌補這個缺點贮预。
② 移植問題贝室,數(shù)據(jù)庫端代碼當(dāng)然是與數(shù)據(jù)庫相關(guān)的。但是如果是做工程型項目仿吞,基本不存在移植問題滑频。
③ 重新編譯問題,因為后端代碼是運行前編譯的唤冈,如果帶有引用關(guān)系的對象發(fā)生改變時峡迷,受影響的存儲過程、包將需要重新編譯(不過也可以設(shè)置成運行時刻自動編譯)。
④ 如果在一個程序系統(tǒng)中大量的使用存儲過程绘搞,到程序交付使用的時候隨著用戶需求的增加會導(dǎo)致數(shù)據(jù)結(jié)構(gòu)的變化彤避,接著就是系統(tǒng)的相關(guān)問題了,最后如果用戶想維護該系統(tǒng)可以說是很難很難夯辖、而且代價是空前的琉预,維護起來更麻煩。
【存儲過程的種類】
① 系統(tǒng)存儲過程:以sp_開頭,用來進行系統(tǒng)的各項設(shè)定.取得信息.相關(guān)管理工作蒿褂。
② 本地存儲過程:用戶創(chuàng)建的存儲過程是由用戶創(chuàng)建并完成某一特定功能的存儲過程圆米,事實上一般所說的存儲過程就是指本地存儲過程。
③ 臨時存儲過程:分為兩種存儲過程:
一是本地臨時存儲過程啄栓,以井字號(#)作為其名稱的第一個字符娄帖,則該存儲過程將成為一個存放在tempdb數(shù)據(jù)庫中的本地臨時存儲過程,且只有創(chuàng)建它的用戶才能執(zhí)行它;
二是全局臨時存儲過程谴供,以兩個井字號(##)號開始块茁,則該存儲過程將成為一個存儲在tempdb數(shù)據(jù)庫中的全局臨時存儲過程,全局臨時存儲過程一旦創(chuàng)建桂肌,以后連接到服務(wù)器的任意用戶都可以執(zhí)行它数焊,而且不需要特定的權(quán)限。
④ 遠程存儲過程:在SQL Server2005中崎场,遠程存儲過程(Remote Stored Procedures)是位于遠程服務(wù)器上的存儲過程佩耳,通常可以使用分布式查詢和EXECUTE命令執(zhí)行一個遠程存儲過程谭跨。
⑤ 擴展存儲過程:擴展存儲過程(Extended Stored Procedures)是用戶可以使用外部程序語言編寫的存儲過程干厚,而且擴展存儲過程的名稱通常以xp_開頭。
觸發(fā)器
其是一種特殊的存儲過程螃宙。一般的存儲過程是通過存儲過程名直接調(diào)用蛮瞄,而觸發(fā)器主要是
通過事件(增、刪谆扎、改)進行觸發(fā)而被執(zhí)行的挂捅。其在表中數(shù)據(jù)發(fā)生變化時自動強制執(zhí)行。
常見的觸發(fā)器有兩種:after(for)堂湖、instead of,用于insert闲先、update、delete事件无蜂。
after(for) 表示執(zhí)行代碼后伺糠,執(zhí)行觸發(fā)器
instead of 表示執(zhí)行代碼前,用已經(jīng)寫好的觸發(fā)器代替你的操作斥季。
約束
數(shù)據(jù)的完整性是指數(shù)據(jù)的正確性和一致性训桶,可以通過定義表時定義完整性約束,也可以通過規(guī)則,索引渊迁,觸發(fā)器等慰照。約束分為兩類:行級和表級,處理機制是一樣的琉朽。行級約束放在列后,表級約束放在表后稚铣,多個列共用的約束放在表后箱叁。
完整性約束是一種規(guī)則,不占用任何數(shù)據(jù)庫空間惕医。完整性約束存在數(shù)據(jù)字典中耕漱,在執(zhí)行SQL或PL/SQL期間使用。用戶可以指明約束是啟用的還是禁用的抬伺,當(dāng)約束啟用時螟够,他增強了數(shù)據(jù)的完整性,否則峡钓,則反之妓笙,但約束始終存在于數(shù)據(jù)字典中。
約束類型
總的來說有五種:唯一性和主鍵約束能岩、外鍵約束寞宫、檢查約束、空值約束拉鹃、默認值約束辈赋,
有五大關(guān)鍵詞,UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT