數據庫的設計
(1)什麼是數據庫的設計?
數據庫設計就是將數據庫中的數據實體以及這些數據實體之間的關係,進行規劃和結構化的過程。
(2)整個項目開發的的流程:
需求分析à概要設計à詳細設計à代碼編寫à運行測試à打包發行
(3)繪製E-R圖的工具:
Microsoft Visio
(4)三大範式理論:
Ø 第一範式(NormalFormate, 1NF)的目標是確保每列的原子性。如果每列(或者每個屬性值)都是不可再分的最小數據單元(也稱爲最小的原子單元),則滿足第一範式。
Ø 第二範式(2NF)在第一範式的基礎上更進一層,其目標是確保表中的每列都和主鍵相關。
Ø 第三範式(3NF)在第二範式的基礎上更進一層,第三範式的目標是確保每列都和主鍵直接相關,而不是間接相關。
數據庫的實現
(1)創建數據庫的語法:
create database 數據庫名
on primary
(
<數據文件參數> [,……] [<文件組參數>]
)
log on
(
{<日誌文件參數>} [,……]
)
(2)數據文件的具體參數如下。
name=邏輯文件名,
filename=物理文件名,
size=大小
maxsize={最大容器|unlimited}
filegrowth=增長量
(3)文件組的具體參數如下
filegroup 文件組明 <文件參數>[,……n]
(4)刪除數據庫。
語法:drop database 數據庫名
一般前面會加:
if exists(select * from sysdatabases wherename=’MySchool’)
(5)SQL Server中的數據類型
類型 |
數據類型 |
描述 |
整型 |
int |
佔用4個字節的整數 |
smallint |
佔用2個字節的整數 |
|
tinyint |
佔用一個字節的整數 |
|
浮點型 |
real |
近似數值類型 |
float |
近似數值類型 |
|
decimal |
固定精度和範圍的數值類型。使用時,必須制定範圍和精度。範圍是小數點左右所能存儲的數字的總位數,精度是小數點右邊存儲的數字的位數 |
|
numeric |
與decimal相同 |
|
字符型 |
char |
固定長度非Unicode字符數據,最大8000個字節 |
varchar |
可變長度非Unicode字符數據。 |
|
text |
非Unicode字符數據 |
|
Unicode型 |
nchar |
固定長度Unicode字符數據,最大4000個字節 |
nvarchar |
可變程度Unicode字符數據。 |
|
ntext |
Unicode字符數據 |
|
是/否型 |
bit |
只能是0、1或空值 |
二進制型 |
binary |
定長的二進制數據 |
varbinary |
變長的二進制數據 |
|
image |
變長的二進制數據 |
|
貨幣型 |
money |
固定精度和範圍的數值型數據 |
smallmoney |
同money,但小於money的取值範圍 |
|
日期時間型 |
datetime |
表示日期和時間,可以精確到11300秒或3.33毫秒 |
smalldatetime |
同datetime,精確到一分鐘 |
|
特殊類型 |
timestamp |
創建一個數據庫範圍內的唯一時間戳 |
uniqueidentifier |
一個全局的唯一標識符 |
(6)創建表
create table 表名
(
列1 數據類型 列的特徵,
列2 數據類型 列的特徵,
…….
)
(7)刪除表
drop table 表名
(8)數據合法的機制
Ø 實體完整性
Ø 域完整性
Ø 引用完整性
Ø 自定義完整性
(9)約束類型
Ø 主鍵約束(PrimaryKey Constraint):要求主鍵列數據唯一,並且不允許爲空。
Ø 非空約束(Not Null):要求列不能存在空值。
Ø 唯一約束(UniqueConstraint):要求該列的值必須唯一,允許爲空,但只能出現一個空值。
Ø 檢查約束(CheckConstraint):某列的取值範圍限制、格式限制等。
Ø 默認約束(DefaultConstraint):某列的默認值。
Ø 外鍵約束(ForeignKey Constraint):用於在兩表之間建立關係,需要指定引用主表的哪一列。
(10)添加約束
alter table 表名
add constraint 約束名 約束類型 具體的約束說明
(11)刪除約束
alter table 表名
drop constraint 約束名
(12)打開SQL Server聯機叢書的三種方法:
1. 工具欄à目錄
2. 索引à輸入關鍵字查找
3. 光標放置需要查找語法的關鍵字上方,按F1鍵。
SQL編程
(1)局部變量
聲明語法:declare @變量名變量類型
賦值語法:
set@變量名=值
或者
select@變量名=值
set語句和select語句的區別 |
||
|
set |
select |
同時對多個變量賦值 |
不支持 |
支持 |
表達式返回多個值時 |
出錯 |
將返回的最後一個值賦給變量 |
表達式未返回值時 |
變量被賦值爲NULL |
變量保持原型 |
(2)全局變量
SQL Server中的所有全局變量都使用兩個@@符號作爲前綴
(3)輸出語句
print 局部變量或字符串
select 局部變量 as 自定義列名
使用print語句要求以單個或字符串表達式作爲參數,而“+”運算符作爲連接兩個字符串的連接符,要求“+”運算符兩側的操作數的數據類型必須一致,
正解à例:print ‘當前錯誤號’+convert(varchar(5),@@error)
(4)cast()和convert()函數
例:cast(@Result as varchar(10))
語法: cast(表達式 as 數據類型)
convert(數據類型[(長度)], 表達式[,樣式])
(5)begin-end 語句
語法:
begin
語句或語句塊
end
begin-end語句的作用類似於C#語言的“{ }”,表示語句塊的開始和結束。
(6)if-else 語句
語法:
if(條件)
語句或語句塊1
else
語句或語句塊2
(7)while循環語句
語法:
while(條件)
begin
語句或語句塊
[begin | continue ]
end
(8)case 多分支語句
語法1:
case
when條件1 then 結果1
when條件2 then 結果2
[else其他結果]
end
語法2:
case列名
when固定值1 then 結果1
when固定值2 then 結果2
end
(9)不顯示/顯示“n行受影響”
set nocount on --不顯示
set nocount off --顯示
(10)批處理(go指令)
它是一條或多條SQL語句的集合,SQL Server將批處理指令編譯成一個可執行單元,此單元稱爲執行計劃。每個批處理可以編譯成單個執行計劃,從而提高執行效率。如果批處理包含多條SQL語句,則執行這些語句所需的所有優化的步驟將編譯在單個執行計劃中。
當一個批處理出現錯誤時,並不會影響其他批處理總SQL代碼的運行。
好處:簡化數據庫的管理。
高級查詢
(1)簡單子查詢
語法:select …… from 表1 where 列1 > (子查詢)
SQL Server執行時,先執行子查詢部分,求出子查詢部分的值,再執行整個父查詢。
注意:表連接都可以用子查詢替換,但反過來卻不一定。
(2)in 和 not in子查詢
使用in關鍵字可以使父查詢匹配子查詢返回的多個單列值。
(3)exists子查詢
語法:
ifexists(子查詢)
語句
(4)子查詢注意事項
Ø 子查詢語句可以嵌套在SQL語句中任何表達式出現的位置。
Ø 在子查詢的select字句中不能出現text、ntext、image數據類型的值。
Ø 只出現在子查詢中而沒有出現在父查詢中的表不能包含在輸出列中。
事務、視圖、索引和觸發器
(1)事務
事務是單個的工作單元。如果某一事務成功,則在該事務中進行的所有數據更改均會提交,成爲數據庫中的永久組成部分。如果事務遇到錯誤且必須取消或回滾,則所有數據更改均被清除。
(2)事務的4個特效。
Ø 原子性:事務是一個完整的操作。事務的各元素是不可分的(原子的)。
Ø 一致性:當事務完成時,數據必須處於一致狀態。
Ø 隔離性:對數據進行修改的所有併發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務。
Ø 持久性:事務的持久性不管系統是否發生了故障,事務處理的結果都是永久的。
(3)執行事務
開始事務:
begintransaction
提交事務:
committransaction
回滾事務:
rollbacktransaction
(4)事務分類
Ø 顯示事務:用begintransaction 明確執行事務的開始
Ø 隱式事務:通過設置setimplicit_transactions on 語句,將隱式事務模式設置爲打開。當以隱式事務操作時SQL Server將在提交或回滾事務後自動啓動新事務。不需要描述每個事務的開始,字謠提交或回滾每個事務即可。
Ø 自動提交事務:這是SQLServer的默認模式,它將每條單獨的T-SQL語句視爲一個事務。如果成功執行,則自動提交。如果錯誤,則自動回滾。
注:實際開發中最常用的就是顯示事務,它明確地指定事務的開始邊界。
(5)視圖
視圖是另一種查看數據庫中一個或多個表中數據的方法。視圖是一種虛擬表,通常是作爲來自一個或多個表的行或列的子集創建的。
視圖通常進行以下3種操作:
Ø 篩選表中的行。
Ø 防止未經許可的用戶訪問敏感數據。
Ø 將多個物理數據表抽象爲一個邏輯數據表。
(6)視圖的好處
1、對最終用戶的好處:
結果更容易理解。創建視圖時,可以將列名改爲有意義的名稱,使用戶更容易理解列所代表的內容。在視圖中修改列明不會影響基表的列名。
獲得數據更容易。很多人對SQL不太瞭解,因此對於他們來說,創建對多個表的複雜查詢很困難,可以通過創建視圖來方便用戶訪問多個表中的數據。
2、對開發人員的好處
Ø 限制數據檢索更容易。開發人員有時需要隱藏某些行或列中的信息。通過使用視圖,用戶可以很靈活的訪問它們需要的數據,同時保證同一個表或其他表中的其他數據的安全性。要實現這一目標,可以在創建視圖時將對用戶保密的列排除在外。
Ø 維護應用程序更方便。調試視圖比調試查詢更容易,跟蹤視圖中各個步驟的錯誤更爲容易,這是因爲所有的步驟都是視圖的組成部分。
(7)創建視圖
有兩種方式:
1、 使用MicrosoftSQL Server Management Studio創建。
2、 使用SQL語句:
語法:
create view view_name
as
<select 語句>
刪除視圖:
if exists(select * from sysobjects wherename=’view_name’)
drop view view_name
個人總結視圖:
雖然可以利用限制列名的方式查詢想顯示數據,但不及單單用一條查詢語句查詢來的快。如:
select * from view_name
視圖就是把代碼簡化吧,方便調用,僅此而已。
(8)索引概述
索引提供指針以指向存儲在表中指定列的數據值,然後根據指定的排序次序排列這些指針。
什麼是索引?
在數據庫中,索引使數據庫程序無須對整個表進行掃描,就可以在其中找到所需數據。數據庫中的索引是某個表中一列或若干列值的集合和響應的指向表中物理標識這些值的數據頁的邏輯指針清單。
(9)索引的6類
1、唯一索引:
唯一索引不允許兩行具有相同的索引值。
2、 主鍵索引
3、 聚集索引(一個表只能包含一個)
在聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。
4、 非聚集索引
5、 複合索引
6、 全文索引
(10)創建索引
有兩種方法:
1、 使用MicrosoftSQL Server Managenment Studio創建索引。
2、 使用T-SQL語句創建索引。
語法:
create [unique][clustered | nonclustered] index index_name
on table_name(column_name[, column_name]…)
[withfillfactor=x]
其中:
unique指唯一索引,可選。
clustered、nonclustered指定是聚集索引還是非聚集索引。可選。
fillfactor表示填充印子,指定一個0~100的值,該值指示索引頁填滿的空間所佔的百分比。
刪除索引:
語法:
dropindex tabel_name.index_name
刪除表時,該表的所有索引將同時被刪除。
如果要刪除表的所有索引,則先要刪除非聚集索引,再刪除聚集索引。
索引的使用注意事項:
Ø 頻繁搜索的列
Ø 經常用作查詢選擇的列
Ø 經常排序,分組的列
Ø 經常用作連接的列(主鍵/外鍵)
(11)查看索引
有兩種方式查看已建立的索引信息:
1、 用系統存儲過程sp_helpindex查看
語法:
sp_helpindextable_name
例:exec sp_helpindex result
2、 用視圖sys.indexes查看
語法:
select * from sys.indexes
(12)觸發器
觸發器更多用在insert、update、delete
create trigger myTrigger
on jiao
for insert
as
……….
begin
end
go
存儲過程
(1)概念
存儲過程是在數據庫管理系統中保存的、預先編譯的、能實現某種功能的SQL程序,它是數據庫應用中運用比較廣泛的一種數據對象。
(2)存儲過程的優點
1、模塊化程序設計
2、執行速度快,效率高
3、減少網絡流量
4、具有良好的安全性
(3)系統存儲過程
SQL Server提供系統存儲過程,它們是一組預編譯的T-SQL語句。系統存儲過程提供了管理數據庫和更新表的機制,並充分從系統表中檢索信息的快捷方式。
SQL Server的系統存儲過程的名稱以“sp_”開頭,並存在Resource數據庫中。
(4)常用的擴展存儲過程
語法:
execxp_cmdshell DOS命令 [no_output]
(5)用戶自定義的存儲過程
一個完整的存儲過程包括以下3部分。
Ø 輸入參數和輸出參數。
Ø 在存儲過程中執行的T-SQL語句。
Ø 存儲過程的返回值。
(6)創建存儲過程
語法:
createproc[edure] 存儲過程名
[{@參數1 數據類型} [=默認值] [OUTPUT],
…………
{@參數N 數據類型} [=默認值] [OUTPUT],
]
AS
<SQL語句>
刪除存儲過程:
drop proc[edure]存儲過程名