因本人較懶,有些圖片缺失和東西寫的比較簡單,請多包涵 編碼規範: 命名的規範(入鄉隨俗) 編碼習慣: 團隊合作: 團隊配置管理軟體: (TFS SVN) 第一章 更改身份驗證模式:伺服器 屬性 安全性 Master: 記錄所有系統信息 Model: 模板 Msdb: 自動備份 Tempdb: 臨時資 ...
因本人較懶,有些圖片缺失和東西寫的比較簡單,請多包涵
編碼規範: 命名的規範(入鄉隨俗)
編碼習慣:
團隊合作: 團隊配置管理軟體: (TFS SVN)
第一章
更改身份驗證模式:伺服器 屬性 安全性
Master: 記錄所有系統信息
Model: 模板
Msdb: 自動備份
Tempdb: 臨時資源
常用的資料庫對象: 表, 視圖, 存儲過程, 觸發器, 用戶自定義的函數, 索引等
文件構成:主數據文件(主數據文有且只有一個.mdf), 次要數據文件.ndf(0 ~ n個), 事務日誌文件(增刪(修改一條)改(修改兩條).ldf)(至少一個)
第二章
Catalog(資料庫)
資料庫就是數據的倉庫
由表, 關係, 操作對象組成
數據存儲在表中(數據以記錄的形式存在表中, 記錄是客觀存在的一個事物, 表的列)
定義表: 先定義表結構(列或欄位 數據類型 約束)(從對象來的)
定義類: 屬性(欄位), 方法(class 類名 { })(從對象來的)
行(record) 列(colum) 欄位(field)
常用數據類型
Unicode(用兩個位元組的長度 存儲一個字元)
Char比varchar效率高
數據完整性: 實體完整性(對象: 數據行 要求所有行都有唯一的標識符(主鍵))(實施手段: 主鍵約束, 唯一約束, 標識列和GUID列),
域完整性(列, 欄位)(數據類型, 格式, 值域範圍, 是否允許為空)(限制數據類型, 檢查約束, 外鍵約束, 預設值和非空約束),(字元, datatime加單引號)
參照完整性(引用完整性)(主外鍵關係)(不允許引用不存在的實體),
用戶自定義完整性(多用觸發器實現)(指數據的精確性和可靠性)
主鍵是數據行的唯一標識, 不重覆的列才能當主鍵
業務主鍵 邏輯主鍵
主鍵選取原則(量少性, 穩定性)
GUID數據類型(uniqueidentifier)(newid()函數調用)
在字表中創建主外鍵關聯(外鍵引用主表的主鍵)
(刪除數據truncate, 主表用不了)
外鍵在子表中建 (自引用是允許的(遞歸中可以出現))
第三章
SQL
T-SQL (微軟的), PL/SQL(Oracle的(甲骨文公司的))
數據查詢語言: DQL(query: 查詢)select(側重對數據的操作)
數據操作語言: DML(insert, update, delete)(對資料庫)
事物處理語言: TPL (begin transaction 開始事務, commit提交, rollback回滾)
數據控制語言: DCL (grant授權 revoke取消授權)
數據定義語言: DDL (create(創建) drop(刪除) alter(更新/修改)(定義資料庫及其對象(側重結構))
指針控制語言:CCL (declare cursor(聲名游標), fetch into(獲取游標中的數據到變數中))
sys.sysdatabases
DB_ID(判斷資料庫)
創建表
1. 確定表結構
2. 確定每列的數據類型
3. 添加約束
4. ...
OBJECCT_ID(判斷表)
ALTER TABLE
add constraint 添加約束
drop constraint
PK主鍵(primary key)
UQ唯一(unique)
CK檢查(check)
DF預設
FK外鍵(foreign key references(引用))
第四章
insert: 插入語句
批量插入
--創建資料庫
use master;
--select * from sys.sysdatabases;
go
if DB_ID('StuDB')is not null drop database StuDB;
go
create database StuDB;
go
--創建表
use StuDB; --打開資料庫
go
--select * from sys.sysobjects;
if OBJECT_ID('t_classInfo') is not null drop table t_classInfo; --t_bassic_classInfo TBa_ClassInfo
go
create table t_classInfo
(
ClassId char(3) not null primary key,
ClassName varchar(30) not null,
Comment varchar(150)
)
if OBJECT_ID('t_student') is not null drop table t_student;
go
create table t_student
(
StuId char(3) not null primary key,
StuName varchar(30) not null,
Birthday date,
Gender varchar(4),
ClassId char(3)
)
--添加約束
alter table t_student
add constraint DF_t_student_Gender default('男') for Gender;
alter table t_student
add constraint CK_t_student_Gender check(Gender in ('男', '女', '未知'));
alter table t_student
add constraint FK_t_student_ClassId foreign key (ClassId) references t_classInfo(ClassId);
--科目表 t_course(CourseId, CourseName, Comment)
if OBJECT_ID('t_course') is not null drop table t_course;
go
create table t_course
(
CourseId char(3) not null primary key,
CourseName varchar(30),
Comment varchar(150)
)
go
--成績表t_score(Id, StuId, CourseId, Score)成績大於等於0 小於等於100 相容一位小數
if OBJECT_ID('t_score') is not null drop table t_score;
go
create table t_score
(
Id int identity primary key,
StuId char(3), --references t_student(StuId),
CourseId char(3), --references t_course(CourseId),
Score numeric(4,1)
)
go
--添加約束
alter table t_score
add constraint FK_t_score_StuId foreign key (StuId) references t_student(StuId);
alter table t_score
add constraint FK_t_score_CourseId foreign key (CourseId) references t_course(CourseId);
alter table t_score
add constraint CK_t_score_Score check(Score >= 0 and Score <= 100)
select * from t_classInfo
insert into dbo.t_classInfo(ClassId, ClassName) values('C01','Web班');
insert into dbo.t_classInfo(ClassId, ClassName) values('C02','.net班'),
('C03','java班'),
('C04','php班');
--把查詢結果插入到現有表中(insert select(表必須預先存在))
insert into dbo.t_classInfo(ClassId, ClassName)
select '','' union
select '','' union
select '','';
--用查詢結果生成新表
--不使用create語句創建一個表結構和t_classInfo表結構相同的表,裡面不插入任何數據
select * from t_classInfo
select top 0 * into t_class from t_classInfo
drop table t_class
select * from t_class
--#表名(臨時表(保存在伺服器記憶體中 會話結束會自動銷毀))
--修改數據 不加where就是修改全表數據
update t_classInfo set ClassName = 'DotNet班',comment = '123' where ClassId = 'C02';
--刪除數據行
delete from t_classInfo where ClassId = 'C04';
--*代表所有欄位
第五章
is null
is not null(正規)(獲取非空數據)
not + 欄位 + is null (對條件取反)
規格:在sql語句中 如果字元串中有”’”,需要使用兩個”’”進行替代
distinct:去除重覆記錄
union: 將多個查詢結果合併成一個,自動去除重覆行(加all 保留重覆行)
使用union 進行數據排序要寫在最後一個select中 並且只能使用第一條語句中出現的欄位
表聯結
交叉連接(cross join)
內聯結(inner join) 執行原理:首先執行cross join(進行笛卡兒積產生笛卡爾集)使用on中的條件進行過濾(等值連接)
外聯結:
左外聯結: (left join)
右外聯結: (right join)
Left (right) join執行原理: 首先執行inner join,把表中都有的數據過濾出來,兩個表中沒有匹配到的數據看保留字 如果是left,則把左表中沒有匹配到的數據放入結果集中,否則相反(沒有匹配上的欄位的值以null值進行填充)
select * from t_student t0, t_class t1 where t0.ClassId = t1.ClassId;(等同於inner join)
等值連接丟數據
資料庫進階
資料庫設計(Database Design)
Designer: 設計者
資料庫設計,根據用戶需求 在某一具體的資料庫管理系統上,設計資料庫的結構和建立資料庫的過程
良好的設計可以(節省數據的存儲空間,能保證數據的完整性,方便進行資料庫應用系統的開發)
糟糕的資料庫設計(數據冗餘、存儲空間浪費, 記憶體空間的浪費, 數據更新和插入的異常)
設計基本步驟:
用戶需求已經明確
(建模 模型轉換 規範化(三大範式))(實體 Entity)
- 收集信息
- 標識對象
- 標識每個實體的屬性
- 標識對象之間的關係(Relationship)
- 繪製E-R圖(實體關係圖)
- 將E-R圖轉化成表(將各實體轉換為對應的表,各屬性轉化為各表的對應列, 標識每個表的主鍵列, 表之間建立主外鍵)
- 數據規範化(範式是具有最小冗餘的表結構)
範式(
第一範式: 確保每列的原子性(最小的原子單元)(行與列的交叉點不能存在一組值)
第二範式: 滿足第一範式並除主鍵列都依賴於主鍵(每個表只描述一件事)(複合主鍵: 不能存在部分依賴關係(與每個主鍵都有依賴關係))
第三範式:滿足第二範式並處主鍵以外的其他列都不傳遞依賴於主鍵列
)(計算列屬於冗餘列 但是查詢性能會提升的話允許保留(性能比規範化更重要))
(溝通 語言表達(少說 多看 多聽) 邏輯 條理(停5秒 分點))
(工程實例)
第二章
批處理: 效率高(嚴格區分大小寫)(末尾加go(批處理的標誌))(業務相關的語句放在同一個批處理中)
變數:變數是可以在程式運行期間變化的程式元素; 變數在任何程式中充當存儲信息的存儲器,保存在記憶體中; 程式運行時,為了完成演算法,某些變數會發生變化; 變數都有自己所屬的數據類型
局部變數:用戶定義的(只能在同一批處理中使用(局部變數不能跨越批處理))
全局變數:只讀的(系統維護和控制賦值)
set 一次只能為一個變數賦值
select 一次可以為多個變數賦值, 可以通過查詢語句 批量賦值
convert 數據類型轉換函數(目標類型, 要轉換的變數)
局部變數需要初始化後使用, 否則值為null, 會導致後續結果為空
通過查詢語句為變數賦值,必須保證查詢結果返回一條記錄,否則獲取的是最後一條記錄
select @a = a, @b = b from Table_A
@@ERROR 最後一個T-SQL語句的錯誤號
@@IDENTITY 最後一次插入的標識值
@@ROWCOUNT 受上一個SQL語句影響的行數
@@FETCH_STATUS 返回針對連接當前打開的任何游標發出的上一條游標 FETCH 語句的狀態
標量:一對一
子查詢
法一:採用T-SQL變數實現
declare @avgMoney money;
select avg(TotalMoney) from dbo.Tme_OrderInfo;
select * from dob.Tme_OrderInfo where totalMoney > @avgMoney;
法二:採用子查詢
select * from dbo.Tme_OrderInfo where totalMoney > (select avg(TotalMoney) from dbo.Tme_OrderInfo)(子查詢與判斷符號一起用時必須保證查詢結果只能有一個)
in 表示在列表中存在
exists 存在檢測(檢測是否存在)(返回值為true 或 false)
相關子查詢:依賴於外部查詢,不能獨立調用;相關子查詢效率低
在邏輯上,獨立要先執行一次 只執行一次; 相關要在外部行執行的時候單獨計算一次
什麼時候用相關子查詢:和自己比較的時候
exists 子查詢
if exists (select * from sys.sysobjects where name = ‘test’) drop table test;
go
派生表
把子查詢當表來用
第五章
索引:常規的未作索引的表中的行不會以特定的順序存儲,無序狀態的表被稱為堆(不用查詢每行數據,有效的提高查詢性能)
索引包含從表或視圖中一個或多個列生成的鍵,映射到指定數據的存儲位置的指針
鍵存儲在一個 B樹 (balance tree)中 快速有效的查找鍵值關聯的行
只會對索引行加鎖, 提高併發檢索速度
聚集索引:表中各行的物理順序和鍵值的邏輯(索引)順序相同(每個表只能有一個)(不允許空值)(選用以範圍查詢的列)(頻繁更新的列和非唯一的列通常不選用聚集索引)(避免非常多或非常寬的鍵上創建聚集索引)(create table 和 alter table 創建主鍵會預設創建聚集索引)
非聚集索引:除聚集索引的索引 可以有多個 但要小於249個()(指針指向位於索引頁中指針對應的物理數據)(頁級別上不包含全部數據)
唯一索引:允許空值: 只能有一個(不允許兩行具有相同的索引值)(實施實體完整性)(在創建主鍵約束和唯一性約束時自動創建)
非聚集索引創建原則:索引不是越多越好 (當選擇用在非聚集索引的列時,要查找在where join order by 子句中頻繁引用的那些列)(一個索引最多可以使用16個列 所有索引鍵列組合起來不超過900位元組)
經常插入操作的表上, 使用Fillfactor(填充因數)建索引減少頁拆分
unique 唯一索引
clustered 聚集索引
nonclustered 非聚集索引
ix_ 代指索引
多列用 , 分隔 desc 降序 不加為升序
fillfactor = 填充因數 (百分比)
split(拆分)
視圖
(封裝)放在from子句中(可以當作表來用)
視圖的作用:
1,可以篩選表中的行
2,防止未經許可的用戶訪問敏感數據
3,降低資料庫的複雜度
4,將多個物理資料庫抽象為一個邏輯資料庫
create view (name) as (select語句) go
Exec sp_helptext ‘視圖名稱’;
encryption(加密)
可更新視圖
insert update delete 等操作只能引用一個表中的列, 不允許直接修改基礎表 只允許修改視圖
可更新視圖中不能包含聚合函數, select語句中不能使用group by 或 having子句, insert update delete 語句更新 發生變化的數據只能來自一個表, 必須包含基表的必填列, 視圖不滿足以上條件 可以只用 instead of觸發器更新
第七章 事務
--創建銀行信息表
if object_id('Account') is not null drop table Account;
go
create table Account
(
AccountId char(4) primary key,
Name varchar(20) not null,
Balance decimal(18, 2) not null
);
go
alter table Account add constraint CK_Account_Balance check (Balance >= 2);
insert into Account values
('0001', 'zhangsan', 2),
('0002', 'zhangsi', 20000);
select * from Account;
begin transaction
begin try
update Account set Balance = Balance + 20000 where AccountId = '0001';
update Account set Balance = Balance - 20000 where AccountId = '0002';
commit transaction;
end try
begin catch
rollback transaction
end catch
每條查詢語句自成一個事務(transaction)
事務是作為單個邏輯工作單元執行的一系列操作, 是一個不可分割的工作邏輯單元
事務的屬性:
原子性(Atomicity)必須是原子工作單元 不可分
一致性(Consistency)事務完成時, 數據處於一致狀態
隔離性(Isolation)併發的事務時彼此隔離的 互不影響
永久性(Durability)事務完成就永久保存
begin transaction 開始事務
commit transaction 提交事務
rollback transaction 回滾事務
save tran 創建事務保存點(rollback把事務保存點之後的操作回滾 (回到事務保存點))
自動提交事務: 每條單獨的T-SQL語句作為一個事務成功自動提交 錯誤自動回滾
顯示事務: Begin transaction 指定事務的開始
隱性事務:set implicit transactions on 語句
事務的嵌套(父事務, 子事務)父事務回滾的時候以提交的子事務也會回滾
鎖 是事務獲取的一種控制資源 (保護數據資源, 防止其他食物對數據進行衝突或不相容的訪問)
數據併發訪問時怎麼保證數據的安全性
排它鎖:修改數據時 事務會為所依賴的數據資源請求排它鎖, 一旦授予, 事務將一直持有排它鎖, 直至事務完成
共用鎖:讀取數據時, 事務預設會為所依賴的數據資源請求共用鎖, 讀操作一完成,就立即釋放資源上的共用鎖(不是長期獨有占用)(表後邊加with (xlock))
存儲過程的概念和分類
存儲過程是一組預先編譯好的T-SQL代碼, 作為一個整體用於執行特定的操作, 存儲過程屬於資料庫對象,它們存放在資料庫中, 需要時用戶可以調用, 存儲過程首次執行的時候, Sql Server創建執行計劃並把它存儲在計劃記憶體緩存中,然後Sql Server就能對存儲過程的後續執行重用計劃, 合同沒有編譯且沒有準備好的等價即查詢相比,重用計劃使得存儲過程提供了更快速更可靠的性能
存儲過程是資料庫對象
存儲過程可以包含數據操作語句,變數,邏輯控制語句等
存儲過程的優點:執行速度快,允許模塊化程式設計,提高系統安全性,減少網路流通量
系統存儲過程 (常用的:sp_databases, sp_tables, sp_columns, sp_help, sp_helpconstraint, sp_helpindex, sp_helptext)
用戶自定義存儲過程
有預設值就必須都有預設值 沒有就都沒有
row_number 生成連續遞增行號
游標和觸發器
使用的五個步驟
聲明游標(declare cursor for),打開游標(open),提取數據(迴圈),關閉游標(colse),釋放游標(deallocate)
insensitive(使用游標時,對源表數據的更新不敏感,並且不允許通過游標修改源表數據)
scroll 設置fetch語句中參數first(上一條),last,prior,next,relative,absolute
read only 只讀
update 定義可通過游標更新的列
fetch into select列的數據和變數列表數據一致
@@fetch_status全局變數 等於 0 是表示成功讀取到數據行了
游標預設指向第一條記錄之前
游標是逐條處理的工具
動態SQL EXEC(‘語句’)
觸發器(跨表的check)(一種特殊的存儲過程)(強制的約束)
完成複雜的數據約束,檢查所做的sql操作是否允許,修改其它數據表裡的數據,調用更多的存儲過程,返回自定義的錯誤信息,更改原本要操作的sql語句,防止數據表結構被更改或數據表被刪除
優點:自動的,層疊更改,強制限制,可以用於跟蹤
dml觸發器, ddl觸發器, 登錄觸發器
dml觸發器:表或表的視圖上執行可以觸發,觸發器和觸發的語句在觸發器內單個事務對待,檢測到的錯誤,自動回滾
after觸發器:記錄已經更改完之後觸發,檢測到錯誤,可以回滾本次操作
instead of:取代原本要進行的操作
create trigger(創建觸發器)
許可權預設為資料庫所有者,不得轉讓,嚴重減慢數據修改操作的性能,不能對系統表和臨時表創建,不記錄日誌的更新不會引起dml觸發器的觸發
encryption 加密(for | after 都代表after觸發器)
inserted表(存儲著insert操作插入的行和update操作的新行) deleted表(村粗這update操作的舊行和delete操作刪除的行)(兩個邏輯表,有系統來維護,不允許用戶直接修改)
第十章 函數
函數是用於封裝頻繁執行的邏輯的常式
存儲過程只能用exec調用 不能放from後邊當表來用(可以有返回值,僅限於整形)
任何必須執行的代碼都可調用函數
函數是由一條或多條T-SQL語句組成的常式,可用於封裝代碼以便進行復用。函數接受零個或多個輸入參數,並返回標量值或表,函數不支持輸出參數
函數可以返回標量值,可以返回表
udf 用戶定義函數(標量函數((用於將當前的值轉換為新值,根據參數進行複雜的查找)返回單個數據值,類型在returns子句中定義),
內聯表值函數(返回一個表,單個select語句的結果),
多語句表值函數(由一條或多條T-SQL語句構建的表(和存儲過程不同,多語句表值函數可以在select語句的from子句中進行引用)))
create function (函數名) returns(返回值類型)(子句)begin return (函數體) end
內聯表值函數:通常使用視圖的任何地方使用內聯表值函數(內聯用戶定義函數)
create function ruturns + 變數名(未來返回的表) + table(類型) + (表結構 類型欄位的定義) + begin return(後邊什麼也不加) end
內聯表值函數 可以有邏輯結構
聚合函數一般出現在select子句或having子句中
Sql 知識點
1. 數據完整性的實現方式
2. 常用系統存儲過程和系統變數的作用
3. 區分批量插入數據的兩種語句
4. 掌握單條select語句的執行過程和書寫順序
5. 分組 分組後的篩選 排序的應用
6. 子查詢的應用
7. 事務的定義 特性,類型,事務相關操作所使用的語句
8. 存儲過程的概念 優點 將複雜操作封裝到存儲過程中
9. 觸發器工作原理
10 三大範式的規範定義
11. 視圖的概念 優點 視圖的應用
12. 游標的概念,利用游標解決實際問題