實驗九視圖索引

設計性實驗
1. 創建視圖V_A包括學號,姓名,性別,課程號,課程名、成績;

一個語句把學號103 課程號3-105 的姓名改為陸君茹1,性別為女 ,然后查看學生表的信息變化,再把上述數據改為原值

-- 創建視圖 V_A_065
CREATE VIEW V_A_065 AS
SELECT s.Sno 學號, s.Sname 姓名, s.Ssex 性別, sc.Cno 課程號, c.Cname 課程名, sc.Degree 成績
FROM student065 s
JOIN Score065 sc ON sc.Sno = s.Sno
JOIN Course065 c ON c.Cno = sc.Cno;-- 修改數據
UPDATE V_A_065
SET 姓名 = '陸君茹1', 性別 = '女'
WHERE 學號 = '103' AND 課程號 = '3-105';-- 還原
UPDATE V_A_065
SET 姓名 = '陸君茹', 性別 = '男'
WHERE 學號 = '103' AND 課程號 = '3-105';
-- 驗證視圖結構和數據
SELECT * FROM V_A_065;

在這里插入圖片描述
在這里插入圖片描述

一個語句把學號101 課程號4-101 的姓名改為李君帥1,課程名為[馬克思主義基本原理]概論]?如何才能完成修改,再把上述數據改為原值

由于課程名是只讀字段(來自 Course065 表),不能通過視圖直接修改。
只能更新允許更新的字段(如學生姓名)
-- 只修改姓名
UPDATE V_A_065
SET 姓名 = '李君帥1'
WHERE 學號 = '101' AND 課程號 = '4-101';
查看修改后的視圖數據 SELECT * FROM V_A_065 WHERE 學號 = '101' AND 課程號 = '4-101';
查看原始學生表是否更新 SELECT * FROM student065 WHERE Sno = '101';

在這里插入圖片描述

– 添加一行數據 --視圖涉及多張表連接,默認不允許直接插入。需創建 INSTEAD OF INSERT 觸發器 或 直接插入基礎表

向基礎表中插入
INSERT INTO student065(Sno, Sname, Ssex, Sbirthday, Class)
VALUES ('110', '張小紅', '女', NULL, NULL);INSERT INTO Course065(Cno, Cname, Tno)
VALUES ('C001', '高等數學', 'T001');INSERT INTO Score065(Sno, Cno, Degree)
VALUES ('110', 'C001', 88);
-- 查看新增記錄是否出現在視圖中
SELECT * FROM V_A_065 WHERE 學號 = '110';
2. 創建視圖V_B, 優秀學生(所有成績不低于80),包括姓名,課程名、成績 (WITH ENCRYPTION)
檢查WITH ENCRYPTION 效果 
創建加密視圖
CREATE VIEW V_B1_065 WITH ENCRYPTION AS
SELECT s.Sname 姓名, c.Cname 課程名, sc.Degree 成績
FROM student065 s
JOIN Score065 sc ON sc.Sno = s.Sno
JOIN Course065 c ON c.Cno = sc.Cno
WHERE sc.Degree >= 80;
GO
-- 查看系統表中視圖定義
SELECT name, text
FROM sysobjects o
JOIN syscomments c ON o.id = c.id
WHERE name = 'V_B1_065';--加密成功時,text 字段為空或亂碼

在這里插入圖片描述

把王麗娜 的計算機導論 成績(91)改為80,并查看成績表和V_B中的數據

修改成績
UPDATE Score065
SET Degree = 80
WHERE Sno = '107' AND Cno = '3-105'; 
-- 查看視圖中是否包含該記錄
SELECT * FROM V_B1_065 WHERE 姓名 = '王麗娜' AND 課程名 = '計算機導論';

在這里插入圖片描述

