前言 每個索引都是一顆B+樹,對於聚簇索引,每一條完整記錄都存儲在B+樹都葉子節點上;對於其他索引,葉子節點存儲了索引列和主鍵。這麼做都是為了提升查詢速度,那麼在實際使用中,是不是應該給所有列都添加索引呢,索引該如何使用呢? 先見一張表,隨機添加一些數據: CREATE TABLE single_t ...
實驗二 臨時表、視圖與系統函數
實驗目的:
理解CTE與視圖的知識,掌握臨時表、CTE與視圖的創建與使用方法,能夠根據需要創建CTE、視圖,掌握視圖應用技術,熟悉常用系統函數的應用方法。
實驗內容:
1、 針對指定的表進行全文檢索配置,利用全文檢索檢索記錄。
2、 創建視圖。
3、 練習常用系統函數使用方法
實驗過程及要求:
1、基於派生表或者CTE命令,完成以下操作,並把相應的命令寫在空白處。
(1)寫出查詢學生基本信息的語句,包括學號、姓名、專業班級、本人平均分(score1)、本班平均分(score1)、本人完成學分總計。
(2)查詢周四第5節有課的同學的名單,顯示學號、姓名、專業班級、課程名。
2、寫出以下視圖的創建命令,並把命令寫在空白處。
(1)查看課程表的視圖,顯示專業班級、課程名、教室、上課老師姓名
(2)創建學生視圖,通過該視圖只能更新數據學院的學生信息
(3)查看學生基本信息的視圖,包括學號、姓名、性別、年齡、本人電話、班級名稱、班導姓名、班導電話
4、 自主練習常用系統函數,理解函數的功能與含義。寫出以下命令與結果
(1) 顯示系統時間2年3個月後的日期與當年第幾周,輸出格式為:2023-09-21 38
(2)輸出一個基於你的MySQL的UUID
(3)輸出你的姓名全拼使用password、rsa、aes加密後的密碼。格式如下:
zhangsan
password('zhangsan')=
rsa('zhangsan')=
aes('zhangsan')=
具體實驗過程:
1. 基於派生表或者CTE命令,完成以下操作,並把相應的命令寫在空白處。
(1)查詢學生基本信息的語句,包括學號、姓名、專業班級、本人平均分(score1)、本班平均分(score1)、本人完成學分總計。
-- 創建一個CTE
WITH student_info AS (
SELECT ustudent.Sid, ustudent.Sname, ugrade.gname
AS
class, usc.score1, AVG(usc.score1) OVER (PARTITION BY ugrade.gid)
AS
class_avg, SUM(ucourse.credit) OVER (PARTITION BY ustudent.Sid)
AS
total_credits
FROM ustudent
JOIN ugrade ON ustudent.gid = ugrade.gid
JOIN usc ON ustudent.Sid = usc.sid
JOIN ucourse ON usc.cid = ucourse.cid
)
-- 從CTE表中獲取信息
SELECT Sid, Sname, class, score1, class_avg, total_credits
FROM student_info;
AVG(usc.score1) OVER (PARTITION BY ugrade.gid) 為視窗函數的用法 partition by 是根據指定的分組
(2)查詢周四第5節有課的同學的名單,顯示學號、姓名、專業班級、課程名。
WITH thursday_schedule AS
(
SELECT ustudent.Sid, ustudent.Sname, ugrade.gname AS class, ucourse.Cname
FROM ujobtable
JOIN ustudent ON ujobtable.gid = ustudent.gid
JOIN ugrade ON ustudent.gid = ugrade.gid
JOIN ucourse ON ujobtable.cid = ucourse.Cid
WHERE ujobtable.week = 4 AND ujobtable.timeseg like '%5%'
)
SELECT Sid, Sname, class, Cname
FROM thursday_schedule;
2. 寫出以下視圖的創建命令,並把命令寫在空白處。
(1)查看課程表的視圖,顯示專業班級、課程名、教室、上課老師姓名。
CREATE VIEW course_schedule_view AS
SELECT ugrade.gname AS class, ucourse.Cname, ujobtable.room, uteacher.tname AS teacher_name
FROM ujobtable
JOIN ugrade ON ujobtable.gid = ugrade.gid
JOIN ucourse ON ujobtable.cid = ucourse.Cid
JOIN uteacher ON ujobtable.tid = uteacher.tid;
(2)創建學生視圖,通過該視圖只能更新數據學院的學生信息。
CREATE VIEW student_update_view AS
SELECT *
FROM ustudent
WHERE gid IN (SELECT gid FROM ugrade WHERE did = 'CS');
(3)查看學生基本信息的視圖,包括學號、姓名、性別、年齡、本人電話、班級名稱、班導姓名、班導電話。
CREATE VIEW student_info_view AS
SELECT ustudent.Sid, ustudent.Sname, ustudent.Ssexy AS gender,
YEAR(CURDATE()) - YEAR(ustudent.Sbdate) AS age,
ustudent.stele AS personal_phone,ugrade.gname AS class,
homework.uteacher.tname AS class_teacher, homework.uteacher.tele AS class_teacher_phone
FROM ustudent
JOIN ugrade ON ustudent.gid = ugrade.gid
JOIN ujobtable ON ustudent.gid = ujobtable.gid
JOIN homework.uteacher ON ujobtable.tid = homework.uteacher.tid;
4. 自主練習常用系統函數,理解函數的功能與含義。寫出以下命令與結果
(1)顯示系統時間2年3個月後的日期與當年第幾周,輸出格式為:2023-09-21 38
select DATE_ADD(DATE_SUB(curdate(), INTERVAL 2 YEAR ),INTERVAL 3 MONTH)
, WEEK(CURDATE()) AS CurrentWeek;
(2)輸出一個基於你的MySQL的UUID
SELECT UUID() AS generated_uuid;
(3)輸出你的姓名全拼使用password、rsa、aes加密後的密碼。
格式如下:
zhangsanpassword('zhangsan')= PASSWORD('zhangsan')
rsa('zhangsan')= RSA_ENCRYPT('zhangsan', 'encryption_key')
aes('zhangsan')= AES_ENCRYPT('zhangsan', 'encryption_key')