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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 工作中遇到的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语法的使用很多,我也是初出茅庐,用的就总结一下。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
21天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
1月前
|
关系型数据库 MySQL
Mysql常用语法总结
Mysql常用语法总结
22 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 数据库基本语法
SQL,全称Structured Query Language(结构化查询语言),是一种用于管理关系型数据库(RDBMS)的编程语言。SQL用于创建、修改、查询和删除数据库中的数据,以及定义数据库架构。它是数据库管理系统(DBMS)与应用程序之间的标准通信协议。
77 6
|
2月前
|
存储 SQL 关系型数据库
MySQL - 深入理解锁机制和实战场景
MySQL - 深入理解锁机制和实战场景
|
3月前
|
关系型数据库 MySQL
电子好书发您分享《MySQL高并发场景实战》
电子好书发您分享《MySQL高并发场景实战》
23 1
|
3月前
|
存储 SQL 关系型数据库
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
47 1
系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?
|
3月前
|
关系型数据库 MySQL 数据库
深入了解MySQL数据库管理与应用
深入了解MySQL数据库管理与应用
165 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础与实战应用
MySQL数据库基础与实战应用
49 0
|
6天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
2月前
|
关系型数据库 MySQL
mysql一些常用语法
mysql一些常用语法