使用Baiducomate创建代码2

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 PRIMARY KEY AUTO_INCREMENT,
    createDate DATE NOT NULL,
    userName VARCHAR(50) NOT NULL,
    phone VARCHAR(20) NOT NULL,
    age INT NOT NULL,
    sex ENUM('男', '女') NOT NULL,
    introduce TEXT
);


-- 创建score表
CREATE TABLE score (
    id INT PRIMARY KEY AUTO_INCREMENT,
    scoreName VARCHAR(50) NOT NULL,
    result DECIMAL(5, 2) NOT NULL,
    studentId INT,
    FOREIGN KEY (studentId) REFERENCES student(id) ON DELETE CASCADE
);

2、帮我创建一个多表联合查询以student为主表,查看学生的所有科目成绩总分。

​
SELECT 
    s.id AS student_id,
    s.userName,
    s.phone,
    s.age,
    s.sex,
    s.introduce,
    SUM(sc.result) 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开始。

DELIMITER //

CREATE PROCEDURE InsertStudentsAndScores()
BEGIN
    DECLARE v_student_id INT;
    DECLARE v_counter INT DEFAULT 0;

    -- 设置AUTO_INCREMENT起始值为6
    ALTER TABLE student AUTO_INCREMENT = 6;

    -- 插入10条学生信息
    WHILE v_counter < 10 DO
        SET @createDate = CURDATE() - INTERVAL FLOOR(RAND() * 365) DAY; -- 随机日期
        SET @userName = CONCAT('Student', FLOOR(RAND() * 1000)); -- 随机用户名
        SET @phone = CONCAT('1', LPAD(FLOOR(RAND() * 100000000), 9, '0')); -- 随机电话号码
        SET @age = FLOOR(18 + (RAND() * 10)); -- 随机年龄,范围18-28
        SET @sex = IF(RAND() > 0.5, '男', '女'); -- 随机性别
        SET @introduce = CONCAT('This is a random introduction for ', @userName); -- 随机介绍

        -- 插入学生信息
        INSERT INTO student (createDate, userName, phone, age, sex, introduce)
        VALUES (@createDate, @userName, @phone, @age, @sex, @introduce);

        -- 获取新插入学生的ID
        SELECT LAST_INSERT_ID() INTO v_student_id;

        -- 插入10条成绩信息
        REPEAT
            SET @scoreName = CONCAT('Subject', FLOOR(RAND() * 10)); -- 随机科目名
            SET @result = FLOOR(60 + (RAND() * 40)); -- 随机成绩,范围60-100

            -- 插入成绩信息
            INSERT INTO score (scoreName, result, studentId)
            VALUES (@scoreName, @result, v_student_id);

            SET v_counter = v_counter + 1;
        UNTIL v_counter >= 100 END REPEAT; -- 这里应该是固定的10次循环,因为我们要为每个学生插入10条成绩

        SET v_counter = 0; -- 重置计数器以继续插入下一个学生的成绩
    END WHILE;
END //

DELIMITER ;


DELIMITER //

CREATE PROCEDURE InsertStudentsAndScores()
BEGIN
    DECLARE v_student_id INT;
    DECLARE v_counter INT DEFAULT 0;

    -- 设置AUTO_INCREMENT起始值为6
    ALTER TABLE student AUTO_INCREMENT = 6;

    -- 插入10条学生信息
    WHILE v_counter < 10 DO
        SET @createDate = CURDATE() - INTERVAL FLOOR(RAND() * 365) DAY;
        SET @userName = CONCAT('Student', FLOOR(RAND() * 1000));
        SET @phone = CONCAT('1', LPAD(FLOOR(RAND() * 100000000), 9, '0'));
        SET @age = FLOOR(18 + (RAND() * 10));
        SET @sex = IF(RAND() > 0.5, '男', '女');
        SET @introduce = CONCAT('This is a random introduction for ', @userName);

        -- 插入学生信息
        INSERT INTO student (createDate, userName, phone, age, sex, introduce)
        VALUES (@createDate, @userName, @phone, @age, @sex, @introduce);

        -- 获取新插入学生的ID
        SELECT LAST_INSERT_ID() INTO v_student_id;

        -- 为当前学生插入10条成绩信息
        DECLARE v_score_counter INT DEFAULT 0;
        WHILE v_score_counter < 10

4、帮我创建一个修改score表scoreName的触发器,当修改scoreName的时候触发,判断修改的scoreName是否是数学,如果是数学就改成(天书)。
并且给出测试示例。

DELIMITER //

CREATE TRIGGER trg_update_scoreName
BEFORE UPDATE ON score
FOR EACH ROW
BEGIN
    IF NEW.scoreName = '数学' THEN
        SET NEW.scoreName = '天书';
    END IF;
END;
//

DELIMITER ;


-- 插入学生数据
INSERT INTO student (createDate, userName, phone, age, sex, introduce) VALUES
('2023-01-01', '张三', '13800138000', 20, '男', '张三是一个热爱学习的学生。');


-- 插入成绩数据
INSERT INTO score (scoreName, result, studentId) VALUES
('数学', 90.50, 1),
('语文', 85.25, 1);

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

DELIMITER //

CREATE PROCEDURE GetStudentScoresByName(IN p_userName VARCHAR(50))
BEGIN
    -- 声明变量来存储从游标中获取的数据
    DECLARE done INT DEFAULT FALSE;
    DECLARE v_student_id INT;
    DECLARE v_createDate DATE;
    DECLARE v_userName VARCHAR(50);
    DECLARE v_phone VARCHAR(20);
    DECLARE v_age INT;
    DECLARE v_sex ENUM('男', '女');
    DECLARE v_introduce TEXT;
    DECLARE v_score_id INT;
    DECLARE v_scoreName VARCHAR(50);
    DECLARE v_result DECIMAL(5, 2);

    -- 声明游标
    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.result
        FROM 
            student s
        JOIN 
            score sc ON s.id = sc.studentId
        WHERE 
            s.userName = p_userName;

    -- 声明游标结束时的处理
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    -- 打开游标
    OPEN cur;

    -- 读取游标中的数据
    read_loop: LOOP
        FETCH cur INTO v_student_id, v_createDate, v_userName, v_phone, v_age, v_sex, v_introduce,
                                     v_score_id, v_scoreName, v_result;
        IF done THEN
            LEAVE read_loop;
        END IF;
        
        -- 这里你可以做你需要的处理,比如输出数据或者将其插入到其他表中
        -- 这里我们只是简单地输出数据
        SELECT v_student_id, v_createDate, v_userName, v_phone, v_age, v_sex, v_introduce,
               v_score_id, v_scoreName, v_result;
    END LOOP;

    -- 关闭游标
    CLOSE cur;
END //

DELIMITER ;


CALL GetStudentScoresByName('张三');

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值