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