《SQL Server 從入門到精通》
第1章 數據庫基礎
1.2 數據庫的體系結構
1.2.1 數據庫三級模式結構
- 模式
模式也稱邏輯模式或概念模式,它是數據庫中全體數據的邏輯結構和特征的描述
,是所有用戶的公共數據視圖。一個數據庫只有一個模式,模式處於三級結構的中間層。
定義模式時不僅要定義數據的邏輯結構,而且要定義數據之間的聯系,定義與數據有關的安全性完整性要求
- 外模式
外模式也稱用戶模式,它是數據庫用戶(包括應用程序員和最終用戶)能夠看見和使用的局部數據的邏輯結構和特征的描述
,是數據庫用戶的數據視圖
,是與某一應用有關的數據的邏輯表示
。外模式是模式的子集。一個數據庫可以有多個外模式。
外模式是保證數據安全性的一個有力措施。
- 內模式
內模式也稱存儲模式,一個數據庫只有一個內模式。它是數據物理結構和存儲方式的描述,是數據在數據庫內部的表示方式
。
1.2.2 三級模式之間的映射
為了能夠在內部實現數據庫的3個抽象層次的聯系和轉換,數據庫管理系統在三級模式之間提供了兩層映射。
- 外模式/模式映射
對應於同一個模式可以有任意多個外模式。對於每一個外模式,數據庫系統都有一個外模式/模式映射。當模式改變時,由數據庫管理員對各個外模式/模式映射作相應的改變,可以使外模式保持不變。依據數據外模式編寫的應用程序就不用修改,保證數據與程序的邏輯獨立性
。 - 模式/內模式映射
模式/內模式映射唯一,定義了數據庫的全局邏輯結構與存儲結構之間對應關系。當數據庫的存儲結構改變時,由數據庫管理員對模式/內模式映射作相應改變,可以使模式保持不變,應用程序相應地也不做變動。保證數據與程序的物理獨立性
。
1.3 數據模型
數據模型是一種對客觀事物抽象化的表現形式。它對客觀事物加以抽象,通過計算機來處理現實世界中的具體事物。它客觀地反映了現實世界,易於理解,與人們對外部事物描述的認識相一致。
1.3.1 數據模型的概念
數據模型由數據結構、數據操作、完整性約束組成。
數據結構
:是對系統靜態特征的描述。描述對象包括數據的類型、內容、行政和數據之間的相互關系。
數據操作
:是對系統動態特征的描述,是對數據庫中各種對象實例的操作。
完整性約束
:是完整性規則的集合。他定義了給定數據模型中數據及其聯系所具有的制約和依存規則。
1.3.2 常見的數據模型
層次模型
:用樹形結構表示實體類型及實體間聯系的數據模型成為層次模型。
- 每棵樹有且僅有一個無雙親節點,稱為根。
- 樹中除根外所有節點有且僅有一個雙親。
網狀模型
:用有向圖結構表示實體類型及實體間聯系的數據模型成為網狀模型。用網狀模型編寫應用程序及其復雜,數據的獨立性較差。關系模型
:以二維表來描述數據。在關系模型中,每個表有多個字段列和記錄行,每個字段列有固定的屬性(數字、字符、日期等)。關系模型數據結構簡單、清晰、具有很高的數據獨立性,因此是目前主流的數據庫數據模型。
關系
:二維表元組
:二維表一行,表中的記錄屬性
:二維表一列,用類型和值表示域
:每個屬性取值的變化范圍,如性別的域為{男,女}
關系模型中的數據約束:
實體完整性約束
:約束關系的主鍵屬性值不能為空參照完整性約束
:關系之間的基本約束用戶定義的完整性約束
:反應具體應用中數據的語義要求
1.3.3 關系數據庫的規范化
第一范式(1NF)、2NF、3NF、鮑依斯-科得范式(BCNF)、4NF、5NF。其中,NF是Normal Form的縮寫。一般情況下,只要把數據規范到第三范式標准即可滿足需要。
1NF
:在一個關系中,消除重復字段,且各字段都是最小的邏輯存儲單位。2NF
:1NF基礎上,消去非主屬性對鍵的部分函數依賴3NF
:2NF基礎上,消去非主屬性對鍵的傳遞函數依賴BCNF
:3NF基礎上,消去主屬性對鍵的傳遞函數依賴4NF
:BCNF基礎上,消去表中的多值依賴
詳細說明
1.3.4 關系數據庫的設計原則
- 數據庫內文件的數據組織應獲得最大限度的共享、最小的冗余度,消除數據及數據依賴關系中的冗余部分,使依賴於同一個數據模型的數據達到有效的分離。
- 保證輸入、修改數據時數據的一致性與正確性。
- 保證數據與使用數據的應用程序之間獲得高度獨立性。
1.3.5 實體與關系
實體是指客觀存在並可相互區別的事物,也可以是抽象的概念或關系。實體之間有三種關系。
- 一對一關系:表A中的一條記錄確實在表B中有且只有一條相匹配的記錄。在一對一關系中,大部分相關信息都在一個表中。
學生與學生的身份證號
- 一對多關系:表A中的行可以在表B中有許多匹配行,但是表B中的行只能在表A中有一個匹配行。
一個學生只屬於一個班,一個班有多名學生
- 多對多關系:關系中的每個表的行在相關表中具有多個匹配行。在數據庫中,多對多關系的建立是依靠第3個表(稱作連接表)實現的,連接表包含相關的兩個表的主鍵列,然后從兩個相關表的主鍵列分別創建與連接表中的匹配列的關系。
一個學生可以選擇多門課,一門課也有多名學生
1.4 常見關系數據庫
Oracle在並行處理、實時性、數據處理速度方面都有較好的性能。
第4章 創建與管理數據庫
4.1 認識數據庫
4.1.1 數據庫基本概念
關系數據庫
關系數據庫是支持關系模型的數據庫。關系模型由關系數據結構、關系操作集合和完整性約束3部分組成。
關系數據結構
:在啊關系模型中數據結構單一,現實世界的實體以及實體間的聯系均用關系來表示,實際上關系模型中數據結構就是一張二維表關系操作集合
:關系操作分為關系代數、關系演算、具有關系代數和關系演算雙重特點的語言(SQL語言)完整性約束
4.1.2 數據庫常用對象
表
:表是包含數據庫中所有數據的數據庫對象,由行和列組成,用於組織和存儲數據。字段
:表中每列成為一個字段,字段具有自己的屬性,如字段類型、字段大小等。其中,字段類型是字段最重要的屬性,它決定了字段能夠存儲哪種數據。索引
:索引是一個單獨的、無力的數據庫結構。它是依賴於表建立的,在數據庫中索引是數據庫程序無需對整個表進行掃描,就可以在其中找到所需的數據。視圖
:視圖是從一張或多張表中導出的表(也稱虛擬表),是用戶查看數據表中數據的一種方式。表中包括幾個被定義的數據列與數據行,其結構和數據建立在對表的查詢基礎上。存儲過程
:存儲過程是一組為了完成特定功能的SQL語句集合(包含查詢、插入、刪除和更新等操作),經編以后以名稱的形式儲存在SQL Server服務器端的數據庫中,由用戶通過制定存儲過程更的名字來執行。當這個存儲過程被調用執行時,這些操作也會被同時執行。
4.2 SQL Server的命名規范
4.2.1 標識符
- 標識符格式
- 標識符的首字符必須是Unicode所定義字符,'_' '@' '#'。
'@'開始的標識符表示局部變量或參數
'#'開始的標識符表示臨時表或過程
'##'開始的標識符表示全局臨時對象 - 標識符后的后續字符
Unicode 2.0 標准中所定義的字母。
來自拉丁字母或其他國家/地區腳本的十進制數字。
'@' '$' '#' '_' - 標識符不允許是Transact-SQL的保留字
微軟官方文檔 - 不允許嵌入空格或其他特殊字符
- 標識符分類
- 常規標識符:符合標識符的格式規則
- 分隔標識符:包含在
“”
或[]
內的標識符。該標識符可以不符合標識符的格式規則。
4.2.2 對象命名規則
在一個數據庫中創建了一個數據庫對象后,數據庫對象的完整名稱應該由服務器名、數據庫名、擁有者名和對象名
4部分組成
[[[server.][database].][owner_name].]object_name
服務器、數據庫和所有者的名稱即所謂的對象名稱限定符。當引用一個對象時,不需要指定服務器、數據庫和所有者,可以利用句號標出他們的位置,從而省略限定符。
指定了所有4哥部分的對象名稱被稱為完全合法名稱。
4.3.3 使用管理器刪除數據庫
刪除數據庫時必須滿足以下條件
- 如果數據庫設計日志傳輸操作,在刪除數據庫之前必須取消日志傳送操作
- 若要刪除為事務復制發布的數據庫,或刪除為合並復制發布或訂閱的數據庫,必須首先從數據庫中刪除復制。如果數據庫已損壞,不能刪除復制,可以先將數據庫設置為脫機狀態,然后再刪除數據庫。
- 如果數據庫中存在數據庫快照,必須首先刪除數據庫快照。
系統數據庫(msdb、model、master、tempdb)無法刪除,刪除數據庫后應立即備份master數據庫,因為刪除數據庫將更新master數據庫中的信息。
第5章 操作數據表與視圖
5.1 數據表基礎知識
5.1.1 基本數據類型
基本數據類型詳情
char、varchar、nchar、nvarchar的區別:
5.1.2 用戶定義數據類型
- 使用T-SQL語句創建用戶自定義數據類型
創建用戶自定義數據類型
語法:
sp_addtype [ @typename = ] type,
[ @phystype = ] system_data_type
[ , [ @nulltype = ] 'null_type' ] ;
實例:
USE test
EXEC sp_addtype postcode,'char(8)','not null'
刪除用戶自定義數據類型
語法:
sp_droptype [ @typename = ] 'type'
實例:
USE test
EXEC sp_droptype postcode
5.1.3 數據表的數據完整性
Microsost SQL Server 2008提供多種強制數據完整性的機制。
- NULL or NOT NULL
表的每一列都有一組屬性,如名稱、數據類型、數據長度和為空性等,列的所有屬性即構成列的定義。列可以定義為允許或不允許空值。
- NULL:默認情況下,列允許空值,即允許用戶在增加數據是省略該列的值。
- NOT NULL:不允許在沒有指定列默認值的情況下該列的值。
- 默認值
如果在插入行時沒有指定列的值,那么默認值將指定列中所使用的值。默認值可以使任何取值為常量的對象,如內置函數和數學表達式等。
- 在CREATE TABLE中使用DEFAULT關鍵字創建默認定義,將常量表達式指派為列的默認值,這是標准方法。
- 使用CREATE DEFAULT語句創建默認對象,然后使用sp_bindefault系統存儲過程將它綁定到列上,這個一個向前兼容的功能。[此功能將在Microsoft SQL Server的未來版本中刪除]
- IDENTITY(特征標識屬性)
數據表中如果某列被指派IDENTITY,系統將自動為表中插入的新行生成連續遞增的編號。因為標識值通常唯一,所以標識列通常定義為主鍵。
IDENTITY屬性適用於INT、SALLINT、TINYINT、DECIMAL(P,0)、UMERIC(P,0)數據類型的列。 - 約束
約束是用來定義Microsoft SQL Server 2008自動強制數據庫完整性的方式。使用約束優先於使用觸發器、規則和默認值。SQL Server 2008中共有以下5種約束。
- NOT NULL:使用戶必須在表的指定列中輸入一個值。每個表中可以有多個非空約束。
- Check(檢查):用來指定一個布爾操作,限制輸入到表中的值。
- Unique(唯一性):建立一列或多列的組合以唯一標識表中的每一行。逐漸可以保證實體完整性,一個表只能有一個主鍵,同時逐漸中的列不能接受空值。
- Foreign key(外鍵):用於建立和加強兩個表數據之間的鏈接的一列或多列。當一個表中作為主鍵的一列被添加到另一個表中時,鏈接就建立了,主要目的是控制存儲在外鍵表中的數據。
5.3 創建、刪除和修改約束
約束是SQL Server提供的自動強制數據完整性的一種方式,它是通過定義列的取值規則來維護數據的完整性,是強制完整性的標准機制。使用約束優先於使用觸發器、規則和默認值。查詢分析器也使用約束定義生成高性能的查詢執行計划。
5.3.3 UNIQUE約束
當在表中已創建主鍵,但又要保證其他數據列的值唯一時,可以使用UNIQUE約束。
使用UNIQUE約束可以確保在非主鍵列中部輸入重復的值。UNIQUE約束和PRIMARY KEY約束都具有強制唯一性,但想要強制一列或多列組合(不是PRIMARY KEY)的唯一性時,應使用UNIQUE約束而不是PRIMARY KEY約束。
可以對一個表定義多個UNIQUE約束,但只能定義一個PRIMARY KEY約束。而且UNIQUE約束允許NULL。當與參與UNIQUE約束的任何值一起使用時,每列只允許一個NULL。FOREIGN KEY約束可以引用UNIQUE約束。
操作:
表->設計->索引/鍵->增加
列:選擇列
類型:唯一鍵
5.3.4 CHECK約束
CHECK約束通過限制輸入到列中的值來強制域的完整性。此類約束類似於FOREIGN KEy約束,可以控制放入到列中的值。
- FOREIGN KEY約束:從其他表獲得有效值列表
- CHECK約束:通過不急於其他列中的數據的邏輯表達式確定有效值。
創建CHECK約束可以將某列數據的取值范圍限制在指定的范圍內,從而防止輸入的數據超出指定的范圍。
操作
表->設計->CHECK約束->增加
表達式:old>18 and old<100
5.3.5 默認約束
默認約束使用戶能夠定義一個值,每當用戶沒有在某一列中輸入值時,則將所定義的值提供給這一列。如果用戶對此列沒有特定的要求,可以使用默認約束來為此列輸入默認值。
即使列為NOT NULL,設置默認約束后,可不進行輸入,會使用默認值。
操作
表->設計->選中列->列屬性
默認值或綁定:https://image.baidu.com/s/101.jpg
5.3.6 FK(外鍵)約束
FK適用於建立兩個表數據之間連接的一列或多列。通過將保存表中主鍵值的一列或多列增加到另一個表中,可創建兩個表之間的鏈接,這個列就成為第二個表的外鍵。
操作
表->設計->關系->增加
表和列規范:選擇主鍵表的列和外鍵表的列
INSERT和UPDATE規范
刪除規則
不執行任何操作:報錯不執行
級聯:刪除主鍵表列的同時將關聯的外鍵表中的列同時刪除
更新規則
級聯:更新主鍵表列的同時將關聯的外鍵表中的列同時更新
SQL的主鍵和外鍵的作用:
外鍵取值規則:空值或參照的主鍵值。
- 插入非空值時,如果主鍵表中沒有這個值,則不能插入。
- 更新時,不能改為主鍵表中沒有的值。
- 刪除主鍵表記錄時,你可以在建外鍵時選定外鍵記錄一起級聯刪除還是拒絕刪除。
- 更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。
5.4 關系的創建與維護
5.4.1 一對一關系
在一對一關系中,大部分相關信息都在一個表中。特點
- 分割一個含有許多列的表
- 出於安全考慮而隔離表的某一部分
- 存儲可以很容易刪除的臨時數據,只需刪除表即可刪除這些數據
- 存儲值應用於主表子集的信息。
如果連個相關列都是主鍵或具有唯一約束關系,創建的就是一對一關系。
5.4.2 一對多關系
一對多關系是最常見的關系類型,是指表A中的行可以在表B中有許多匹配行,但是表B中的行只能在表A中有一個匹配行
如果在相關列中只有一列是主鍵或具有唯一約束,則創建的是一對多關系。
5.4.3 多對多關系
多對多關系是指關系中每個表的行在相關表中具有多個匹配行。在數據庫中,多對多關系的建立是依靠第3哥表即連接表實現的,連接表包含相關的兩個表的主鍵列,然后從兩個相關表的主鍵列分別創建與鏈接表中匹配列的關系。
5.5 視圖概述
視圖是一種常用的數據庫對象,它將查詢的結果以虛擬表的形式存儲在數據中。視圖並不在數據庫中以存儲數據集的形式存在。視圖的結構和內容是建立在對表的查詢基礎之上的,和表一樣包括行和列,這些行列數據都來源於其所引用的表,並且是在引用視圖過程中動態生成的。
視圖中的內容是有查詢定義來的,並且視圖和查詢都是通過SQL語句定義的,他們有着許多相同和不同之處。
× | 視圖 | 查詢 |
---|---|---|
存儲 | 視圖存儲為數據庫設計的一部分, | 查詢不存儲 |
排序 | 只有當視圖包括TOP子句才能排序視圖 | 可以排序任何查詢結果 |
加密 | 可以加密視圖 | 不能加密查詢 |
可以禁止所有用戶訪問數據庫的基表,而要求用戶只能通過視圖操作數據。這種方法可以保護用戶和應用程序不受某些數據庫修改的影響
5.6 使用企業管理器管理視圖
標准視圖:保存在數據庫中的SELECT查詢語句,即通常意義上理解的視圖。
索引視圖:創建有索引的視圖成為索引視圖。他經過計算並存儲有自己的數據,可以提高某些類型查詢的性能,尤其適用於聚合許多行的查詢,但不太適合於經常更新的基本數據集。
分區視圖:是在一台或多台服務器間水平聯結一組表中的分區數據,以使數據看上去來源於一個表。