3.創建視圖V_C, 優秀學生(所有成績不低于80),包括姓名,課程名、成績 (WITH check option)
檢查WITH check option效果
把王麗娜的計算機導論 成績(91)改為85,并查看成績表和V_C中的數據
--創建帶 CHECK OPTION 的視圖
CREATE VIEW V_C1_065 AS
SELECT s.Sname 姓名, c.Cname 課程名, sc.Degree 成績
FROM student065 s
JOIN Score065 sc ON sc.Sno = s.Sno
JOIN Course065 c ON c.Cno = sc.Cno
WHERE sc.Degree >= 80
WITH CHECK OPTION;
GO
-- 成功修改
UPDATE V_C1_065
SET 成績 = 85
WHERE 姓名 = '王麗娜' AND 課程名 = '計算機導論';
-- 查看最終成績
SELECT * FROM Score065 WHERE Sno = '107' AND Cno = '3-105';----再把王麗娜  的計算機導論 成績改為78,并查看成績表和V_C中的數據    ???
UPDATE V_C1_065
SET 成績 = 78
WHERE 姓名 = '王麗娜' AND 課程名 = '計算機導論';

在這里插入圖片描述
在這里插入圖片描述

4.對教師表按姓名創建唯一性索引;
創建唯一索引
CREATE UNIQUE INDEX tname_UNI_ind_065 ON teacher065 (Tname);
查看索引信息
EXEC sp_helpindex 'teacher065';

在這里插入圖片描述

5.對課程表按課程名創建聚集索引;???

– 創建聚集索引
CREATE CLUSTERED INDEX cname_cl_ind_065 ON Course065 (Cname);
– 查看索引信息
EXEC sp_helpindex ‘Course065’;
在這里插入圖片描述
在這里插入圖片描述

6.創建索引視圖V_D,包括學號,姓名,性別,課程號,課程名、成績,并按姓名創建索引
創建帶 SCHEMABINDING 的視圖
CREATE VIEW V_D_065 WITH SCHEMABINDING AS
SELECT s.Sno, s.Sname, s.Ssex, sc.Cno, c.Cname, sc.Degree
FROM dbo.student065 s
JOIN dbo.Score065 sc ON sc.Sno = s.Sno
JOIN dbo.Course065 c ON c.Cno = sc.Cno;
GO
-- 創建聚集索引
CREATE UNIQUE CLUSTERED INDEX sname_ind_065 ON V_D_065 (Sname);
-- 查看索引信息
EXEC sp_helpindex 'V_D_065';
7.刪除上述建的全部索引
-- 刪除索引
DROP INDEX IF EXISTS tname_UNI_ind_065 ON teacher065;
DROP INDEX IF EXISTS cname_cl_ind_065 ON Course065;
DROP INDEX IF EXISTS sname_ind_065 ON V_D_065;-- 查看剩余索引
EXEC sp_helpindex 'teacher065';
EXEC sp_helpindex 'Course065';
EXEC sp_helpindex 'V_D_065';
思考題

