实际场景应用到的MySQL语法总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 工作中遇到的SQL记录

一、概述

作为开发的一部分,MySQL语句的应用很重要,可以简化很多代码上的处理逻辑,从而简化开发。本文本人在实际使用中的总结,主要是一些非简单的增删改查、注意事项等内容,并且会不断更新

二、检索

2.1 树形结构递归语句

一般是涉及到树形结构的库表结构,比如:菜单、部门等,存在上下级关系。检索时,获取当前以及子集的情况下使用,但是要是树形展示需要自己处理,一下会将java的处理代码一并奉上。
表结构:(后续使用相关表不再展示)
在这里插入图片描述

SQL语句:

WITH RECURSIVE children AS (
    SELECT d.* FROM depart d WHERE d.depart_name = '教务处'
    UNION ALL
    SELECT d.* FROM children c, depart d WHERE d.parent_id = c.id 
) SELECT * FROM children;

==注:==

  1. 检索条件不同展示效果也不一样,精确到具体条件时比较明确,如果条件下多数据时,如并列部门、并列菜单等;
  2. 上面SQL只有 > depart <一个表,children是用来收集子集的;
  3. 表内必须包含你检索所需条件以及上下级关联字段,如parent_id等。

效果:
检索结果

Java递归树形

自己编写递归方法:

private List<Menu> recursiveTree(Integer pId,List<Menu> newList) {
        List<Menu> treeNodes = newList.stream().filter(permissionMenu-> permissionMenu.getParentId()==pId).collect(Collectors.toList());
        treeNodes.forEach(sysPerMenu->{
            List<Menu> treeNodes1 = recursiveTree(sysPerMenu.getId(),newList);
            sysPerMenu.setChildren((!treeNodes1.isEmpty())?treeNodes1:new ArrayList<>());
        });
        return treeNodes;
    }

==注:==

  1. 用到了java8的流库,不难,都系较多,多用用就好;
  2. 方法条件很明显,与SQL语句类似,条件2 的集合就是检索出来的全部数据,需要注意的是关联条件。菜单表就不展示了,和部门一个意思。

hutool工具提供的树形工具类:
官方树结构工具说明
在这里插入图片描述

// 构建node列表
List<TreeNode<String>> nodeList = CollUtil.newArrayList();

nodeList.add(new TreeNode<>("1", "0", "系统管理", 5));
nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222));
nodeList.add(new TreeNode<>("111", "11", "用户添加", 0));
nodeList.add(new TreeNode<>("2", "0", "店铺管理", 1));
nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
nodeList.add(new TreeNode<>("221", "2", "商品管理2", 2));

List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");

局限性:此工具类要求使用明确的几个字段比较方便,如若自定义有两种方式处理,都很简单:

List<Depart> list//为自己数据库内的结构表数据集合
  1. 工具提供的树形配置:

treeNodeConfig 配置set的括号内是自己的表字段

TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定义属性名 都要默认值的
treeNodeConfig.setWeightKey("level");
treeNodeConfig.setIdKey("id");
treeNodeConfig.setNameKey("departName");
// 最大递归深度
treeNodeConfig.setDeep(5);
List<Tree<Integer>> treeList = TreeUtil.build(list,0);
  1. Java8提供的流库map方法转换:
List<TreeNode<Integer>> nodeList = list.stream().map(depart -> new TreeNode<Integer>(depart.getId(),depart.getParentId(),depart.getDepartName(),depart.getLevel())) .collect(Collectors.toList());
List<Tree<Integer>> treeList = TreeUtil.build(nodeList,0);

2.2 多字段字典匹配语句

一般在有字典的系统内,检索时,也会按照字典表内容进行处理操作。此处涉及到了多字段拼接在一个,再与输入的内容进行匹配。
表结构:
在这里插入图片描述
SQL语句:
用到:匹配:find_in_set、拼接:CONCAT、替换:replace

