# 問題1:?
幫我創建2個表student與score表,要求student表有id,createDate,userName,phone,age,sex,introduce,
要求score表有id,scoreName,result,studentId(student表的id外鍵)。
要求student表中插入5條學生信息,都要是中文的。
要求score表中對應studentId插入10條信息,每個學生ID要有2個科目的成績。
給出DDL與DML語句。
DDL+DML
CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,createDate DATE NOT NULL,userName VARCHAR(255) NOT NULL,phone VARCHAR(20) NOT NULL,age INT NOT NULL,sex ENUM('男', '女') NOT NULL,introduce TEXT
);CREATE TABLE score (id INT PRIMARY KEY AUTO_INCREMENT,scoreName VARCHAR(255) NOT NULL,result FLOAT NOT NULL,studentId INT,FOREIGN KEY (studentId) REFERENCES student(id) ON DELETE CASCADE
);
INSERT INTO student (createDate, userName, phone, age, sex, introduce) VALUES
('2023-04-01', '張三', '13800138000', 20, '男', '學習刻苦'),
('2023-04-02', '李四', '13800138001', 21, '女', '成績優異'),
('2023-04-03', '王五', '13800138002', 22, '男', '熱愛運動'),
('2023-04-04', '趙六', '13800138003', 20, '女', '文靜內向'),
('2023-04-05', '孫七', '13800138004', 21, '男', '樂于助人');-- 張三的成績
INSERT INTO score (scoreName, result, studentId) VALUES ('數學', 90, 1);
INSERT INTO score (scoreName, result, studentId) VALUES ('英語', 85, 1);-- 李四的成績
INSERT INTO score (scoreName, result, studentId) VALUES ('數學', 88, 2);
INSERT INTO score (scoreName, result, studentId) VALUES ('物理', 92, 2);-- 王五的成績
INSERT INTO score (scoreName, result, studentId) VALUES ('英語', 80, 3);
INSERT INTO score (scoreName, result, studentId) VALUES ('化學', 85, 3);-- 趙六的成績
INSERT INTO score (scoreName, result, studentId) VALUES ('物理', 95, 4);
INSERT INTO score (scoreName, result, studentId) VALUES ('化學', 89, 4);-- 孫七的成績
INSERT INTO score (scoreName, result, studentId) VALUES ('英語', 78, 5);
INSERT INTO score (scoreName, result, studentId) VALUES ('生物', 87, 5);
提問的時候一定要選中兩個DDL?
# 問題2:?
根據score表的DDL添加4條語句,要求studentId為3和4,每個studentId都添加兩條數據,科目是數學與英語。
-- 插入studentId為3的數學成績
INSERT INTO score (scoreName, result, studentId) VALUES ('數學', 95, 3);-- 插入studentId為3的英語成績
INSERT INTO score (scoreName, result, studentId) VALUES ('英語', 89, 3);-- 插入studentId為4的數學成績
INSERT INTO score (scoreName, result, studentId) VALUES ('數學', 92, 4);-- 插入studentId為4的英語成績
INSERT INTO score (scoreName, result, studentId) VALUES ('英語', 86, 4);
# 問題3:?
幫我創建一個多表聯合查詢以student為主表,查看學生的所有科目成績總分,并根據總分進行倒序排名,在查詢第一列添加排名順序。
SELECT s.id AS studentId,s.userName,SUM(sc.result) AS totalScore
FROMstudent s
LEFT JOIN score sc ON s.id = sc.studentId
GROUP BY s.id, s.userName;
這條SQL語句的解釋如下:
SELECT 用來指定你想從數據庫中獲取的字段。
s.id AS studentId 選擇student表的id字段,并在結果集中將其重命名為studentId。
s.userName 選擇student表的userName字段,表示學生的名字。
SUM(sc.result) AS totalScore 計算每個學生所有科目的成績總和,并將這個總和重命名為totalScore。這里使用了SUM聚合函數來對成績進行求和。
FROM student s 指定了主表為student,并給它設置了一個別名s,以便在查詢中簡化引用。
LEFT JOIN score sc ON s.id = sc.studentId 使用了左連接(LEFT JOIN)來聯合score表,并給它設置了一個別名sc。連接條件是兩個表中的studentId必須匹配。左連接確保即使某個學生在score表中沒有成績記錄,也會出現在結果集中,其成績總分將被計算為0。
GROUP BY s.id, s.userName 將結果集按照每個學生的id和userName進行分組,這是使用聚合函數(如SUM)時通常需要的,以確保每個學生的成績不會被混淆在一起。
執行這條SQL語句后,你將得到一個包含每個學生ID、用戶名和所有科目成績總分的列表。
?
# 問題4:存儲過程?
幫我根據兩個DDL創建一個插入信息的存儲過程,先插入10條學生信息,再根據插入的學生表信息插入100條對應的studentId的score成績,
所有信息隨機生成,學生表的自增序號從6開始。
調用
call InsertRandomData();?
# 問題5:觸發器?
幫我創建一個修改score表scoreName的觸發器,當修改scoreName的時候觸發,判斷修改的scoreName是否是數學,如果是數學就改成(天書)。
并且給出測試事例。
這個觸發器tr_before_update_scoreName會在score表上的UPDATE操作之前執行。當scoreName字段的新值(NEW.scoreName)是"數學"時,它會自動將scoreName的值改為"天書"。
測試示例
為了測試這個觸發器,你可以按照以下步驟操作:
? 1.插入測試數據
首先,向score表中插入一些測試數據,包括一個scoreName為"數學"的記錄。
INSERT INTO score (scoreName, result, studentId) VALUES ('數學', 90, 1);
INSERT INTO score (scoreName, result, studentId) VALUES ('英語', 85, 1);
? 1.執行更新操作
UPDATE score SET scoreName = '數學' WHERE id = 1;
接下來,嘗試更新score表中scoreName為"數學"的記錄
由于觸發器的存在,即使你嘗試將scoreName設置為"數學",它實際上會被自動更改為"天書"。
? 1.驗證結果
最后,通過查詢來驗證觸發器是否按預期工作。
SELECT * FROM score WHERE id = 1;
你應該會看到類似下面的結果,其中scoreName
字段的值已經被更改為"天書":
id | scoreName | result | studentId---|-----------|--------|----------
1 | 天書 | 90 | 1
?這樣,你就成功地創建并測試了一個修改scoreName
字段的觸發器。
# 問題6:游標?
創建一個兩個表的綜合游標查詢,要求根據學生姓名進行查詢,查詢的結果返回兩個表的綜合信息。
DELIMITER //CREATE PROCEDURE GetStudentInfoByName(IN targetName VARCHAR(255))
BEGINDECLARE done INT DEFAULT FALSE;DECLARE stu_id INT;DECLARE stu_createDate DATE;DECLARE stu_userName VARCHAR(255);DECLARE stu_phone VARCHAR(20);DECLARE stu_age INT;DECLARE stu_sex ENUM('男', '女');DECLARE stu_introduce TEXT;DECLARE sc_id INT;DECLARE sc_scoreName VARCHAR(255);DECLARE sc_result FLOAT;-- 聲明游標DECLARE cur_student INFORMATION_SCHEMA.ROUTINES.RESULT_TYPE IS NOT NULL CURSOR FOR SELECT s.id, s.createDate, s.userName, s.phone, s.age, s.sex, s.introduce, sc.id AS score_id, sc.scoreName, sc.resultFROM student sLEFT JOIN score sc ON s.id = sc.studentIdWHERE s.userName = targetName;-- 聲明NOT FOUND的處理DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur_student;read_loop: LOOPFETCH cur_student INTO stu_id, stu_createDate, stu_userName, stu_phone, stu_age, stu_sex, stu_introduce, sc_id, sc_scoreName, sc_result;IF done THENLEAVE read_loop;END IF;-- 這里可以處理每一行的數據,例如打印或存儲等。SELECT stu_id, stu_createDate, stu_userName, stu_phone, stu_age, stu_sex, stu_introduce, sc_id, sc_scoreName, sc_result;END LOOP;CLOSE cur_student;
END //DELIMITER ;
調用游標
CALL GetStudentInfoByName('張三');