因?yàn)楣ぷ髦虚_始用到SQL Server,之前的項(xiàng)目大多都是用Oracle和Mysql,因此對SQL Server也不是太熟悉,正好手邊有《SQL Server 2016必知必會》這本書,也就花了一些時間大致讀了一遍??偨Y(jié)來說,這本書屬于入門級,適合對SQL Server沒有或者幾乎沒有基礎(chǔ)的人。
SQL Server介紹
1. Sql Server的系統(tǒng)數(shù)據(jù)庫分為:master、model、msdb和tempdb。
?Master 數(shù)據(jù)庫記錄SQLServer系統(tǒng)的所有系統(tǒng)級別信息(表sysobjects)。他記錄所有的登錄賬號(表sysusers)和系統(tǒng)配置。Master數(shù)據(jù)庫是這樣一個數(shù)據(jù)庫,他記錄所有其他的數(shù)據(jù)庫(表sysdatabases),包括數(shù)據(jù)庫文件的位置。Master數(shù)據(jù)庫記錄SQLServer的初始化信息,他始終指向一個可用的最新 Master 數(shù)據(jù)庫備份。
?Model 數(shù)據(jù)庫是作為在系統(tǒng)上創(chuàng)建數(shù)據(jù)庫的模板。當(dāng)系統(tǒng)收到“Create DATABASE” 命令時,新創(chuàng)建的數(shù)據(jù)庫的第一部分內(nèi)容從Model 數(shù)據(jù)庫復(fù)制過來,剩余部分由空頁填充,所以SQL Server數(shù)據(jù)中必須有Mode數(shù)據(jù)庫。
?Msdb 數(shù)據(jù)庫供SQLServer 代理程序調(diào)度警報和作業(yè)以及記錄操作員時使用。比如,我們備份了一個數(shù)據(jù)庫,會在表backupfile中插入一條記錄,以記錄相關(guān)的備份信息。
? Tempdb 數(shù)據(jù)庫保存系統(tǒng)運(yùn)行過程中產(chǎn)生的臨時表和存儲過程。當(dāng)然,它還滿足其他的臨時存儲要求,比如保存SQL Server生成的存儲表等。Tempdb數(shù)據(jù)庫是一個全局咨詢,任何連接到系統(tǒng)的用戶都可以在該數(shù)據(jù)庫中產(chǎn)生臨時表和存儲過程。Tempdb 數(shù)據(jù)庫在每次SQL
?Server啟動的時候,都會清空該數(shù)據(jù)庫中的內(nèi)容,所以每次啟動SQL Server后,該表都是干凈的。臨時表和存儲過程在連接斷開后會自動除去,而且當(dāng)系統(tǒng)關(guān)閉后不會有任何活動連接,因此,tempdb 數(shù)據(jù)庫中沒有任何內(nèi)容會從SQL Server的一個會話保存到另外一個會話中。
?默認(rèn)情況下,在 SQL Server 在運(yùn)行時 tempdb 數(shù)據(jù)庫會根據(jù)需要自動增長。不過,與其它數(shù)據(jù)庫不同,每次啟動數(shù)據(jù)庫引擎時,它會重置為其初始大小。如果為 tempdb 數(shù)據(jù)庫定義的大小較小,則每次重新啟動 SQL Server時,將tempdb 數(shù)據(jù)庫的大小自動增加到支持工作負(fù)荷所需的大小這一工作可能會成為系統(tǒng)處理負(fù)荷的一部分。為避免這種開銷,可以使用 ALTER DATABASE 增加 tempdb 數(shù)據(jù)庫的大小。
2. 常規(guī)標(biāo)識符和分隔標(biāo)識符
如果是不遵守標(biāo)識符命名規(guī)則的標(biāo)識符,在T-SQL中必須使用分隔符號([]): select * from [my table];
3.SQL實(shí)例就是SQL服務(wù)器引擎。在一臺計(jì)算機(jī)上可以安裝多個SQL Server 2016,每個SQL Server 2016可以理解成一個實(shí)例。
4. 在SQL Server 2016中最多可以指定32767個數(shù)據(jù)庫。
數(shù)據(jù)類型
1. tinyint:占一個字節(jié)的空間,存儲0~255的整數(shù)。
2. bigint:8個字節(jié),存儲2^-63 ~ 2^63-1
3. Varchar:與char類型的區(qū)別是:存儲的長度不是列長,而是數(shù)據(jù)的長度
4. text:存儲大容量文本,理論容量是2^31-1個字節(jié)
5. ntext:與text類似,采用unicode字符集,理論容量是2^30-1個字節(jié)
6. Rowversion:每一次對數(shù)據(jù)表的更改,SQL
7. Server都會更新一個內(nèi)部的序列數(shù),這個序列數(shù)保存在Rowversion字段中。所有Rowversion列的值在數(shù)據(jù)表中是唯一的,并且每張表中只能有一個包含Rowversion字段的列存在。
8. timestamp:一張表中只能有一個timestamp字段。
9. 約束:主鍵約束,唯一性約束,檢查約束,默認(rèn)約束,外鍵約束。
視圖
1. 通過視圖可以刪除行。但是視圖的數(shù)據(jù)必須來源于一個單表,即視圖的select語句必須只引用單個表。
T-SQL
1. T-SQL是微軟設(shè)計(jì)開發(fā)的一種結(jié)構(gòu)化查詢語言。
2. 全局變量名由@@符號開始。用戶不能建立全局變量,也不可能使用set語句去修改全局變量的值。
3. case語句格式:
Case ?When <條件表達(dá)式> then <運(yùn)算式>When <條件表達(dá)式> then <運(yùn)算式>Else <運(yùn)算式> End
SQL數(shù)據(jù)查詢
1. 用with語句檢查一致性:with語句用于指定臨時命名的結(jié)果集,這些結(jié)果集稱為公用表達(dá)式,其生命周期在該批處理語句執(zhí)行后結(jié)束。
With expression_name [(cokumn_name[,….n]]As (CTE_query_definition)
Ex:With cte_count(班級,性別,人數(shù))AS (select 班級,性別,人數(shù) from XS);Select * from cte_count;
2.?使用into子句可以將查詢結(jié)果生成放入一個新表或存放在臨時表中。如果要將查詢結(jié)果放入臨時表,在臨時表名前面加上‘#’號。
Select * into #temptableFrom XSWhere age < 30;Select * from #temptable;
3.where子句是在分組之前對數(shù)據(jù)進(jìn)行篩選,having是對分組進(jìn)行篩選
4. union中order? ? by子句只能位于最后一個查詢語句后;
5. union中列的數(shù)據(jù)類型不必完全相同,但數(shù)據(jù)類型間必須可以自動轉(zhuǎn)換
6. Order by不能用于子查詢,但是指定了top時則可以
7.子查詢最多可以嵌套32層
8.含exists的子查詢不產(chǎn)生任何數(shù)據(jù),只用來判斷子查詢中是否有結(jié)果返回
SQL數(shù)據(jù)操作
1. Primary key默認(rèn)約束是clustered,unique約束默認(rèn)為non clustered。
2. 修改視圖數(shù)據(jù)時一次只能對一個表中的數(shù)據(jù)進(jìn)行操作,不能對表中的計(jì)算字段進(jìn)行修改。
3. 視圖雖然是單表或者多表的動態(tài)數(shù)據(jù)集合,但如果用戶刪除視圖中的數(shù)據(jù)來源于單表,并且沒有觸發(fā)器等約束,那么刪除視圖中的數(shù)據(jù)也將會影響到數(shù)據(jù)表中的數(shù)據(jù)。
存儲過程
1. 存儲過程分為:系統(tǒng)存儲過程,用戶存儲過程和擴(kuò)展存儲過程。
2.存儲過程工作流程
3. sp_help和sp_helptext可以用于查詢存儲過程的結(jié)構(gòu)信息。
4. 使用alter修改存儲過程時會將之前的過程內(nèi)容進(jìn)行覆蓋。
觸發(fā)器
1. 當(dāng)執(zhí)行刪除操作時,DELETE觸發(fā)器被激活,用于控制用戶刪除的數(shù)據(jù)。當(dāng)執(zhí)行DELETE觸發(fā)器時,被刪除的數(shù)據(jù)存放在DELETED表中,操作表中的記錄被刪除。
2. UPDATE觸發(fā)器的操作類型分為兩步:一是將更新前的記錄存儲在DELETED表中,二是將更新后的記錄存儲在INSERTED表中。
3. AFTER觸發(fā)器首先會建立INSERTED和DELETED表,然后執(zhí)行SQL語句中的數(shù)據(jù)操作,最后才會執(zhí)行觸發(fā)器中的代碼。而SQL SERVER 2016支持INSTEAD OF 觸發(fā)器,用于INSTEAD OF 觸發(fā)器則是在建立INSERTED和DELETED表后直接執(zhí)行觸發(fā)器。
4. 觸發(fā)器功能:DDL觸發(fā)器,登錄觸發(fā)器
5. 禁用觸發(fā)器:DISABLE TRIGGER
索引
1. 種類:聚集索引,非聚集索引,全文索引,XML索引,空間索引,唯一索引,包含列索引,索引視圖,篩選索引。
2. 聚集索引:聚集索引根據(jù)數(shù)據(jù)行的鍵值在表或視圖中排序和存儲這些數(shù)據(jù)行。每個表只能有一個聚集索引,因?yàn)閿?shù)據(jù)行本身只能按一個順序排序。
3. 創(chuàng)建聚集索引應(yīng)當(dāng)先于創(chuàng)建非聚集索引,因?yàn)榫奂饕淖兞吮碇行械奈锢眄樞颉?/p>
4. 非聚集索引具有獨(dú)立于數(shù)據(jù)行的結(jié)構(gòu),其包含非聚集索引鍵值,并且每個鍵值項(xiàng)都有指向包含該鍵值的數(shù)據(jù)行的指針。從非聚集索引中的索引指向數(shù)據(jù)行的指針稱為行定位器。
5. 每張表只能有一個聚集索引,但允許最多有249個非聚集索引。
6. 主鍵是聚集索引。
7. Exec sp_helpindex <index_name>可以查看索引信息。
8. Set showplan_all <on|off>可以查看索引的分析。
9. 數(shù)據(jù)操作過程中會產(chǎn)生索引碎片。碎片整理的方法通過重新組織索引或者重新生成索引來完成。
10. 在sys.dm_db_index_physical_stats的返回值中,avg_fragmentation_in_percent反應(yīng)的是邏輯碎片的百分比,當(dāng)該返回值小于30%時,可以使用alter index reorganize重新組織索引,如果大于30%,使用alter index rebuild重新生成索引。
11. 每個表或者索引視圖只允許有一個全文索引。
游標(biāo)
1. 游標(biāo)是指向 查詢結(jié)果集的一個指針。
2. 游標(biāo)的實(shí)質(zhì)是一種從包含多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條的記錄的機(jī)制。
事務(wù)
1. 臟讀:當(dāng)一個事務(wù)讀取到另一個事務(wù)未提交的更新數(shù)據(jù)時稱為臟讀。
2. 幻讀:一個事務(wù)讀取到另一個事務(wù)已提交的新插入的數(shù)據(jù)。例如A和B事務(wù)并發(fā)執(zhí)行,A查詢數(shù)據(jù),B插入或者刪除數(shù)據(jù)。當(dāng)A查詢一個結(jié)果集時B正好插入一條記錄,這時A再次查詢會出現(xiàn)以前沒有或者已刪除掉的記錄。
3. 五種鎖:更新鎖,排它鎖,共享鎖,鍵范圍鎖,架構(gòu)鎖。
優(yōu)化
1. 盡量使用簡單的數(shù)據(jù)類型,例如能使用整型就不用字符型。
2. 盡量避免null。
3. 避免負(fù)邏輯。例如? ? !=,<>或not in。
4. 避免在索引列上進(jìn)行運(yùn)算,避免在索引列上用OR運(yùn)算符,避免使用IS NULL