left join dict d on find_in_set(#{organizer,jdbcType=VARCHAR}, CONCAT(d.name,",",replace(d.other_name, ",", ",")))

==注:==

  1. 限制于用英文逗号分隔,出现其他的需要进行替换,这样只要知道使用的符号就可以了。

三、批量修改

3.1 同字段同值下的多条数据

场景:一个用户拥有多个角色,登录后需要以某一角色为主要显示。当然并不是所有的系统都需要,看情况。并且不局限于此场景,只要是在同字段同值情况下拥有多条数据,即可满足。
表结构:
在这里插入图片描述
SQL语句:

    UPDATE 
        user_role ur, sys_user su
    SET
        ur.plan_id =
        CASE
            WHEN ur.rid = #{roleId} THEN 0 
            WHEN ur.rid != #{roleId THEN 1 
            ELSE ur.plan_id 
        END 
    WHERE
        ur.user_id = su.user_id 
        AND su.user_name = #{userName}

==注:==

  1. 可以多表也可以单表,主要看where后边的条件需要。表内满足时没必要,实际情况感觉都是多表。
  2. 关键部分在CASEEND之间:WHEN后边为条件,用于区分同一字段获取不同值的条件;THEN后边为需要set的值,与when条件对应;ELSE在对应上字段即可。
  3. 写法较多,CASE也可直接接上对应字段,ELSE便不用再写。

效果:将rid=2的数据配置为0(默认主角色),其他为1(一般角色)

{roleId}=1

在这里插入图片描述

四、分组统计

4.1根据分组条件统计对应内容

这个知识点相对简单,用于记录,免得以后忘了,也可温习。
在重写springsecurity的访问url校验时使用的,因为粒度较细,到了按钮级别,因此针对每一个访问进行权限校验。
SQL语句:

SELECT
        m.url,  GROUP_CONCAT(distinct r.name) as roleName 
    FROM 
        menu m, menu_role mr, role r 
    WHERE 
        m.id = mr.mid AND mr.rid = r.id 
    GROUP 
        BY m.url

将每一个url的对应的角色进行统计在一个字段里,并去重。指定url更简单,就不说了。

五、总结

SQL语法的使用很多,我也是初出茅庐,用的就总结一下。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
30天前
|
存储 关系型数据库 MySQL
MySQL在企业内部应用场景有哪些
【10月更文挑战第17天】MySQL在企业内部应用场景有哪些
40 0
|
30天前
|
存储 关系型数据库 MySQL
介绍一下MySQL的一些应用场景
【10月更文挑战第17天】介绍一下MySQL的一些应用场景
133 0
|
1月前
|
架构师 关系型数据库 MySQL
MySQL最左前缀优化原则:深入解析与实战应用
【10月更文挑战第12天】在数据库架构设计与优化中,索引的使用是提升查询性能的关键手段之一。其中,MySQL的最左前缀优化原则(Leftmost Prefix Principle)是复合索引(Composite Index)应用中的核心策略。作为资深架构师,深入理解并掌握这一原则,对于平衡数据库性能与维护成本至关重要。本文将详细解读最左前缀优化原则的功能特点、业务场景、优缺点、底层原理,并通过Java示例展示其实现方式。
80 1
|
2月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
411 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
1月前
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
116 5
|
1月前
|
关系型数据库 MySQL 数据库
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
60 5
|
1月前
|
关系型数据库 MySQL 数据库
MySQL的语法知识
MySQL的语法知识
18 4
|
1月前
|
SQL 关系型数据库 MySQL
MySQL语法
MySQL语法
66 3
|
1月前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
17 0
|
1月前
|
关系型数据库 MySQL 数据处理
企业级应用 mysql 日期函数变量,干货已整理
本文详细介绍了如何在MySQL8.0中使用DATE_FORMAT函数进行日期格式的转换,包括当日、昨日及不同时间段的数据获取,并提供了实际的ETL应用场景和注意事项,有助于提升数据处理的灵活性和一致性。
41 0
下一篇
无影云桌面