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:游标

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

相关推荐
Leo.yuan9 分钟前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi
Runing_WoNiu18 分钟前
MySQL与Oracle对比及区别
数据库·mysql·oracle
天道有情战天下39 分钟前
mysql锁机制详解
数据库·mysql
看山还是山,看水还是。41 分钟前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
谷新龙00144 分钟前
Redis运行时的10大重要指标
数据库·redis·缓存
CodingBrother1 小时前
MySQL 中单列索引与联合索引分析
数据库·mysql
精进攻城狮@1 小时前
Redis缓存雪崩、缓存击穿、缓存穿透
数据库·redis·缓存
小酋仍在学习1 小时前
光驱验证 MD5 校验和
数据库·postgresql
keep__go1 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
小王同学mf1 小时前
怎么尽可能保证 Kafka 的可靠性
数据库