MySQL——存储过程,触发器

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

sql 复制代码
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

sql 复制代码
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为主表,查看学生的所有科目成绩总分,并根据总分进行倒序排名,在查询第一列添加排名顺序

sql 复制代码
SELECT 
    s.id AS studentId,
    s.userName,
    SUM(sc.result) AS totalScore
FROM
    student 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开始。

sql 复制代码
DELIMITER //
CREATE PROCEDURE InsertStudentAndScoreData()
BEGIN
    DECLARE v_student_id INT;
    DECLARE v_counter INT;
    DECLARE v_random_score_count INT;
    
    -- 设置学生ID自增值为6
    ALTER TABLE student AUTO_INCREMENT = 6;
    
    -- 插入10条随机学生信息
    WHILE (SELECT COUNT(*) FROM student) < 10 DO
        INSERT 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 DO
            INSERT INTO score (scoreName, result, studentId)
            VALUES (
                CONCAT('Subject_', FLOOR(RAND() * 100)), -- 随机科目名
                FLOOR(RAND() * 101), -- 随机分数0到100
                v_student_id -- 学生ID
            );
            SET v_counter = v_counter + 1;
        END WHILE;
    END WHILE;
END //
DELIMITER ;

CALL InsertStudentAndScoreData();
sql 复制代码
DELIMITER //
CREATE PROCEDURE InsertStudentAndScoreData()
BEGIN
    DECLARE 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 DO
        INSERT 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
        -- 随机选择一个已插入的学生ID
        SET 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:游标

创建一个两个表的综合游标查询,要求根据学生姓名进行查询,查询的结果返回两个表的综合信息。

相关推荐
靖顺2 小时前
【OceanBase 诊断调优】—— packet fly cost too much time 的根因分析
数据库·oceanbase
liuxin334455662 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
天冬忘忧3 小时前
Flink优化----FlinkSQL 调优
大数据·sql·flink
yuanbenshidiaos4 小时前
C++--------------树
java·数据库·c++
dengjiayue5 小时前
MySQL 查询大偏移量(LIMIT)问题分析
数据库·mysql
言之。5 小时前
【MySQL】在MySQL中如何定位慢查询?
数据库·mysql
DashVector6 小时前
如何通过HTTP API插入Doc
数据库·人工智能·http·阿里云·向量检索
DashVector6 小时前
如何通过HTTP API分组检索Doc
服务器·数据库·http·数据库开发·数据库架构
Suwg2096 小时前
【MySQL】踩坑笔记——保存带有换行符等特殊字符的数据,需要进行转义保存
数据库·笔记·mysql
2401_857610036 小时前
中文学习系统:成本效益分析与系统优化
java·数据库·学习·架构