數據庫

范式

◆ 第一范式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。
◆ 第二范式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴于主鍵,而不能只依賴于主鍵的一部分。
◆ 第三范式(3NF):首先是 2NF,另外非主鍵列必須直接依賴于主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴于非主鍵列 B,非主鍵列 B 依賴于主鍵的情況。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,區分它們的關鍵點在于,2NF:非主鍵列是否完全依賴于主鍵,還是依賴于主鍵的一部分;3NF:非主鍵列是直接依賴于主鍵,還是直接依賴于非主鍵列。

連接

一、內連接
內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:
1、等值連接:在連接條件中使用等于號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。
2、不等連接:在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<、!=和<>。
3、自然連接:在連接條件中使用等于(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,并刪除連接表中的重復列。
二、外連接
返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。
左連接以左表為基準進行查詢,左表數據會全部顯示出來,右表如果和左表匹配的數據則顯示相應字段的數據,如果不匹配,則顯示為NULL;右連接剛好相反。
全連接就是先以左表進行左外連接,然后以右表進行右外連接。
說明:所謂的基準,就是以某張表的限制條件查詢條件為準!
具體如下:
三、交叉連接
交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等于第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等于6*8=48行。

事物

事務(Transaction)是并發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。
針對上面的描述可以看出,事務的提出主要是為了解決并發情況下保持數據一致性的問題。
事務具有以下4個基本特征。
● Atomic(原子性):事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要么全部成功,要么全部失敗。
● Consistency(一致性):只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初狀態。
● Isolation(隔離性):事務允許多個用戶對同一個數據進行并發訪問,而不破壞數據的正確性和完整性。同時,并行事務的修改必須與其他并行事務的修改相互獨立。
● Durability(持久性):事務結束后,事務處理的結果必須能夠得到固化。

2.事務的語句
 開始事務:BEGIN TRANSACTION
 提交事務:COMMIT TRANSACTION
 回滾事務:ROLLBACK TRANSACTION
3.事務的4個屬性
①原子性(Atomicity):事務中的所有元素作為一個整體提交或回滾,事務的個元素是不可分的,事務是一個完整操作。
②一致性(Consistemcy):事物完成時,數據必須是一致的,也就是說,和事物開始之前,數據存儲中的數據處于一致狀態。保證數據的無損。
③隔離性(Isolation):對數據進行修改的多個事務是彼此隔離的。這表明事務必須是獨立的,不應該以任何方式以來于或影響其他事務。
④持久性(Durability):事務完成之后,它對于系統的影響是永久的,該修改即使出現系統故障也將一直保留,真實的修改了數據庫。

數據庫大并發操作要考慮死鎖和鎖的性能問題。 2
鎖的種類
共享鎖(Shared lock)。
共享鎖不阻止其它session同時讀資源,但阻
止其它session update

更新鎖(Update lock)
為解決死鎖,引入更新鎖。

一個事物只能有一個更新鎖獲此資格。

共享鎖和更新鎖可以同時在同一個資源上。這被稱為共享鎖和更新鎖是兼容的。

當一個表中的某一行被加上排他鎖后,該表就不能再被加表鎖。數據庫程序如何知道該表不能被加表鎖?一種方式是逐條的判斷該
表的每一條記錄是否已經有排他鎖,另一種方式是直接在表這一層級檢查表本身是否有意向鎖,不需要逐條判斷。顯然后者效率高。

如何加鎖,何時加鎖,加什么鎖,你可以通過hint手工強行指定,但大多是數據庫系統自動決定的。這就是為什么我們可以不懂鎖也可
以高高興興的寫SQL。

悲觀鎖:利用數據庫本身的鎖機制實現。通過上面對數據庫鎖的了解,可以根據具體業務情況綜合使用事務隔離級別與合理的手工指定鎖的方式比如降低鎖的粒度等減少并發等待。
樂觀鎖:利用程序處理并發。原理都比較好理解,基本一看即懂。方式大概有以下3種
對記錄加版本號.
對記錄加時間戳.
對將要更新的數據進行提前讀取、事后對比。
不論是數據庫系統本身的鎖機制,還是樂觀鎖這種業務數據級別上的鎖機制,本質上都是對狀態位的讀、寫、判斷。

視圖

視圖(View)是從一個或多個表(或視圖)導出的表。視圖與表(有時為與視圖區別,也稱表為基本表——Base Table)不同,視圖是一個虛表,即視圖所對應的數據不進行實際存儲,數據庫中只存儲視圖的定義,在對視圖的數據進行操作時,系統根據視圖的定義去操作與視圖相關聯的基本表。
視圖的優點

  • 1簡化用戶操作
    視圖不僅可以簡化用戶對數據的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視圖,從而使用戶不必為以后的操作每次都指定全部的條件。
  • 2對重構數據庫提供了一定程度上的邏輯獨立性
    視圖可以使應用程序和數據庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之后,程序可以建立在視圖之上,從而程序與數據庫表被視圖分割開來。
  • 3安全性
    通過視圖用戶只能查詢和修改他們所能見到的數據。數據庫中的其他數據則既看不見也取不到。數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定行和特定的列上。通過視圖,用戶可以被限制在數據的不同子集上。
    視圖的缺點
    ● 性能:SQL Server必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個復雜的多表查詢所定義,那么,即使是視圖的一個簡單查詢,SQL Server也把它變成一個復雜的結合體,需要花費一定的時間。
    ● 修改限制:當用戶試圖修改視圖的某些行時,SQL Server必須把它轉化為對基本表的某些行的修改。對于簡單視圖來說,這是很方便的,但是,對于比較復雜的視圖,可能是不可修改的。

存儲過程

存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集。經編譯后存儲在數據庫中。
存儲過程是數據庫中的一個重要對象,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。
存儲過程是由 流控制 和 SQL語句書寫的過程,這個過程經編譯和優化后存儲在數據庫服務器中。
存儲過程 可由應用程序通過一個調用來執行,而且允許用戶聲明變量。
同時,存儲過程可以接收和輸出參數、返回執行存儲過程的狀態值,也可以嵌套調用。

【存儲過程的優點】
① 存儲過程的能力大大增強了SQL語言的功能和靈活性。
存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的 運算。

② 可保證數據的安全性和完整性。
理由1:通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而保證數據的安全。
理由2:通過存儲過程可以使相關的動作在一起發生,從而可以維護數據庫的完整性。

③ 在運行存儲過程前,數據庫已對其進行了語法和句法分析,并給出了優化執行方案。
這種已經編譯好的過程可極大地改善SQL語句的性能。
由于執行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執行。

④ 可以降低網絡的通信量。
理由:客戶端調用存儲過程只需要傳存儲過程名和相關參數即可,與傳輸SQL語句相比自然數據量少了很多。

⑤ 使體現企業規則的運算程序放入數據庫服務器中,以便:
1). 集中控制。
2). 當企業規則發生變化時在服務器中改變存儲過程即可,無須修改任何應用程序。
企業規則的特點是要經常變化,如果把體現企業規則的運算程序放入應用程序中,則當企業規則發生變化時,就需要修改應用程序工作量非常之大(修改、發行和安裝應用程序)。
如果把體現企業規則的運算放入存儲過程中,則當企業規則發生變化時,只要修改存儲過程就可以了,應用程序無須任何變化。