(1)視圖的作用是什么?
簡化復雜查詢:視圖可以將復雜的多表查詢、連接等操作封裝起來,提供一個簡單的接口給用戶。
提高安全性:通過視圖限制用戶只能訪問特定的數據列或行,保護敏感數據不被未授權用戶查看。
實現邏輯獨立性:當底層數據庫結構發生變化時(如表結構修改),如果應用使用的是視圖而不是直接操作表,只需調整視圖定義即可,不影響前端應用。
支持虛擬表操作:例如聚合、分組等操作可以直接在視圖中定義,簡化了數據分析過程。
(2)什么是索引視圖?如何創建
索引視圖:是指帶有聚集索引的視圖。與普通視圖不同,索引視圖的數據是物理存儲的,這使得它能夠顯著提高查詢性能,特別是對于那些頻繁使用的復雜查詢。
創建方法:
必須使用 WITH SCHEMABINDING 創建視圖,以確保視圖定義不會因為基礎表結構的變化而失效。
(3)舉例說明什么是聚集索引,非聚集索引
聚集索引(Clustered Index):決定了表中數據的物理存儲順序。每個表只能有一個聚集索引。例如,在學生表中按照學號(Sno)排序,則學號上的索引就是聚集索引。
CREATE CLUSTERED INDEX idx_student_Sno ON student065(Sno);
非聚集索引(Nonclustered Index):并不改變數據的實際存儲順序,而是創建一個包含指向實際數據頁指針的索引結構。一張表可以有多個非聚集索引。例如,在學生表中按姓名(Sname)建立非聚集索引。
CREATE NONCLUSTERED INDEX idx_student_Sname ON student065(Sname);
(4)簡述使用聚集索引,非聚集索引檢索數據的過程?
聚集索引檢索過程:當你根據聚集索引鍵(如學號)進行查詢時,數據庫可以直接定位到數據所在的位置,因為它反映了數據的實際存儲順序。
非聚集索引檢索過程:首先查找非聚集索引找到對應記錄的指針,然后根據這個指針再去讀取實際的數據頁。這意味著非聚集索引通常需要兩次I/O操作(一次用于讀取索引頁,另一次用于讀取數據頁)。
(5)什么是全文索引?如何創建和使用?(有興趣的同學選做)
全文索引(Full-Text Index):是一種特殊的索引類型,用于對文本類型字段(如VARCHAR, NVARCHAR, TEXT等)進行高效的搜索。它支持更高級的搜索功能,比如全文搜索、布爾運算符、近似詞匹配等。

實驗小結(實驗中遇到的問題及解決過程、實驗中產生的錯誤及原因分析、實驗體會和收獲)

在這次數據庫實驗中,我學習了視圖和索引的功能及其應用,讓我對數據庫設計有了更深的理解。整個過程充滿了挑戰,但正是這些挑戰促使我在解決問題的過程中不斷進步。
創建視圖時,我最初遇到了一些困惑,例如試圖在一個批處理中同時執行 CREATE VIEW 和 SELECT * FROM view_name 的命令,結果系統提示錯誤信息:“不能在一個批處理中創建視圖并查詢它。”經過查閱資料和反復嘗試,我發現每個DDL操作(如 CREATE, ALTER)必須單獨作為一個批處理來執行,中間需要用 GO 分隔開。
在使用視圖進行數據更新時,我又遭遇了新的問題。當試圖通過多表連接的視圖修改某些字段時,發現有些字段能夠成功更新,而另一些則會失敗。比如,修改學生姓名可以順利完成,但嘗試更改課程名稱卻無法實現。這是因為課程名稱來源于另一張表,SQL Server不允許直接通過視圖修改多個基表的數據。這個問題教會了我區分哪些字段是可更新的,如果確實需要修改,可以通過觸發器(INSTEAD OF UPDATE)間接完成,或者直接操作基礎表。
此外,我嘗試向視圖中插入新記錄,卻收到了“視圖不可更新”的錯誤提示。這表明該視圖涉及多張表的連接,SQL Server默認情況下不允許這樣的操作。解決方法包括創建 INSTEAD OF INSERT 觸發器,或直接操作基礎表進行插入。
在為視圖添加索引的過程中,我也遇到了不少困難,比如提示“不能為未綁定架構的視圖創建索引”、“必須先創建聚集索引”等。原來,索引視圖有著嚴格的限制條件。為了克服這些問題,我學會了使用 WITH SCHEMABINDING 創建視圖,并確保所有引用的表和列都加上了 dbo. 前綴,同時還必須首先創建唯一的聚集索引,保證視圖中沒有聚合函數或復雜的表達式。通過這次實踐,我對索引的本質和用途有了更加直觀的認識,了解到正確的索引設計對于提升查詢效率至關重要。
總的來說,這次實驗不僅讓我掌握了視圖和索引的基本操作,更讓我體會到數據庫系統的強大功能與靈活性。雖然過程中遇到了許多障礙,但正是這些挑戰幫助我在解決問題的同時不斷提升自我。這次寶貴的經驗將成為我未來學習道路上的重要財富,激勵我繼續探索數據庫領域的更多奧秘,也希望自己可以花更多時間學習數據庫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83034.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

