SQL第四章(索引和檢視)
1、索引
資料表中資料和相應儲存位置的列表
特點:提高在表或檢視中查詢資料的速度
分類: ①聚集索引
表中資料行的物理儲存順序與索引順序完全相同
/*--聚集索引--*/
--主鍵會自動生成同名聚集索引,不能再建立
②非聚集索引
表中資料行的物理儲存順序與索引順序完全相同
使用情況:某個欄位的資料唯一性較高
查詢所得的資料量較少
已經包含聚集索引
/*--非聚集索引--*/
--基本語法
--CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
--INDEX index_name
--ON table_name (column_name)
--[WITH FILLFACTOR=x] 填充因子:指定一個0~100之間的值,表示索引頁填充的百分比
--建立索引
--如果存在該索引,先將其刪除掉
IF exists(SELECT * FROM sys.indexes WHERE name = 'IX_score')
DROP INDEX stuMarks.IX_score
--對成績欄位建立非聚集索引,填充因子30%
CREATE NONCLUSTERED INDEX IX_score ON stuMarks(score) WITH FILLFACTOR= 30
GO
--使用索引
--指定按索引查詢
SELECT * FROM stuMarks WITH(INDEX = IX_score)
WHERE score between 60 and 90
例子:
if exists(select*from sys.indexes where name='IX_stuinfo_stuname')
drop index stuinfo.IX_stuinfo_stuname
create unique NONCLUSTERED
index IX_stuinfo_stuname
on dbo.stuinfo(stuname)
select*from StuInfo with(index=IX_stuinfo_stuname)
where stuName='張三'
create NONCLUSTERED
index IX_StuMarks_score
on dbo.stuMarks(score)
select*from StuMarks with(index=IX_StuMarks_score)
2、檢視
①檢視是虛擬表
②檢視不存放資料
--基本語法
--CREATE VIEW view_name [(列名...)]
--AS
--<SELECT語句>
--建立檢視
--如果存在該檢視,先將其刪除掉
IF EXISTS ( SELECT * FROM sys.views WHERE NAME = 'view_stuInfo_stuMarks')
DROP VIEW view_stuInfo_stuMarks
GO
--建立名為view_stuInfo_stuMarks的檢視
CREATE VIEW view_stuInfo_stuMarks(學號,姓名,成績)
AS
SELECT stuName,stuInfo.StuID,score FROM stuInfo LEFT JOIN stuMarks
ON stuInfo.StuID = stuMarks.StuID
GO
--使用檢視
select * from view_stuInfo_stuMarks
--檢視加密
--檢視所有檢視資訊
select * from information_schema.views;
EXEC sp_helptext 'view_stuInfo_stuMarks'
--加密試圖
IF EXISTS ( SELECT * FROM sys.views WHERE NAME = 'view_stuInfo_stuMarks')
DROP VIEW view_stuInfo_stuMarks
GO
CREATE VIEW view_stuInfo_stuMarks(學號,姓名,成績)
WITH encryption
AS
SELECT stuName,stuInfo.StuID,score FROM stuInfo LEFT JOIN stuMarks
ON stuInfo.StuID=stuMarks.StuID
GO
例子:
--刪除檢視
if exists (select*from sys.views where name='stu_marks') drop view stu_marks
go
--對 排名 學號 姓名 總成績進行排名
--建立檢視
create view stu_marks
with encryption --對檢視加密
as
select DENSE_RANK () over(order by sum(score) desc) '排名',
StuInfo.stuid '學號',stuname '姓名',stusex '性別',sum(score) '總分'
from StuInfo,StuMarks
where StuInfo.stuid=StuMarks.stuid
group by stuinfo.stuid,stuName,stusex
go
--查詢檢視
select *from stu_marks where 姓名='張三'