SQL Server 2016 Learning Notes
SQL Server 2016 Learning Notes
SQL Server 2016
一、概述
-
基本概念
- 資料(Data)和資訊(Information)
- 資料庫(Database, DB)
- 結構化查詢語言(Structured Query Language, SQL):
- 特點
- 一體化
- 使用方式靈活
- 非過程化
- 語言簡潔,語法簡單
- 組成
- 資料定義語言(Data Definition Language, DDL):Create、ALter、Drop
- 資料操作語言(Data Manipulation Language, DML): select、insert、update、delete
- 資料查詢語言(Data Query Language, DQL):select、where、order by、 group by、 having
- 資料控制語言(Data Control Language, DCL):grant、revoke
- 事務處理語言(Transaction Processing Language, TPL):begin transaction、Commit、roolback
- 指標控制語言(Pointer Control Language, CCL):declare cursor、fetch into、update where current
- 資料庫管理系統(Database Management System, DBMS)
- 資料庫系統的體系
- 集中式:單臺主機,與其他計算機互動
- C/S:客戶端
- B/S:瀏覽器
- 分散式結構
-
關係資料庫(Relational Database, RDB)
-
概念
實體、屬性、主鍵、實體型、實體集、聯絡
-
實體之間的聯絡
一對一、一對多、多對多
-
概念模型的表示方法
實體-聯絡模型(E-R模型):實體用長方框、屬性用橢圓框、聯絡用菱形框
-
資料模型三要素
- 資料結構
- 資料操作
- 完整性約束
-
常用資料模型
- 層析模型:不能表示兩個以上實體之間的複雜聯絡和實體之間的多對多關係
- 網狀模型
- 關係模型
- 基本運算:選擇、投影、連線
- 資料完整性:實體、域、參照、事務完整性、使用者定義完整性
- 事務完整性:原子性、一致性、隔離性、永續性
- 面向物件模型
-
-
設計資料庫
- 資料庫設計的正規化
- 1NF、2NF、3NF…
- 方法
- 實體關係、檢視概念、分佈設計法
- 過程
- 需求分析、概念設計、邏輯設計、物理設計
- 資料庫設計的正規化
二、執行環境
- 硬體需求
- CPU: 64位,不低於1.4GHz (最好高於2.0GHz) ,X86處理器不支援安裝
- 記憶體:4GB以上,精簡版1GB以上
- 硬碟:6GB以上
- 顯示器:1024 x 768或更高
- 軟體需求
- 作業系統:Windows Server 2012或Win8 及以上
- Web環境:IE8.0及以上
- NET Framework:4.0及以上
- 網路軟體
- 服務專案
- 整合服務(IS)
- 分析服務(AS)
- 報表服務(RS)
- SQL Server代理(Agent)
- 複製服務
- 全文搜尋
- 主資料服務
- 服務中介
- 開發工具
- 系統資料庫
- master:記錄SQL Server的所有資訊,應定期備份
- model:用於在SQL Server例項上建立所有資料庫的儲存新資料庫結構特性的模板
- msdb:代理服務資料庫,為報警、任務排程、記錄操作員的操作空間
- resource:隱形只讀資料庫,包含SQL中的所有系統物件
- tempdb:為所有的臨時表、臨時儲存過程及其他臨時操作提供儲存空間
- 資料庫設定
- 預設索引填充因子
- 硬碟充足時,可考慮將檔案和日誌檔案分別儲存到不同的物理硬碟上,可增加安全性
三、 建立與管理資料庫
- 資料庫的結構層析:物理、概念、使用者資料庫
- 常用物件
- 表
- 索引
- 檢視
- 資料庫關係圖、預設值、規則、儲存過程、觸發器、使用者
四、表和資料的完整性
-
資料完整性
- 域完整性:預設值、檢查、外來鍵、資料型別和規則
- 實體完整性:主鍵、唯一碼、唯一索引、標識列
- 引用完整性:外來鍵、檢查、觸發器和儲存過程
- 使用者定義完整性:規則、觸發器、儲存過程以及約束
-
約束型別
- Not Null、PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK
-
約束
--建立約束 --1. Not Null ALTER TABLE class ALTER COLUMN classname nvchar(12) NOT NULL GO --2.CHECK ALTER CONSTRAINT CK_name CHECK(column >= 0 and column <= 100), CONSTRAINT CK_name2 CHECK(...) Go --3.UNIQUE ALTER TABLE tablename ADD CONSTRAINT u_Email UNIQUE NONCLUSTERED(Email) GO --4.FOREIGN KEY:僅能引用位於同一伺服器上的同一資料庫中的表 ALTER TABLE tablename WITH CHECK ADD CONSTRAINT FK_sc_student FOREIGN KEY(studentno) References student(studentno) GO --禁用檢查 ALTER TABLE score With NoCHECK Add CONSTRAINT CK_final12 CHECK((final >= 0 AND final <= 100)) GO
-
規則
--只能通過Transact-SQL語句建立 CREATE RULE score_rule AS @score BETWEEN 0 and 100 GO --繫結規則 EXEC sp_dindrule 'score_rule','tabel.column' --解除繫結 EXEC sp_unbindrule 'table.column' DROP RULE rule
-
預設值
CREATE DEFAULT EXEC sp_bindefault --同規則
五、Transact-SQL基礎及高階應用
- 架構
- 是單個使用者所擁有的資料庫物件的合集,這些物件形成單個名稱空間
- 推薦使用架構,可以簡化DBO和開發人員的工作
- 常用編碼
- ASCII
- Unicode
- UTF-8:通用格式轉換,對英文使用8位(1個位元組)、中文使用24位(3個位元組)
- GB 2312:簡體中文字符集,GBK是對GB 2312的擴充套件
- 運算子及優先順序
優先順序 | 運算子 |
---|---|
1 | () 圓括號 |
2 | +(正)、-(負)、~(位非) |
3 | * 、/ 、% |
4 | +、-、+(連線)、&(位與) |
5 | 比較運算子 |
6 | ^(位異或)、|(位或) |
7 | NOT |
8 | AND |
9 | ALL、ANY、SOME、BETWEEN、IN、LIKE、OR |
10 | =(賦值) |
-
函式
-
分類:
- 字串、文字/影象管理、日期/時間類、數學計算、安全管理、SQL Server系統配置、系統統計、系統、遊標、元資料
-
數學函式
-
ABS、ASIN、ACOS、CEILING(返回大於或等於指定數值表示式的最小整數)、DEGREE(弧度轉角度)、EXP、FLOOR(返回小於或等於指定數值表示式的最大整數)、LOG、PI、POWER、RADIANS、RAND、ROUND、SIN、SQUARE、SQRT(平方根)
-
聚合函式
- AVG、COUNT、MAX、MIN、SUM、STDEV(標準偏差)、VAR(方差)
-
日期和時間
函式 功能描述 GETDATE 獲取系統當前的日期和時間 DATEADD(unit,n,date) n天/小時/年 DATEDIFF(unit,date1,date2) 計算日期1與日期2之間的差值 DATENAME(part,date) 返回日期的指定部分(如年/月/日)的字串形式 DATEPART(part,date) 返回日期的指定部分(如年/月/日)的整數形式 DAY 獲取日期部分日的整數 MONTH 獲取日期部分月的整數 YEAR 獲取日期部分年的整數 GETUTCDATE 獲取格林尼治的標準時間datetime值 日期 縮寫 引數範圍 Year Yy 1753~9999 Quarter Qq 1~4 Month Mm 1~12 Day of Year Dy 1~366 Day Dd 1~31 Week Wk 1~53 Weekday Dw 1~7 Hour Hh 0~23 Minute Mi 0~59 Second SS 0~59 Millisecond MS 0~999 -
轉換函式
-
CAST(expression AS data_type):把一個數據型別強制轉換為另一種資料型別
-
CONVERT(data_type[(length)]),expression[,style]):把表示式從一種資料型別轉換成領一種資料型別, 還允許把日期轉換成不同的樣式
-
轉換型別
-
顯示轉換
-
隱式轉換
-
-
-
字串函式
函式 功能描述 CHARINDEX 返回字串指定表示式的起始位置 DIFFERENCE 以整數返回兩個字元表示式的SOUNDEX值之差 LEFT / RIGHT 返回字串左 / 右邊開始指定個數的字元 LEN 返回給定字串表示式的字元個數,其中不包含尾隨空格 LOWER / UPPER 大寫轉換為小寫 LTRIM / RTRIM 刪除起始空格後返回字元表示式 PATINDEX 表示式中某模式第一次出現的起始位置,如果在全部有效的文字和字元資料型別中沒有找到,則返回0 QUOTENAME 返回帶有分隔符的Unicode串 REPLACE 用第三個表示式替換第一個字串中出現的所有第二個給定字串表示式 REPLICATE 以指定的次數重複字元表示式 REVERSE 字串反轉 STUFF 刪除指定長度的字元並在指定的起始點插入另一組字元 SUBSTRING 求子串函式 -
STUFF合併查詢結果為一行:
SELECT FoodId,MaterialName=STUFF( (SELECT',' +MaterialName FROM FoodMaterial WHERE FoodId=A.FoodId FOR XML path('')),1,1,'' ) FROM FoodMaterial A GROUP BY FoodId
-
-
自定義函式
-
-
控制流語句
-
IF…ELSE: 超過一行是需使用BEGIN…END
-
BEGIN…END : 組合成語句塊,主要用於WHILE、CASE、IF…ELSE子句
-
WHILE…CONTINUE…BREAK
-
CASE…WHEN…THEN… [WHEN…THEN…] (…n) ELSE…END
-
其他語句
-
GO:批處理的結束語句
-
PRINT:向客戶端返回使用者定義訊息
-
GOTO:程式跳到指定的標有識別符號的位置處繼續執行,而位於GOTO語句和識別符號之間的程式將不會被執行
label : statement | statement_block GOTO label --不推薦使用GOTO,不利於結構化程式設計
-
WAITFOR:暫時停止執行SQL、語句塊、儲存過程等,直到所設定的時間已到才繼續執行。
WAITFOR { DELAT 'time_to_pass'| TIME 'time_to_execute' } --e.g. BEGIN WIATFOR TIME '22:20:17' EXECUTE sp_help END
-
RETURN:無條件終止,可返回整型值
-
TRY…CATCH
BEGIN TRY { sql_statement | statement_block} END TRY BEGIN CATCH { sql_statement | statement_block} END CATCH [;]
-
EXECUTE:EXEC
-
-
-
WITH ROLLUP
-
在GROUP BY後再進行相同的總體計算
SELECT courseno,ROUND(avg(final),2) FROM score GROUP BY courseno WITH ROLLUP
-
-
聚合函式
- 不能被用於SELECT語句的WHERE子句中
- 便利聚合函式
- 統計聚合函式
- 超聚合
- 不能被用於SELECT語句的WHERE子句中
-
遊標(CURSOR)
-
概念
- 全域性遊標
- 區域性遊標:儲存過程、觸發器、使用者自定義的函式中宣告
- 使用步驟如下:
- 宣告遊標:DECLARE CURSOR
- 開啟遊標:OPEN
- 獲取記錄資訊:一條Fetch會執行兩步操作:首先將遊標當前指向的記錄儲存到一個區域性變數中;然後遊標將自動移動向下一條記錄。可重複執行。
- 關閉遊標:CLOSE
- 釋放遊標:Deallocate
-
運用
-
宣告遊標
DECLARE cursor_name CURSON [ LOCAL|GLOBAL] [FROM ARD_ONLY|SCROLL|] [STATIC|DYNAMIC][READ_ONLY] FOR select_statement[;]
-
開啟遊標
OPEN cursor_name
-
使用FETCH獲取記錄資訊
FETCH [NEXT|PRIOR|FIRST|LAST|ABSOLUTE {n|@nvar}|RELATIVE {n|@nvar}] FROM cursor_name [INTO @variable_name[,...n]]
-
關閉遊標
CLOSE cursor_name
-
釋放遊標
DEALLOCATE cursor_name
@@FETCH_STATUS = 0 表示遊標指向合法行記錄
CURSOR_STATUS
@@CURSOR_ROWS
-
-
大物件(Large Object, LOB)
- 包含數字化資訊的資料欄位,可以是音訊、視訊、影象及文件等
- 種類
- BLOB(二進位制大物件資料):字串最長可達2GB,用於儲存影象、剩餘、Word文件等
- CLOB(字元巨型物件資料):最大4GB的字串文字
- DBCLOB(雙位元組巨型大物件資料):最大4GB的字串文字
-
六、索引和檢視
-
索引
-
分類
- 聚集索引:索引值的順序與資料庫表中記錄的物理順序相同,即聚集索引決定了資料庫表中記錄行的儲存順序,每個表只能建立一個。
- 非聚集索引:順序不要求一致
- 唯一索引:可確保所有表中的任意兩行的索引列值(不包括NULL)不重複,可在多列建立。
-
用途
- 加速資料檢索
- 優化查詢
- 強制實施行的唯一性
-
設計的基本原則
-
經常更新(INSERT、UPDATE、DELETE)的話避免使用過多索引
-
資料量大、更新少的可建立多個索引來提高效能
-
在檢視上建立
-
若查詢語句中存在計算列,則可考慮對計算列值建立索引
-
索引最大鍵列數為16,索引最值鍵值為900B
--建立索引 CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] INDEX index_name ON {table_or_view_name}(column [ASC|DESC][,...n]) [INCLUDE(column_name[...n])] [ON { filegroup_name | defualt }] --修改索引 ALTER INDEX {index_name | ALL} On <object> {REBUID [WITH...] | DISABLE | REOGRANIZE} --索引碎片的檢測 SELECT avg_fragmentation_in_precent FROM sys.dm_db_index_physical_status(DB_ID(),OBJECT_id('table_name'),null.null,null) --碎片較少可以ALTER INDEX重組(REOGRANIZE) --碎片較多可以ALTER INDEX重建(REBUILD WITH(PAD_INDEX = ON, FILLFACTOR = 80, SORT_IN_TEMPDB = ON) --或使用CREATE INDEX重建(WITH(PAD_INDEX = ON, FILLFACTOR = 70,DROP_EXISTING = ON)) --對語句進行分析索引 SET SHOWPLAN_ALL ON GO SELECT ... GO SET SHOWPLAN_ALL IO OFF GO --分析磁碟活動量 SET STATISTICS IO ON GO SELECT ... GO SET STATISTICS IO OFF GO
-
-
七、儲存過程和觸發器
-
儲存過程
-
目的
- 提高了處理複雜任務的能力
- 增強了程式碼的複用率和共享性
- 減少了網路中資料的流量
- 儲存過程在伺服器註冊,加快了過程的執行速度
- 加強了系統的安全性:引數化儲存過程可以保護應用程式不受SQL注入式攻擊
-
型別
- 系統、使用者定義、臨時(已#或##為字首)、擴充套件
-
設計原則
-
不能超過128M
-
只能在當前資料庫中建立,如更改了遠端其他例項的資料,則不能回滾,也不參與事務處理
-
主要為了處理那些需要被多次執行的語句集
-
可以巢狀儲存過程,最大層析可以用@@
-
可引用臨時表
--常用的sql系統儲存過程 sp_helpdb: 用於檢視資料庫名稱及大小 sp_helptext sp_renamedb sp_rename sp_helplogins sp_helpsrvrolemember
--建立儲存過程 CREATE PROC[EDURE] procedure_name [;number] [ { @parameter date_type} [ = default] --設定預設值,不必指定引數也可執行 [OUTPUT]][,...n] [WITH {RECOMPILE | ENCRYPTION}] -- 每次重新編譯 / 加密 AS sql_statement [,...n]
-
-
-
觸發器
- 分類
- DML觸發器:實現表格聯動更改、防止惡意或錯誤的INSERT、UPDATE、DELETE
- DDL觸發器
- 分類
八、事務和鎖
-
事務
- 特點
- 原子性(Atomicity):全部執行或全部不執行
- 一致性(Consistency):由隔離性來表示,將資料庫從一個一致狀態轉變到另一個一致狀態
- 隔離性(Isolation):一個事務的內部操作及使用的資料對併發的其他事務是隔離的
- 永續性(Durability):事務提交,對資料庫所做的修改將是持久的
- 分類
- 自動提交事務
- 顯示事務(BEGIN TRANSACTION和COMMIT TRANSACTION或ROLLBACK TRANSACTION)
- 隱式事務(SET IMPLICIT_TRANSACTIONS ON/OFF)
- 分散式事務
- @@TRANCOUNT:檢視當前事務的個數
- 特點
-
併發
-
影響
- 更新丟失
- 不可重複讀
- 幻讀
- 髒讀
-
事務的隔離級別
SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED --未提交可讀 | READ COMMITTED --已提交可讀,可避免髒讀 | REPEATABLE READ --可重複讀 | SNAOSHOT --快照 | SERIALIZABLE --可序列化,等同於HOLDLOCK }
-
-
管理鎖
-
鎖型別
鎖型別 說明 共享(S) 保護資源,以便只能對其進行讀取訪問 排他(X) 確保不能同時對同一資源進行多個更新 更新(U) 防止常見形式的死鎖 架構 意向 建立鎖層次結構,常見IS、IU、IX 大容量更新(BU) 鍵範圍 -
死鎖
-
處理時間長的實物具有較高的優先順序
-
為防止死鎖,應遵守以下原則
- 事務需按同一順序訪問資料庫物件
- 保持事務簡短並處於同一個批處理中
- 設定和使用較低的隔離級別
select * from sys.dm_tran_locks where resource_database_id = DB_ID('table_name')
-
-
九、安全機制
-
查詢許可權
- select * from fn_my_permissions(NULL / table_name , ‘SERVER’/‘DATABASE’/‘OBJECT’)
-
伺服器角色
角色 許可權 sysadmin 擁有所有許可權 serveradmin 管理SQL Server伺服器的配置選項,關閉伺服器 diskadmin 管理磁碟檔案 processadmin 管理執行的程序 public 可檢視任何資料庫 securityadmin 稽核SQL Server系統登入,管理CREATE DATABASE許可權、讀取錯誤日誌和修改日誌 setupadmin 管理連結伺服器和啟動過程 dbcreator 建立、修改和刪除資料庫 bulkadmin 可以執行BULK INSERT語句進行大容量操作
其他
sp_rename:表、列、索引、檢視或使用者定義資料型別