typeof運算符和深拷貝

typeof運算符 識別所有值類型識別函數判斷是否是引用類型(不可再細分) //判斷所有值類型 let a; typeof a //undefined const strabc; typeof str //string const n100; typeof n //number const …

NAT/代理服務器/內網穿透

目錄 一 NAT技術 二 內網穿透/內網打洞 三 代理服務器 一 NAT技術 跨網絡傳輸的時候,私網不能直接訪問公網,就引入了NAT能講私網轉換為公網進行訪問,主要解決IPv4(2^32)地址不足的問題。 1. NAT原理 當某個內網想訪問公網,就必…

Git的安裝和配置(idea中配置Git)

一、Git的下載和安裝 前提條件:IntelliJ IDEA 版本是2023.3 ,那么配置 Git 時推薦使用 Git 2.40.x 或更高版本 下載地址:CNPM Binaries Mirror 操作:打開鏈接 → 滾動到頁面底部 → 選擇2.40.x或更高版本的 .exe 文件&#xf…

【教程】Docker更換存儲位置

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~ 目錄 背景說明 更換教程 1. 停止 Docker 服務 2. 創建新的存儲目錄 3. 編輯 Docker 配置文件 4. 遷移已有數據到新位置 5. 啟動 Docker 服務 6…

PostgreSQL 配置設置函數

PostgreSQL 配置設置函數 PostgreSQL 提供了一組配置設置函數(Configuration Settings Functions),用于查詢和修改數據庫服務器的運行時配置參數。這些函數為數據庫管理員提供了動態管理數據庫配置的能力,無需重啟數據庫服務。 …

sql server 2019 將單用戶狀態修改為多用戶狀態

記錄兩種將單用戶狀態修改為多用戶狀態,我曾經成功過的方法,供參考 第一種方法 USE master; GO -- 終止所有活動連接 DECLARE kill_connections NVARCHAR(MAX) ; SELECT kill_connections KILL CAST(session_id AS NVARCHAR(10)) ; FROM sys.dm_ex…

主機A向主機B發送一個長度為L字節的文件,假設TCP的MSS為1460字節,則在TCP的序號不重復使用的前提下,L的最大值是多少?

📘題干回顧: 主機A向主機B發送一個長度為L字節的文件,假設TCP的MSS為1460字節,則在TCP的序號不重復使用的前提下,L的最大值是多少? 這個問題關鍵在于“TCP序號不重復使用”。 ? 正確答案是:D.…

一次因校時服務器異常引起的性能差異分析

一次因校時服務器異常引起的性能差異分析 一.背景知識1. **TSC 頻率**:硬件級高精度計時2. **gettimeofday**:用戶態時間接口3. **adjtimex**:系統時鐘的軟件校準4. **`clock_adjtime(CLOCK_REALTIME, {modes=ADJ_TICK})`**: 用于修改系統時鐘中斷間隔(`tick` 值)。5. 關系…

acwing 4275. Dijkstra序列

題目背景 輸入 輸出 完整代碼 #include<bits/stdc.h> using namespace std; int n,m,k,a[1010],dist[1010],g[1010][1010],st[1010];int dij(int u){memset(st,0,sizeof st);memset(dist,0x3f,sizeof dist);dist[u]0;for(int i0;i<n;i){int ta[i];for(int j1;j<n;…

[思維模式-37]:什么是事?什么是物?什么事物?如何通過數學的方法闡述事物?

一、基本概念 1、事&#xff08;Event) “事”通常指的是人類在社會生活中的各種活動、行為、事件或情況&#xff0c;具有動態性和過程性&#xff0c;強調的是一種變化、發展或相互作用的流程。 特點 動態性&#xff1a;“事”往往涉及一系列的動作、變化和發展過程。例如&a…

Linux常用命令40——alias設置命令別名

