BaiduComate:
# 問題1:
# 問題1:
幫我創建兩個表student與score表,要求student表有id,createDate,userName,phone,age,sex,introduce,
要求score表有id,scoreName,result,result,studentId(student表的id外鍵)。
要求student表中插入5條學生信息,都要是中文的。
要求student表中對應studentId插入10條信息,每個學生ID要有2個科目的成績。
給出DDL與DML語句。
DDL
CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT, -- 學生ID,自增主鍵createDate DATETIME NOT NULL, -- 創建日期userName VARCHAR(255) NOT NULL, -- 用戶名phone VARCHAR(20), -- 電話號碼age INT NOT NULL, -- 年齡sex ENUM('男', '女', '其他'), -- 性別introduce TEXT -- 簡介
);
CREATE TABLE score (id INT PRIMARY KEY AUTO_INCREMENT, -- 成績ID,自增主鍵scoreName VARCHAR(255) NOT NULL, -- 成績名稱(科目)result INT NOT NULL, -- 成績結果studentId INT, -- 學生ID,外鍵FOREIGN KEY (studentId) REFERENCES student(id) -- 外鍵約束
);
DML
INSERT INTO student (createDate, userName, phone, age, sex, introduce) VALUES
('2023-04-01 08:00:00', '張三', '13800138000', 20, '男', '來自計算機科學專業'),
('2023-04-01 08:10:00', '李四', '13800138001', 21, '男', '數學系高材生'),
('2023-04-01 08:20:00', '王五', '13800138002', 19, '女', '物理系新生'),
('2023-04-01 08:30:00', '趙六', '13800138003', 20, '女', '化學系學生'),
('2023-04-01 08:40:00', '孫七', '13800138004', 22, '男', '文學愛好者');-- 張三的成績
INSERT INTO score (scoreName, result, studentId) VALUES
('數學', 95, (SELECT id FROM student WHERE userName = '張三')),
('英語', 88, (SELECT id FROM student WHERE userName = '張三'));-- 李四的成績
INSERT INTO score (scoreName, result, studentId) VALUES
('物理', 92, (SELECT id FROM student WHERE userName = '李四')),
('化學', 85, (SELECT id FROM student WHERE userName = '李四'));-- 王五的成績
INSERT INTO score (scoreName, result, studentId) VALUES
('計算機', 90, (SELECT id FROM student WHERE userName = '王五')),
('歷史', 80, (SELECT id FROM student WHERE userName = '王五'));-- 趙六的成績
INSERT INTO score (scoreName, result, studentId) VALUES
('生物', 85, (SELECT id FROM student WHERE userName = '趙六')),
('地理', 82, (SELECT id FROM student WHERE userName = '趙六'));-- 孫七的成績
INSERT INTO score (scoreName, result, studentId) VALUES
('政治', 89, (SELECT id FROM student WHERE userName = '孫七')),
('音樂', 93, (SELECT id FROM student WHERE userName = '孫七'));
DQL
多表聯合
# 問題2:
幫我創建一個多表聯合查詢以student為主表,查看學生的所有科目成績總分,并根據總分進行倒序排名,在查詢第一列添加排名順序
SELECT s.id AS studentId,s.userName,SUM(sc.result) AS totalScore
FROMstudent s
JOIN score sc ON s.id = sc.studentId
GROUP BY s.id, s.userName
ORDER BY totalScore DESC;
存儲過程
#問題3:存儲過程
幫我根據兩個DDL創建一個插入信息的存儲過程,先插入10條學生表信息,再根據插入的學生表信息插入18@條對應studentId的score成績,
所有信息隨機生成,學生表的自增序號從6開始。
DELIMITER //
CREATE PROCEDURE InsertStudentAndScoreData()
BEGINDECLARE v_student_id INT;DECLARE v_counter INT;DECLARE v_random_score_count INT;-- 設置學生ID自增值為6ALTER TABLE student AUTO_INCREMENT = 6;-- 插入10條隨機學生信息WHILE (SELECT COUNT(*) FROM student) < 10 DOINSERT INTO student (createDate, userName, phone, age, sex, introduce)VALUES (NOW(),CONCAT('Student_', FLOOR(RAND() * 10000)),CONCAT('+1', FLOOR(RAND() * 899999999) + 100000000), -- 隨機電話號碼FLOOR(RAND() * (50 - 18 + 1)) + 18, -- 隨機年齡在18到50之間ELT(1 + FLOOR(RAND() * 3), '男', '女', '其他'), -- 隨機性別CONCAT('Introduction for ', FLOOR(RAND() * 10000)) -- 隨機簡介);SET v_student_id = LAST_INSERT_ID(); -- 獲取最近插入的學生ID-- 為該學生隨機插入1到18條成績記錄SET v_random_score_count = FLOOR(RAND() * 18) + 1; -- 隨機決定成績記錄數SET v_counter = 0;WHILE v_counter < v_random_score_count DOINSERT INTO score (scoreName, result, studentId)VALUES (CONCAT('Subject_', FLOOR(RAND() * 100)), -- 隨機科目名FLOOR(RAND() * 101), -- 隨機分數0到100v_student_id -- 學生ID);SET v_counter = v_counter + 1;END WHILE;END WHILE;
END //
DELIMITER ;CALL InsertStudentAndScoreData();
DELIMITER //
CREATE PROCEDURE InsertStudentAndScoreData()
BEGINDECLARE v_student_id INT;DECLARE v_counter INT DEFAULT 0;DECLARE v_total_scores_to_insert INT DEFAULT 18;DECLARE v_scores_inserted INT DEFAULT 0;DECLARE v_random_student_index INT;DECLARE v_random_score_name VARCHAR(255);DECLARE v_random_result INT;-- 設置學生表的自增序號從6開始ALTER TABLE student AUTO_INCREMENT = 6;-- 插入10條隨機學生信息WHILE v_counter < 10 DOINSERT INTO student(createDate, userName, phone, age, sex, introduce)VALUES (NOW(),CONCAT('User', FLOOR(RAND() * 10000)),CONCAT('+', FLOOR(RAND() * 9999999999)),FLOOR(RAND() * 10 + 18),ELT(1 + FLOOR(RAND() * 3), 'Male', 'Female', 'Other'),'Random Introduction');SET v_counter = v_counter + 1;END WHILE;-- 初始化計數器SET v_counter = 0;-- 插入成績,直到達到18條記錄WHILE v_scores_inserted < v_total_scores_to_insert DO-- 隨機選擇一個已插入的學生IDSET v_random_student_index = FLOOR(RAND() * 10) + 6; -- 學生ID范圍從6到15-- 生成隨機成績數據和科目名稱SET v_random_score_name = CONCAT('Subject', FLOOR(RAND() * 10));SET v_random_result = FLOOR(RAND() * 101); -- 隨機分數從0到100-- 插入成績記錄INSERT INTO score(scoreName, result, studentId)VALUES (v_random_score_name, v_random_result, v_random_student_index);-- 更新已插入成績計數SET v_scores_inserted = v_scores_inserted + 1;END WHILE;
END //
DELIMITER ;CALL InsertStudentAndScoreData();
#問題4: 觸發器
幫我創建一個修改score表scoreName的觸發器,當修改scoreNlame的時候臉發,判斷修改的scoreName是否是數學,如果是數學就改成(天書).
并且給出測試示例。
#問題5:游標
創建一個兩個表的綜合游標查詢,要求根據學生姓名進行查詢,查詢的結果返回兩個表的綜合信息。