• MySQL 查询树结构、循环查询、查看函数、视图、存储过程


    MySQL经常会用到查询树结构数据,这里专门收集整了一篇。

    • 构建函数

    构建树查询函数:查询父级节点函数

    -- 在mysql中完成节点下的所有节点或节点上的所有父节点的查询
    -- 根据传入id查询所有父节点的id
    DROP FUNCTION IF EXISTS `getParList`;
    delimiter // 
    CREATE FUNCTION `getParList`(rootId INT)
    RETURNS varchar(255) 
    BEGIN
        DECLARE sTemp VARCHAR(255);        -- 设置变量
        DECLARE sTempPar VARCHAR(255); 
        SET sTemp = ''; 
        SET sTempPar =rootId; 
    
        #循环递归
        while sTempPar is not null DO 
            #判断是否是第一个,不加的话第一个会为空
            IF sTemp != '' THEN
                SET sTemp = concat(sTemp,',',sTempPar);
            ELSE
                SET sTemp = sTempPar;
            END IF;
            SET sTemp = concat(sTemp,',',sTempPar); 
            SELECT group_concat(pid) INTO sTempPar FROM china_region where pid<>id and FIND_IN_SET(id,sTempPar)>0; 
        END WHILE; 
    RETURN sTemp; 
    END
    //

    -- id是前面表中的,110105为子级id

    select * from china_region where FIND_IN_SET(id,getParList(110105));

    构建树查询函数:查询子级节点函数

    -- 根据传入id查询所有子节点的id
    DROP FUNCTION IF EXISTS `getChildList`;
    delimiter // 
    CREATE FUNCTION `getChildList`(rootId INT)
    RETURNS varchar(255) 
    BEGIN
        DECLARE sTemp VARCHAR(255);
        DECLARE sTempChd VARCHAR(255);
        SET sTemp = '';
        SET sTempChd =rootId;
        WHILE sTempChd is not null DO
            SET sTemp = concat(sTemp,',',sTempChd);
            SELECT group_concat(id) INTO sTempChd FROM china_region where FIND_IN_SET(pid,sTempChd)>0;
        END WHILE;
        RETURN sTemp; 
    END
    //

    -- id是前面表中的,110000为父级id

    select * from china_region where FIND_IN_SET(id,getChildList(110000));

    -- 批量更新

    update china_region
        set sort_number = CASE `level`
            when 0 then 0
                    when 1 then 100            
            when 2 then 200
            when 3 then 300
        end,
        label = case `level`
            when 1 then 'value1'
            when 2 then 'value2'
            when 3 then 'value3'
                    ELSE 'others'
        end
    where id >= 100000 and id <120000 ;

    -- 清空 sort_number 和 label 列

    UPDATE china_region set sort_number=NULL, label=NULL;

    构建循环查询函数:循环查询函数

    -- 循环查询
    delimiter $$
    drop function if exists loops;
    create function loops(num int) returns varchar(255)
    begin
        declare i int default 110101;
        declare result varchar(255) default '';
        lpl:loop         -- lp1 为循环体名称 LOOP 为关键字
                    if result != '' then
                        set result=concat(result,',',i);
                    else
                            set result=i;
                    end if;
                    update china_region set sort_number=i where id=i;
                    set i=i + 1;
            if i>num
            then
            leave lpl;  -- 离开循环体 
            end if;
        end loop lpl;  -- 结束循环 
        return result;
    end $$
    delimiter;

    -- 循环查询序号+1

    select loops(110117);

    构建拼接函数:循环拼接函数

    -- 循环拼接组合
    delimiter $$
    drop function if exists fun_addStr;
    create function fun_addStr(str1 varchar(32),str2 varchar(32),num int) returns varchar(200)
    begin
        declare i int default 1;
        declare result varchar(200) default '';
        set result=str1;
        myloop:loop
            set i=i+1;
            set result=concat(result,str2);
            if i>num
            then
            leave myloop;
            end if;
        end loop myloop; 
        return result;
    end $$
    delimiter;

    -- 循环拼接组合

    select fun_addStr('字符串一','字符串二',3);
    • 存储过程

    -- 查询数据库中的存储过程和函数

    select `name` from mysql.proc where db = 'testdb' and `type` = 'PROCEDURE';   -- 存储过程
    select * from mysql.proc where db = 'testdb' and `type` = 'PROCEDURE' and name='xx';
    select `name` from mysql.proc where db = 'testdb' and `type` = 'FUNCTION';   -- 函数
    show procedure status;    -- 存储过程
    show function status; -- 函数

    -- 查看存储过程或函数的创建代码

    show create procedure proc_name;
    show create function func_name;

    -- 查看视图

    SELECT * from information_schema.VIEWS; -- 视图
    SELECT * from information_schema.TABLES; --

    -- 查看触发器
    SHOW TRIGGERS [FROM db_name] [LIKE expr];

    SELECT * FROM information_schema.`TRIGGERS` T WHERE trigger_name='mytrigger';

    作者:Jason Zeng 于 2020-06-14
    博客:http://www.cnblogs.com/zengming/ 
    GItHub:https://github.com/lovelifeming
    严正声明:
    1.由于本博客部分资源来自互联网,版权均归原作者所有。转载的目的是用于学术交流与讨论学习,将不对任何资源负法律责任。
    2.若无意中侵犯到您的版权利益,请来信联系我,我会在收到信息后会尽快给予处理!
    3.所有资源内容仅供学习交流之用,请勿用作商业用途,谢谢。
    4.如有转发请注明出处,来源于http://www.cnblogs.com/zengming/ ,谢谢合作。

  • 相关阅读:
    linux文件操作.md
    MinIO
    快速幂和快速乘
    LCP 03.机器人大冒险
    java 实现 js 方法调用
    UNITY STANDARD ASSETS源码学习笔记(二)Sun Shafts
    下雨Shader,触摸擦除雨点,声控闪电
    Unity Standard Assets源码学习笔记(一)SSAO
    【转发】vueSSR剖析
    locust中的监听器
  • 原文地址:https://www.cnblogs.com/zengming/p/12576531.html
Copyright © 2020-2023  润新知