在使用Linux或macOS日常開發中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;alias命令來自英文單詞alias&#xff0c;中文譯為“別名”&#xff0c;其功能是設置命令別名信息。我們可以使用alias將一些較長的命令進行簡寫&#xff0c;往往幾十個字符的命令會變…

310. 最小高度樹

題目 樹是一個無向圖&#xff0c;其中任何兩個頂點只通過一條路徑連接。 換句話說&#xff0c;任何一個沒有簡單環路的連通圖都是一棵樹。 給你一棵包含 n 個節點的樹&#xff0c;標記為 0 到 n - 1 。給定數字 n 和一個有 n - 1 條無向邊的 edges 列表&#xff08;每一個邊都…

Axure 縱向滾動隱藏滾動條 Axure 滑動開關(屬性開關)on-off

文章目錄 I 滑動開關(屬性開關)操作說明block 矩形操作說明round小圓圈操作說明on-off 屬性開關組合操作說明II Axure 縱向滾動隱藏滾動條思路包含圖片的動態面板1操作說明包含動態面板的頂級動態面板I 滑動開關(屬性開關)操作說明 block 矩形操作說明 在畫布中添加一個矩形…

MySQL之基礎事務

目錄 引言&#xff1a; 什么是事務&#xff1f; 事務和鎖 mysql數據庫控制臺事務的幾個重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意圖&#xff1a; 2.事務的隔離級別 四種隔離級別&#xff1a; 總結一下隔離指令 1. 查看當前隔離級別?? …

VS Code 重磅更新:全新 MCP 服務器發現中心上線

目前各種 MCP 客戶端層出不窮&#xff0c;但是安裝 MCP 服務卻格外繁瑣&#xff0c;尤其 VS Code 中無界面化的 MCP 服務配置方式&#xff0c;效率較低。 Copilot MCP 是一個 VS Code 插件&#xff0c;在今天發布的新版本中&#xff0c;插件支持了自動發現與安裝開源 MCP 服務…

智能家居“心臟“升級戰:GD25Q127CSIG國產芯片如何重構家庭物聯生態

在智能家居設備出貨量突破10億臺的2023年&#xff0c;家庭網關正經歷著前所未有的技術革新。作為連接云端與終端設備的中樞神經&#xff0c;智能網關的存儲芯片選擇直接決定著整個智能生態系統的運行效率。在這場技術升級浪潮中&#xff0c;兆易創新GD25Q127CSIG串行閃存芯片主…

R語言機器學習算法實戰系列(二十五)隨機森林算法多標簽分組分類器及模型可解釋性

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹教程內容加載必要的R包(帶詳細注釋)1. 加載數據2. 數據分割(按Species分層抽樣)3. 數據預處理配方4. 創建隨機森林模型(多分類)5. 創建工作流6. 設置交叉驗證和參數調優7. 參…

速查 Linux 常用指令 II

目錄 一、網絡管理命令1. 查看和配置網絡設備&#xff1a;ifconfig1&#xff09;重啟網絡命令2&#xff09;重啟網卡命令 2. 查看與設置路由&#xff1a;route3. 追蹤網絡路由&#xff1a;traceroute4. 查看端口信息和使用情況1&#xff09;netstat 命令2&#xff09;lsof 命令…

關于github使用總結

文章目錄 一、本地使用git&#xff08;一&#xff09;創建一個新的本地Git庫首先在本地創建一個新的git倉庫然后進行一次初始提交提交過后就可以查看提交記錄 &#xff08;二&#xff09;在本地倉庫進行版本恢復先執行 git log 查看項目提交歷史使用 git checkout 恢復版本 二、…

【Python】Python 單例模式 8 大核心應用場景深度解析(2025 新版)

單例模式&#xff08;Singleton Pattern&#xff09;作為一種經典的設計模式&#xff0c;始終保持著重要的工程價值。 本文著重于單例模式的主要核心應用場景。 至于實現方法&#xff0c; 晚些時候發出。 一、配置管理器 全局配置信息管理是單例模式最典型的應用場景。通過單…