問題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語句。
-- 創建student表
CREATE TABLE student (id INT AUTO_INCREMENT PRIMARY KEY,createDate DATETIME NOT NULL,userName VARCHAR(50) NOT NULL,phone VARCHAR(20) NOT NULL UNIQUE,age INT NOT NULL,sex ENUM('男', '女') NOT NULL,introduce TEXT
);-- 創建score表
CREATE TABLE score (id INT AUTO_INCREMENT PRIMARY KEY,scoreName VARCHAR(50) NOT NULL,result FLOAT NOT NULL,studentId INT,FOREIGN KEY (studentId) REFERENCES student(id) ON DELETE CASCADE
);-- 插入5條學生信息
INSERT INTO student (createDate, userName, phone, age, sex, introduce) VALUES
('2023-03-15 10:00:00', '張三', '13800138000', 20, '男', '張三來自北京,喜歡閱讀和編程。'),
('2023-03-16 11:30:00', '李四', '13900139000', 21, '女', '李四來自上海,擅長數學和物理。'),
('2023-03-17 09:15:00', '王五', '13700137000', 19, '男', '王五來自廣州,熱愛運動和音樂。'),
('2023-03-18 14:45:00', '趙六', '13600136000', 22, '女', '趙六來自深圳,對歷史和旅游感興趣。'),
('2023-03-19 08:30:00', '錢七', '13500135000', 20, '男', '錢七來自杭州,喜歡旅游和攝影。');-- 插入對應studentId的10條成績信息-- 假設第一條和第二條是張三的成績,第三條和第四條是李四的成績,以此類推...
INSERT INTO score (scoreName, result, studentId) VALUES
('數學', 90, (SELECT id FROM student WHERE userName = '張三')),
('語文', 85, (SELECT id FROM student WHERE userName = '張三')),
('英語', 92, (SELECT id FROM student WHERE userName = '李四')),
('物理', 88, (SELECT id FROM student WHERE userName = '李四')),
('歷史', 89, (SELECT id FROM student WHERE userName = '王五')),
('政治', 93, (SELECT id FROM student WHERE userName = '王五')),
('化學', 87, (SELECT id FROM student WHERE userName = '趙六')),
('生物', 91, (SELECT id FROM student WHERE userName = '趙六')),
('地理', 94, (SELECT id FROM student WHERE userName = '錢七')),
('體育', 86, (SELECT id FROM student WHERE userName = '錢七'));
問題2:
幫我創建一個多表聯合查詢以student為主表,查看學生的所有科目成績總分。
SELECT s.id AS student_id,s.userName,s.phone,s.age,s.sex,s.introduce,COALESCE(SUM(sc.result), 0) AS total_score
FROM student s
LEFT JOIN score sc ON s.id = sc.studentId
GROUP BY s.id, s.userName, s.phone, s.age, s.sex, s.introduce;
問題3:
幫我根據兩個DDL創建一個插入信息的存儲過程,先插入10條學生表信息,再根據插入的學生表信息插入100條對應studentId的score成績,
所有信息隨機生成,學生表的自增序號從6開始。
ALTER TABLE student AUTO_INCREMENT = 6;
DELIMITER //CREATE PROCEDURE InsertStudentsAndScores()
BEGINDECLARE i INT DEFAULT 1;DECLARE studentId INT;DECLARE studentName VARCHAR(50);DECLARE studentPhone VARCHAR(20);DECLARE studentAge INT;DECLARE studentSex ENUM('男', '女');DECLARE scoreName VARCHAR(50);DECLARE scoreResult FLOAT;-- 插入10條學生信息WHILE i <= 10 DOSET studentName = CONCAT('Student', FLOOR(RAND() * 1000));SET studentPhone = CONCAT('1', FLOOR(RAND() * 900000000) + 10000000);SET studentAge = FLOOR(RAND() * 30) + 5;SET studentSex = IF(RAND() > 0.5, '男', '女');SET createDate = NOW();-- 插入學生信息INSERT INTO student (createDate, userName, phone, age, sex) VALUES (createDate, studentName, studentPhone, studentAge, studentSex);-- 獲取剛剛插入的學生IDSET studentId = LAST_INSERT_ID();-- 為該學生插入10條成績信息SET i_score := 1;WHILE i_score <= 10 DOSET scoreName = CONCAT('Subject', FLOOR(RAND() * 10));SET scoreResult = FLOOR(RAND() * 100);-- 插入成績信息INSERT INTO score (scoreName, result, studentId) VALUES (scoreName, scoreResult, studentId);SET i_score := i_score + 1;END WHILE;SET i := i + 1;END WHILE;
END //DELIMITER ;CALL InsertStudentsAndScores();
問題4:
幫我創建一個修改score表scoreName的觸發器,當修改scoreName的時候觸發,判斷修改的scoreName是否是數學,如果是數學就改成(天書)。
并且給出測試示例。
DELIMITER //CREATE TRIGGER tr_change_score_name_to_tianshu
BEFORE UPDATE ON score
FOR EACH ROW
BEGINIF NEW.scoreName = '數學' THENSET NEW.scoreName = '天書';END IF;
END;
//DELIMITER ;-- 假設score表中已經存在一條記錄,其scoreName為'數學'-- 插入一個學生記錄(如果尚未存在)
INSERT INTO student (createDate, userName, phone, age, sex) VALUES (NOW(), 'TestStudent', '1234567890', 20, '男');-- 插入一個score記錄,其scoreName為'數學'
INSERT INTO score (scoreName, result, studentId) SELECT '數學', 90, LAST_INSERT_ID() FROM student WHERE id = LAST_INSERT_ID();-- 查詢score表,確認scoreName為'數學'
SELECT * FROM score WHERE scoreName = '數學';-- 更新scoreName為'數學'的記錄,觸發觸發器
UPDATE score SET scoreName = '數學' WHERE scoreName = '數學';-- 再次查詢score表,確認scoreName已經被修改為'天書'
SELECT * FROM score WHERE scoreName = '天書';
問題5:
創建一個兩個表的綜合【游標查詢】,要求根據學生姓名進行查詢,查詢的結果返回兩個表的綜合信息。
SELECT s.id AS student_id,s.createDate,s.userName,s.phone,s.age,s.sex,s.introduce,sc.id AS score_id,sc.scoreName,sc.result
FROM student s
INNER JOIN score sc ON s.id = sc.studentId
WHERE s.userName = '目標學生姓名';DELIMITER //CREATE PROCEDURE FetchStudentAndScoreInfo(IN targetName VARCHAR(50))
BEGINDECLARE done INT DEFAULT FALSE;DECLARE student_id INT;DECLARE createDate DATETIME;DECLARE userName VARCHAR(50);DECLARE phone VARCHAR(20);DECLARE age INT;DECLARE sex ENUM('男', '女');DECLARE introduce TEXT;DECLARE score_id INT;DECLARE scoreName VARCHAR(50);DECLARE result FLOAT;-- 聲明游標DECLARE cur 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 sINNER JOIN score sc ON s.id = sc.studentIdWHERE s.userName = targetName;-- 聲明NOT FOUND處理程序DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur;read_loop: LOOPFETCH cur INTO student_id, createDate, userName, phone, age, sex, introduce, score_id, scoreName, result;IF done THENLEAVE read_loop;END IF;-- 在這里處理每一行的數據,例如打印或進行其他操作SELECT student_id, createDate, userName, phone, age, sex, introduce, score_id, scoreName, result;END LOOP;CLOSE cur;
END //DELIMITER ;CALL FetchStudentAndScoreInfo('目標學生姓名');