【存儲過程優點概括】
① 存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。

② 當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。

③ 存儲過程可以重復使用,可減少數據庫開發人員的工作量。

④ 安全性高,可設定只有某些用戶才具有對指定存儲過程的使用權

【存儲過程缺點】
① 調試麻煩,但是用 PL/SQL Developer 調試很方便!彌補這個缺點。

② 移植問題,數據庫端代碼當然是與數據庫相關的。但是如果是做工程型項目,基本不存在移植問題。

③ 重新編譯問題,因為后端代碼是運行前編譯的,如果帶有引用關系的對象發生改變時,受影響的存儲過程、包將需要重新編譯(不過也可以設置成運行時刻自動編譯)。

④ 如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨著用戶需求的增加會導致數據結構的變化,接著就是系統的相關問題了,最后如果用戶想維護該系統可以說是很難很難、而且代價是空前的,維護起來更麻煩。

【存儲過程的種類】
① 系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作。

② 本地存儲過程:用戶創建的存儲過程是由用戶創建并完成某一特定功能的存儲過程,事實上一般所說的存儲過程就是指本地存儲過程。

③ 臨時存儲過程:分為兩種存儲過程:
一是本地臨時存儲過程,以井字號(#)作為其名稱的第一個字符,則該存儲過程將成為一個存放在tempdb數據庫中的本地臨時存儲過程,且只有創建它的用戶才能執行它;
二是全局臨時存儲過程,以兩個井字號(##)號開始,則該存儲過程將成為一個存儲在tempdb數據庫中的全局臨時存儲過程,全局臨時存儲過程一旦創建,以后連接到服務器的任意用戶都可以執行它,而且不需要特定的權限。

④ 遠程存儲過程:在SQL Server2005中,遠程存儲過程(Remote Stored Procedures)是位于遠程服務器上的存儲過程,通常可以使用分布式查詢和EXECUTE命令執行一個遠程存儲過程。

⑤ 擴展存儲過程:擴展存儲過程(Extended Stored Procedures)是用戶可以使用外部程序語言編寫的存儲過程,而且擴展存儲過程的名稱通常以xp_開頭。

觸發器

其是一種特殊的存儲過程。一般的存儲過程是通過存儲過程名直接調用,而觸發器主要是
  通過事件(增、刪、改)進行觸發而被執行的。其在表中數據發生變化時自動強制執行。
  常見的觸發器有兩種:after(for)、instead of,用于insert、update、delete事件。
  after(for) 表示執行代碼后,執行觸發器
  instead of 表示執行代碼前,用已經寫好的觸發器代替你的操作。

約束

數據的完整性是指數據的正確性和一致性,可以通過定義表時定義完整性約束,也可以通過規則,索引,觸發器等。約束分為兩類:行級和表級,處理機制是一樣的。行級約束放在列后,表級約束放在表后,多個列共用的約束放在表后。
完整性約束是一種規則,不占用任何數據庫空間。完整性約束存在數據字典中,在執行SQL或PL/SQL期間使用。用戶可以指明約束是啟用的還是禁用的,當約束啟用時,他增強了數據的完整性,否則,則反之,但約束始終存在于數據字典中。
約束類型
總的來說有五種:唯一性和主鍵約束、外鍵約束、檢查約束、空值約束、默認值約束,
有五大關鍵詞,UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容