MySQL查询语句

DDL

CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    createDate DATE NOT NULL,
    userName VARCHAR(50) NOT NULL,
    phone VARCHAR(20),
    age INT,
    sex VARCHAR(10),
    introduce TEXT
);

DML

INSERT INTO student (createDate, userName, phone, age, sex, introduce) VALUES
('2023-07-01', '张三', '13800138000', 20, '男', '我是张三,喜欢读书。'),
('2023-07-02', '李四', '13900139000', 22, '男', '我是李四,喜欢运动。'),
('2023-07-03', '王五', '13700137000', 21, '女', '我是王五,喜欢音乐。'),
('2023-07-04', '赵六', '13600136000', 19, '女', '我是赵六,喜欢画画。'),
('2023-07-05', '孙七', '13500135000', 23, '男', '我是孙七,喜欢旅行。'),
('2023-07-06', '周八', '13400134000', 20, '女', '我是周八,喜欢摄影。'),
('2023-07-07', '吴九', '13300133000', 21, '男', '我是吴九,喜欢编程。');

DQL

DELIMITER //

CREATE PROCEDURE InsertStudentData(num_rows INT)
BEGIN
    DECLARE counter INT DEFAULT 0;
    DECLARE v_createDate DATE;
    DECLARE v_userName VARCHAR(50);
    DECLARE v_phone VARCHAR(20);
    DECLARE v_age INT;
    DECLARE v_sex VARCHAR(10);
    DECLARE v_introduce TEXT;

    -- 设置随机种子,以便生成随机数据
    SET @@RAND_SEED1 = RAND() * (999999999 - 100000000) + 100000000;

    WHILE counter < num_rows DO
        -- 生成随机数据,这里仅作为示例,您可以根据需要调整
        SET v_createDate = DATE_ADD('2023-01-01', INTERVAL FLOOR(RAND() * 365) DAY);
        SET v_userName = CONCAT('User', FLOOR(RAND() * 100000));
        SET v_phone = CONCAT('1', FLOOR(RAND() * (999999999 - 100000000)) + 100000000);
        SET v_age = FLOOR(RAND() * (30 - 18)) + 18;
        SET v_sex = IF(RAND() > 0.5, '男', '女');
        SET v_introduce = CONCAT('介绍文本 ', FLOOR(RAND() * 10000));

        -- 插入数据
        INSERT INTO student (createDate, userName, phone, age, sex, introduce)
        VALUES (v_createDate, v_userName, v_phone, v_age, v_sex, v_introduce);

        -- 更新计数器
        SET counter = counter + 1;
    END WHILE;
END //

DELIMITER ;
CALL InsertStudentData(200000);
DELIMITER //

CREATE PROCEDURE InsertStudent(
    IN p_userName VARCHAR(50),
    IN p_introduce TEXT
)
BEGIN
    -- 声明变量用于检查userName是否以指定字符开头
    DECLARE invalid_prefix VARCHAR(10) DEFAULT '张王李赵';
    DECLARE prefix_length INT DEFAULT 1; -- 单个姓的字符长度,这里是1(代表一个字符)
    DECLARE userName_valid BOOLEAN DEFAULT TRUE;
    DECLARE current_char CHAR(1);
    DECLARE i INT DEFAULT 1;

    -- 检查userName是否以无效的前缀开头
    WHILE i <= CHAR_LENGTH(invalid_prefix) DO
        SET current_char = SUBSTRING(invalid_prefix, i, prefix_length);
        IF LEFT(p_userName, prefix_length) = current_char THEN
            SET userName_valid = FALSE;
            LEAVE; -- 跳出循环
        END IF;
        SET i = i + 1;
    END WHILE;

    -- 如果userName有效,则插入数据
    IF userName_valid THEN
        INSERT INTO student (createDate, userName, introduce)
        VALUES (NOW(), p_userName, p_introduce);
    ELSE
        -- 用户名无效,可以记录日志或抛出错误
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '用户名以非法字符开头';
    END IF;
END //

DELIMITER ;
CALL InsertStudent('陈小明', '我是陈小明,喜欢学习。');
SELECT
    id,
    createDate,
    userName,
    phone,
    age,
    sex,
    introduce,
    CASE
        WHEN sex = '男' THEN '爷们'
        WHEN sex = '女' THEN '姑娘'
        ELSE '未知' -- 可选,用于处理除了'男'和'女'之外的其他情况
    END AS gender_description
FROM
    student;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值