1. 程式人生 > >SQL第四章(索引和檢視)

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 姓名='張三'