mysql存储过程 巩固(一张表的取多个双色球号码)
一、双色球规则 :六个红球分别是从 1~33 一个篮球1~16
二、双色球表 shuang_se
二、思路:①利用MySQL 的 RAND( ) 函数取随机数
②创建一个临时表TMP_TEST1含有一个主键自增长的列 与存放随机数的列用 WHILE 取出来的随机数 33个 插入表中
③ 在创建一个与TMP_TEST1结构相
WHILE
RW > 0 DO#循环开始
SET NM = ROUND( RAND( ) * 33 ) ;#随机数种子
INSERT INTO TMP_TEST1 ( `NUM` )
VALUES
( NM );#写入临时表
SET RW = RW - 1;
END WHILE;
同的临时表TMP_TEST2
④将TMP_TEST1中根据随机数列 排序后得到了 1·33中的随机数
⑤在通过随机数取1~27 的随机数 用limt 取33个随机6个连续数据 并插入TMP_TEST2 临时表中
⑥然后通过CASE ... WHEN .. 与一个1~16的随机数 插入shuang_se表中
⑦循环条用的改以上步骤的存储过成
四、 实例
1、首先创建一个表 shuang_se
DELIMITER //
/*创建生成随机数存储过程*/
DROP PROCEDURE
IF
EXISTS RD1 // CREATE PROCEDURE RD1 ( )
BEGIN
DECLARE
NM INT;#定义变量
DECLARE
RW INT;#定义变量
DECLARE
MN INT;#定义变量
/*创建需要用到临时表1*/
DROP TABLE
IF
EXISTS TMP_TEST1;
CREATE TEMPORARY TABLE TMP_TEST1 ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NUM INT NOT NULL ) AUTO_INCREMENT = 0,ENGINE = MEMORY,
CHARSET = utf8;
/*创建需要用到临时表2*/
DROP TABLE
IF
EXISTS TMP_TEST2;
CREATE TEMPORARY TABLE TMP_TEST2 ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NUM INT NOT NULL ) AUTO_INCREMENT = 0,ENGINE = MEMORY,
CHARSET = utf8;
SET RW = 33;#循环去随机数的次数
SET MN = ROUND( RAND( ) * 27 );#从表2中分页的开始值
WHILE
RW > 0 DO#循环开始
SET NM = ROUND( RAND( ) * 33 ) ;#随机数种子
INSERT INTO TMP_TEST1 ( `NUM` )
VALUES
( NM );#写入临时表
SET RW = RW - 1;
END WHILE;
INSERT INTO TMP_TEST2 ( `NUM` ) SELECT
ID
FROM
TMP_TEST1
ORDER BY
NUM ASC LIMIT MN,6;#从临时表1转移数据到临时表2通过order by来生成随机数
#SELECT * FROM TMP_TEST2;
INSERT INTO shuang_se (red1,red2,red3,red4,red5,red6,blue)
SELECT
MAX(CASE ID WHEN 1 THEN NUM ELSE 0 END) red1,
MAX(CASE ID WHEN 2 THEN NUM ELSE 0 END) red2,
MAX(CASE ID WHEN 3 THEN NUM ELSE 0 END) red3,
MAX(CASE ID WHEN 4 THEN NUM ELSE 0 END) red4,
MAX(CASE ID WHEN 5 THEN NUM ELSE 0 END) red5,
MAX(CASE ID WHEN 6 THEN NUM ELSE 0 END) red6,
ROUND( RAND( ) * 16 ) blue
FROM TMP_TEST2; /**将列转换成行并赋值到shuang_se表中**/
END; // #存储过程结束
CREATE procedure RD2()
BEGIN
DECLARE i INT;
SET i = 0;
WHILE i<5 DO
call RD1();
SET i = i+1;
END WHILE;
END;
CALL RD2 ( ) // #调用存储过程**/
DROP PROCEDURE RD1 // #删除存储过程
DROP PROCEDURE RD2 // #删除存储过程
DELIMITER;
五、解析
1、创建存储过程 RD1
DROP PROCEDURE IF EXISTS RD1 #创建之前先删除有重复名称的存储过程
CREATE PROCEDURE RD1 ( )
BEGIN
END
2、NM 临时表2 LIMT 开始值 ,RW 循环插入临时表1的是次数 、MN 表1 中随机数列
3、 创建临时表1
DROP TABLE IF
CREATE TEMPORARY TABLE TMP_TEST1 ( I
D INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NUM INT NOT NULL ) AUTO_INCREMENT = 0,ENGINE = MEMORY,
CHARSET = utf8;
4、创建临时表2
DROP TABLE IF
EXISTS TMP_TEST2;
CREATE TEMPORARY TABLE TMP_TEST2 ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NUM INT NOT NULL ) AUTO_INCREMENT = 0,ENGINE = MEMORY,
CHARSET = utf8;
5、循环插入33个数
6、从33个随数中去 6个值赋值到 表1
INSERT INTO TMP_TEST2 ( `NUM` ) SELECT
ID
FROM
TMP_TEST1
ORDER BY
NUM ASC LIMIT MN,6;
7、将临时表1的数据行边成列 并加入一个1~16的随机数 写入临时表2 并
INSERT INTO shuang_se (red1,red2,red3,red4,red5,red6,blue)
SELECT
MAX(CASE ID WHEN 1 THEN NUM ELSE 0 END) red1,
MAX(CASE ID WHEN 2 THEN NUM ELSE 0 END) red2,
MAX(CASE ID WHEN 3 THEN NUM ELSE 0 END) red3,
MAX(CASE ID WHEN 4 THEN NUM ELSE 0 END) red4,
MAX(CASE ID WHEN 5 THEN NUM ELSE 0 END) red5,
MAX(CASE ID WHEN 6 THEN NUM ELSE 0 END) red6,
ROUND( RAND( ) * 16 ) blue
FROM TMP_TEST2; /**将列转换成行并赋值到shuang_se表中**/
7、写一个循环调用的 RD1 的存储过程 并删除创建的存储过程
CREATE procedure RD2()
BEGIN
DECLARE i INT;
SET i = 0;
WHILE i<5 DO
call RD1();
SET i = i+1;
END WHILE;
END;
CALL RD2 ( ) // #调用存储过程**/
DROP PROCEDURE RD1 // #删除存储过程
DROP PROCEDURE RD2 // #删除存储过程
上一篇: vue-router如何做历史返回提示?
下一篇: 放大镜插件