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/ ,謝謝合作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM