mysql存储过程通用分页+自定义函数+优化limit

一.mysql无法识别运算符

首先要写出存储过程通用分页得先解决mysql无法识别运算符的问题

mysql虽然是企业常用的数据库但是却无法在limit后面识别运算符

例如 

select *  from  tb_User limit  1+1,5;

是不通过的

那么我们可以通过这个来实现

limit 后面第一个数 是  (开始的位置)  第二个数是 (长度);

而不是跟oracle与sql server一样的  (开始的位置与结束的位置)

-- 1.无法使用别mysql运算符
SET  @index=(7-2)*1;
SET @sql=CONCAT(' select  *  from   tb_User  limit   0,',@index);
PREPARE  mysql  FROM  @sql;
EXECUTE  mysql;


以此我们就可以知道通用的存储过程

二.存储过程通用分页

-- 2.存储过程通用分页
DELIMITER $$
CREATE
PROCEDURE `mysql`.`procpaging06`(IN  pageindex INT,IN myrow INT)
BEGIN
SET @mystart=((pageindex-1)*myrow+1);
SET  @sql=CONCAT(' select  *  from  tb_User   limit  ',@mystart,',',myrow);
PREPARE  mysql   FROM  @sql;
EXECUTE  mysql;    
END$$
DELIMITER ;
-- 调用
CALL  `mysql`.`procpaging06`(1,5);
其中的

 

SET  @sql=CONCAT(' select  *  from  tb_User   limit  ',@mystart,',',myrow);

中的',@mystart,'的两个逗号相当于是oracle中的||也就是拼接的意思

而其中的$$相当于;(逗号)

是结束的意思;因为每一行都有结束;

而 为了不让最后结束时电脑误认在 begin end 时存储过程已经完全结束(delimiter定界符结束)

因此使用$$来区分,用其他符号也是可以的.

三.自定义函数判断性别

-- 3.自定义函数判断性别
DELIMITER $$

CREATE
  FUNCTION `mysql`.`myfunctionpaging02`(mysex INT)
    RETURNS VARCHAR(10)
  BEGIN
CASE 
WHEN  1 THEN  RETURN  '男';
WHEN 2 THEN RETURN '女';
ELSE RETURN '人妖';
END CASE;
    END$$

DELIMITER ;
-- 调用
SELECT `mysql`.`myfunctionpaging02`(1);

一定要注意!

在存储过程跟自定义函数中delimiter前面是不可以有空格的;不然mysql识别不出来

要报代码错误,并且在自定义函数的参数不可以是

 FUNCTION `mysql`.`myfunctionpaging02`(in mysex INT)

自定义函数中是不可以在参数中加 in ;

在mysql中的性别可以定义为enum这个数据类型,在长度中添加你给他命名的数据例如我这里添加了

男 女 跟 保密,当然最好在设置个默认值


可获得如下效果



四.limit优化+注释

因为在企业中所运用的数据都是数以亿记的,数据太多会使得电脑运行慢,

而用一般的方法会使得电脑本身配置慢的卡的惨不忍睹

这个时候我们需要使用优化的方法让电脑运行快一点;

我们可以用子查询一条一条的查询获得五条数据,如下

-- 4.优化limit
SELECT  *  FROM  tb_User   WHERE  id  >=(
SELECT  id  FROM   tb_User  LIMIT  10000,1)
LIMIT   5;
-- 单行注释 
/*多行注释*/
#单行注释



欢迎各路大神指正哦!

展开阅读全文

没有更多推荐了,返回首页