實驗案例一:驗證索引的作用 1、首先創建一個數據量大的表,名稱為“學生表”,分別有三列,學號,姓名和班級,如下圖所示,學號為自動編號,班級為預設值“一班”。 2、向表中插入大量數據,數據越多,驗證索引的效果越好。 使用語句完成:While 1>0 Insert into 學生表(姓名) values ...
實驗案例一:驗證索引的作用
1、首先創建一個數據量大的表,名稱為“學生表”,分別有三列,學號,姓名和班級,如下圖所示,學號為自動編號,班級為預設值“一班”。
2、向表中插入大量數據,數據越多,驗證索引的效果越好。
使用語句完成:While 1>0 Insert into 學生表(姓名) values(‘於美麗’)
上面語句是一個死迴圈,除非強制結束,如果1大於0就會一直向表中插入姓名
如下圖所示:
等待5分鐘左右,打開表的屬性,查看表的行數,當前為1032363,如下圖所示:
3、 使用語句查詢第900000行的數據,Select * from 學生表 Where 學號=900000
4、打開“sql server profiler ”工具進行跟蹤,如下圖所示:
打開“sql server profiler ”工具查看跟蹤的信息,發現查詢時間很長,cpu工作了265毫秒,reads:讀了8649次,writes:寫了10次,duration:總計花費2336毫秒完成查詢。
為了下麵分析文件更準確,多執行幾次Select* from 學生表 Where 學號=900000
然後把跟蹤的結果保存在桌面上:
5、打開“資料庫引擎優化顧問”,添加跟蹤文件,進行分析,發現索引建議,需要建立索引。
註意選擇benet資料庫中的學生表,然後點擊“開始分析”
索引類型為clusterd(聚集索引),索引列為“學號”。
6、按照“資料庫引擎優化顧問”的索引建議建立聚集索引,並且選擇“唯一”
7、再次執行Select * from 學生表Where 學號=900000
8、打開sql server profiler查看跟蹤的時間,發現查詢時間大幅提升,說明索引可以提高查詢速度。
發現總計時間為1毫秒,幾乎忽略不計
實驗案例二:分別練習創建各種索引
1、創建聚集索引
目前tstudent表中沒有任何索引也沒有主鍵
為tstudent表創建聚集索引
選中studentID,單擊左上側的主鍵按鈕
為Tstuden表的studentID創建主鍵就同時創建了聚集索引
2、創建組合索引
為成績表創建組合索引,因為一個學生不能為一門學科錄入兩次成績,所以將成績表中的studentID和subjectID創建組合索引
解決辦法:
菜單欄----工具----選項
找到設計器(designers),將標記處的勾去掉,單擊“確定”
這樣組合索引就創建成功了。
3、創建唯一索引
創建唯一性約束的時候就會創建唯一性索引,不能有重覆值
為Tstudent表創建唯一非聚集索引
create unique nonclustered index U_cardID on TStudent(cardID)
4、創建非聚集索引---可以有重覆值
為Tstudent表的姓名列創建非聚集索引
使用命令查看表上的索引
Select * from sys.sysindexes where id=(select object_id from sys.all_objects where name='Tstudent')
Indid中1代表聚集索引
Indid中2代表唯一非聚集索引
Indidz中3代表非聚集索引
使用sp_help Tstudent也可以查看到相關表的信息
實驗案例三:創建視圖
方法一:在圖形界面下創建視圖(以Myschool資料庫為例)
創建一個視圖,分別來自三個的表的三個列,並重命名列,生成的視圖名為student_info,如下圖所示:
通過查詢語句查看視圖:select * from student_info
方法二:使用語句創建視圖(以schoolDB資料庫為例)
進行資料庫設計的時候,一個表有很多列,我們可以在表上創建視圖,只顯示指定的列。
Select語句可以作為一個視圖
select Sname,sex,Class from dbo.TStudent where Class='網路班'
1、創建視圖,篩選行和列
create view netstudent
as
select Sname,sex,Class from dbo.TStudent where Class='網路班'
從視圖中查找數據:
select * from netstudent where sex='男'
創建視圖,更改列的表頭,計算列,產生計算列
selectStudentID,Sname,sex,cardID,Birthday,Email,Class
from dbo.TStudent
2、創建視圖,更改列的表頭
create view V_Tstudent1
as
select StudentID 學號,Sname姓名,sex 性別,cardID 身份證號碼,Birthday 生日,Class 班級 from dbo.TStudent
select * from V_Tstudent1
以後再去查詢的時候就非常方便了。
實驗案例四:存儲過程
1、常用的系統存儲過程
exec sp_databases --列出當前系統中的資料庫
exec sp_renamedb 'mybank','bank' --改變資料庫名稱(單用戶訪問)
use MySchool
go
exec sp_tables --當前資料庫中可查詢對象的列表
exec sp_columns student --查看表student中列的信息
exec sp_help student --查看表student的所有信息
exec sp_helpconstraint student --查看表student表的約束
exec sp_helptext view_student_result --查看視圖的語句文本
exec sp_stored_procedures --返回當前資料庫中的存儲過程列表
2、常用的擴展存儲過程(在C盤下創建一個文件夾bank)
exec xp_cmdshell 'mkdir c:\bank',no_output --創建文件夾c:\bank
exec xp_cmdshell 'dir c:\bank\' --查看文件
如果執行不了上面的語句,請開啟下麵的功能。然後再次執行上面的兩條語句。
若xp_cmdshell作為伺服器安全配置的一部分而被關閉,請使用如下語句啟用:
exec sp_configure 'show advanced options', 1 --顯示高級配置選項(單引號中的只能一個空格隔開)
go
reconfigure --重新配置
go
exec sp_configure 'xp_cmdshell',1 --打開xp_cmdshell選項
go
reconfigure --重新配置
go
3、用戶自定義的存儲過程(以schoolDB資料庫為例,計算網路管理專業的平均分)
use schoolDB
go
if exists (select * from sysobjects where name='usp_getaverageresult')
drop procedure usp_getaverageresult
go
create procedure usp_getaverageresult
as
declare @subjectid nvarchar(4)
select @subjectid=subjectid from dbo.TSubject where subJectName='網路管理'
declare @avg decimal (18,2)
select @avg=AVG(mark) from dbo.TScore wheresubJectID=@subjectid
print '網路管理專業平均分是:'+convert(varchar(5),@avg)
go
exec usp_getaverageresult
實驗案例五:觸發器
(Myschool資料庫為例)
創建觸發器(禁止修改admin表中數據):
create trigger reminder
on admin
for update
as
print '禁止修改,請聯繫DBA'
rollback transaction
go
執行語句,查看錯誤信息:
update Admin set LoginPwd='123' where LoginId='benet'
select * from Admin
實驗案例六:創建觸發器
(Myschool資料庫為例)
要求:創建一個觸發器,以確保student表中的數據不會被刪除。
create trigger stu_del
on student
for delete
as
print '你不具備刪除管理員信息的許可權'
rollback transaction
go
執行一條delete語句,測試結果。
delete from Student where StudentName='喜洋洋
文章參考微信公眾號:L寶寶聊IT