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

MySQL 查询树结构、循环查询、查看函数、视图、存储过程的更多相关文章

  1. 【软件实施面试】MySQL和Oracle联合查询以及聚合函数面试总结

    软件实施面试系列文章第二弹,MySQL和Oracle联合查询以及聚合函数的面试总结.放眼望去全是MySQL,就不能来点Oracle吗?之前面过不少公司,也做过不少笔试题,现在已经很少做笔试题了.你肚子 ...

  2. 【MySQL】-2 函数、分组、子查询、联合查询

    函数 Mysql的函数特性没有SQL可移植性强. 大多数情况下支持的函数: 处理文本串的函数: RTrim():处理列值右边的空格 LTrim():处理列值左边的空格   Trim():处理列值的左右 ...

  3. sql:sql server,MySQL,PostgreSQL的表,视图,存储过程结构查询

    sql server 2005: --SQL SERVER 2005 生成代码需要知道的SQL语句 use LibrarySystem --查询当前数据库所有表和其的主键字段,字段类型,长度,是否为空 ...

  4. MYSQL - 外键、约束、多表查询、子查询、视图、事务

    MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...

  5. SQL Server -- 回忆笔记(四):case函数,索引,子查询,分页查询,视图,存储过程

    SQL Server知识点回忆篇(四):case函数,索引,子查询,分页查询,视图,存储过程 1. CASE函数(相当于C#中的Switch) then '未成年人' else '成年人' end f ...

  6. 【mysql】 mysql 子查询、联合查询、模糊查询、排序、聚合函数、分组----------语法

    第二章 mysql 一.模糊查询 like 1. 字段 like '河北省%' %代表任何N个字符 2 字段 like '河北省____' _代表任意1个字符 二.IN 语法:SELECT 字段列1, ...

  7. Mysql优化之Explain查询计划查看

    我们经常说到mysql优化,优化中一种常见的方式就是对于经常查询的字段创建索引.那么mysql中有哪些索引类型呢? 一.索引分类1.普通索引:即一个索引只包含单个列,一个表可以有多个单列索引 2.唯一 ...

  8. 在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)

    原文:在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. sql循环取差值,该怎 ...

  9. SQLserver查询作业、视图、函数、存储过程中的关键字

    一.查询视图.函数.存储过程中的关键字 SELECT a.name,a.[type],b.[definition] FROM sys.all_objects a,sys.sql_modules b W ...

  10. (四)MySQL条件查询(通配符、模糊查询)、排序查询、分组查询(单行、分组函数)

    一.条件查询 1.含义:前面学的基础查询可以查询一个或多个字段,如果需要的数据仅仅是其中的某一行或多行就用到了条件查询. 2.语法:(序号表示语句执行顺序) SELECT 字段名 ③ FROM 表名 ...

随机推荐

  1. Redis常用命令手册

    http://c.biancheng.net/redis_command/ Redis客户端(client)命令 Redis 提供了一些操作客户端(client)的命令,比如查询所有已连接到服务器的客 ...

  2. weixueyuan-Nginx集群9

    https://www.weixueyuan.net/nginx/colony/ LVS(Linux虚拟服务器)简介 LVS(Linux Virtual Server)是一个开源的负载均衡项目,是国内 ...

  3. w3cschool-Apache Pig 教程

    https://www.w3cschool.cn/apache_pig/ 什么是Apache Pig? Apache Pig是MapReduce的一个抽象.它是一个工具/平台,用于分析较大的数据集,并 ...

  4. nginx平台初探-4

    模块开发高级篇(30%)   变量(80%)   综述 在Nginx中同一个请求需要在模块之间数据的传递或者说在配置文件里面使用模块动态的数据一般来说都是使用变量,比如在HTTP模块中导出了host/ ...

  5. Ubuntu13 安装vim

    问题 由于系统没有vim,只有vi,而vi 编辑文件时比较麻烦,不易操作,还没有关键词高亮显示等,故想安装vim 输入命令: sudo apt install vim 报错,找不到 apt 命令,即没 ...

  6. Vmware共享文件夹安装设置方法(window与Linux使用共享文件夹)

    Vmware共享文件夹安装设置方法 注意:如果按照了工具,设置了共享文件夹,Linux下面还是没有的话,可以运行下面的命令,就会加载共享文件夹了 vmhgfs-fuse .host:/ /mnt/hg ...

  7. linux mint安装微信

    sudo apt install snapd snappy sudo snap install electronic-wechat deepin-music 安装微信与深度音乐

  8. Flink中的时间分类

    一.分类 1.1 事件时间:EventTime 事件发⽣的时间 事件时间是每个单独事件在其产⽣进程上发⽣的时间,这个时间通常在处理的消息体中,如创建时间 在事件时间中,时间值 取决于数据产⽣记录的时间 ...

  9. C# 程序流控制 条件语句

    C#语言最基本的重要语句:控制程序流的语句.它们不是按代码在程序中的排列位置顺序执行的. 条件语句 条件语句可以根据条件是否满足或根据表达式的值来控制代码的执行分支.C#有两个控制代码的分支结构: i ...

  10. 运用myabits

    要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可. 如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中: ...