因本人較懶,有些圖片缺失和東西寫的比較簡單,請多包涵php
編碼規範: 命名的規範(入鄉隨俗)java
編碼習慣:算法
團隊合做: 團隊配置管理軟件: (TFS SVN)sql
第一章數據庫
更改身份驗證模式:服務器 屬性 安全性緩存
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)
範式(
第一範式: 確保每列的原子性(最小的原子單元)(行與列的交叉點不能存在一組值)
第二範式: 知足第一範式併除主鍵列都依賴於主鍵(每一個表只描述一件事)(複合主鍵: 不能存在部分依賴關係(與每一個主鍵都有依賴關係))
第三範式:知足第二範式並處主鍵之外的其餘列都不傳遞依賴於主鍵列
)(計算列屬於冗餘列 可是查詢性能會提高的話容許保留(性能比規範化更重要))
(溝通 語言表達(少說 多看 多聽) 邏輯 條理(停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. 遊標的概念,利用遊標解決實際問題
版權聲明:本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
做者:黯淡の青春 博客地址:http://www.cnblogs.com/wuwangqianxun/