数据库整理

118 阅读7分钟

Mybatis-Plus配置

 # mybatis-plus输出sql语句
 mybatis-plus:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

Collectors.groupingBy

Stream Collectors.groupingBy的四种用法 解决分组统计(计数、求和、平均数等)、范围统计、分组合并、分组结果自定义映射等问题

java8中 Collectors.groupingBy用法collector.groupingby炎升的博客-CSDN博客

Collectors.groupingBy是Java 8中引入的一个静态方法,它是用于对元素进行分组操作的Collector(收集器)。它接受一个Function作为参数,用于根据指定的条件对元素进行分组,并返回一个Map对象,其中键是分组条件的结果,值是属于该分组的元素列表。

具体来说,Collectors.groupingBy方法有两种重载形式:

  1. groupingBy(Function<? super T, ? extends K> classifier) 该方法接受一个Function对象classifier,用于定义元素的分组条件。此时,在生成的Map中,键类型为分类器函数的返回类型,值类型为属于该分组的元素的列表。
  2. groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream) 该方法除了接受一个Function对象classifier之外,还接受一个Collector对象downstream作为参数。downstream用于对每个分组中的元素进行进一步的操作,例如聚合、计数或转换等。在生成的Map中,值类型由downstream的结果决定。

下面是一个示例代码,展示如何使用Collectors.groupingBy方法对一组整数进行分组:

 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
 ​
 Map<Integer, List<Integer>> groups = numbers.stream()
     .collect(Collectors.groupingBy(number -> number % 2));
 ​
 System.out.println(groups);

输出结果为:

 {0=[2, 4, 6, 8, 10], 1=[1, 3, 5, 7, 9]}

在上述示例中,我们使用Collectors.groupingBy方法根据整数的奇偶性进行分组。结果是一个Map对象,其中键为0和1,分别对应偶数和奇数。相应的值则是属于每个分组的整数列表。

这就是Collectors.groupingBy方法的简要介绍。它是Java中非常有用的工具,可以轻松地进行元素分组操作。

concat、concat_ws、group_concat

group_concat用法详解_码说TM的博客-CSDN博客

SQL 函数:concat函数、concat_ws()函数、group_concat()函数_小小白2333的博客-CSDN博客

concat和 concat_ws 区别以及踩出来的坑_小白想做科技宅的博客-CSDN博客

concat(str1, str2,...)

返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null

concat_ws()

1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator)

2、语法:concat_ws(separator, str1, str2, ...)。第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null

两者区别

1. 能否拼接INT类型

  • concat(1, ‘,’, 2) -> 可以
  • concat_ws(1, ‘,’, 2) -> 不可以

2. 拼接NULL

  • concat(1, null, 2) -> 结果: null
  • concat_ws(’,’, ‘1’, null, ‘2’) -> 结果:1,2

COALESCE 函数

MySQL 技巧:COALESCE 函数的使用 | Specs' Blog-就爱PHP (9iphp.com)

COALESCE() 函数可以接收多个参数,并返回第一个非 NULL 的参数。如果所有参数都为 NULL,则 COALESCE() 函数返回 NULL

IFNULL 函数接受两个参数,如果不为 NULL 则返回第一个参数,否则返回第二个参数;而 COALESCE 函数使用 n 个参数。如果参数的数量为 2,则两个函数都相同。

ROW_NUMBER函数

功能: 简单的说row_number()从1开始,为每一条分组记录返回一个数字。

Row_number是一个在数据库中用来给查询结果进行编号的函数。它可以用来给每条记录分配一个唯一的数值,并且可以根据指定的排序方式来排序。

以下是一个示例查询,演示如何使用Row_number函数:

 SELECT 
   ROW_NUMBER() OVER (ORDER BY column_name) AS row_num,
   column_name
 FROM table_name;

在上述查询中,我们使用了ROW_NUMBER函数和OVER子句。ROW_NUMBER函数在每个记录上生成一个递增的唯一编号,而ORDER BY子句则指定了根据哪个字段进行排序。

请注意,column_name和table_name是根据具体的数据库表来确定的。根据需要可以进行适当的替换。

ROW_NUMBER() OVER (ORDER BY xlh DESC)是先把xlh列降序,再为降序以后的每条xlh记录返回一个序号。 ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)表示先根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内编号连续的唯一的)。

PARTITION

SQL中Partition的相关用法sql partition空花缱绻三分的博客-CSDN博客

用于在分区内进行计算。它可以在每个分区内对数据进行排序、聚合、分组等操作。

 SELECT id, name, age, salary,
        AVG(salary) OVER (PARTITION BY age) AS avg_salary
 FROM employees;

根据age列对employees表进行分区。然后,使用AVG()函数计算每个分区内的平均工资

RANK

用于为每一行分配一个排名。它可以根据指定的排序规则,为每个分区内的行进行排名。

 SELECT id, name, age, salary,
        RANK() OVER (PARTITION BY age ORDER BY salary DESC) AS rank
 FROM employees;

根据age列对employees表进行分区。然后,使用RANK()函数为每个分区内的行分配一个排名,按照salary列的降序进行排序。

DENSE_RANK

与RANK()类似,但它不会跳过排名。即如果有两个行具有相同的排序值,则它们将被分配相同的排名。

 SELECT id, name, age, salary,
        DENSE_RANK() OVER (PARTITION BY age ORDER BY salary DESC) AS dense_rank
 FROM employees;

根据age列对employees表进行分区。然后,使用DENSE_RANK()函数为每个分区内的行分配一个排名,按照salary列的降序进行排序

NTILE

用于将数据分成指定数量的桶或分区。它可以将数据均匀分布到每个分区中。

 SELECT id, name, age, salary,
        NTILE(4) OVER (ORDER BY salary DESC) AS ntile
 FROM employees;

将employees表的数据分成4个分区,按照salary列的降序进行分区。然后,使用NTILE()函数为每个分区分配一个编号

MP自定义分页,ipage作为入参

 IPage<AssignMarkingTaskExt> ipage = new Page<>(pageNo, pageSize);
 List<AssignMarkingTaskExt> tasks = 
     assignMarkingTaskExtMapper.getAssignMarkingTasks(ipage, assignMarkingGroupId);

注意:方法的返回值为IPage对象,只有这样,在使用时,查询出来的结果才会自动赋值给IPage对象。

MyBatisPlus XML 自定义分页 #yyds干货盘点#51CTO博客mybatisplus自定义sql分页

Sql处理树形结构

Sql中对于树形结构的处理sql树形结构改变世界的猿的博客-CSDN博客

 @Data
 @ToString
 public class TeachplanNode implements Serializable {
     private String id;
     private String pname;
 }
 ​
 @Data
 @ToString
 public class TeachplanTree extends TeachplanNode {
     List<TeachplanTree> children;
 }
 ​
 @Mapper
 public interface TeachplanMapper {
     TeachplanTree findTeachplanTree(@Param("courseId") String courseId);
 }
 <!--使用resultMap来定义接收的类型-->
 <resultMap id="teachplanMap" type="com.example.rep.TeachplanTree">
     <id property="id" column="one_id"/>
     <result property="pname" column="one_name"/>
     <collection property="children" ofType="com.example.rep.TeachplanTree">
         <id property="id" column="two_id"/>
         <result property="pname" column="two_name"/>
         <collection property="children" ofType="com.example.rep.TeachplanTree">
             <id property="id" column="three_id"/>
             <result property="pname" column="three_name"/>
         </collection>
     </collection>
 </resultMap>
 ​
 <!--使用自连接查询来查询数据结果-->
 <select id="findTeachplanTree" resultMap="teachplanMap" parameterType="java.lang.String">
     SELECT t1.id one_id,t1.pname one_name,
     t2.id two_id,t2.pname two_name,
     t3.id three_id,t3.pname three_name
     FROM teachplan t1
     LEFT JOIN teachplan t2 ON t1.id = t2.parentid
     LEFT JOIN teachplan t3 ON t2.id = t3.parentid
     WHERE t1.parentid = '0'
     <if test="courseId != null and courseId != '' ">
         AND t1.courseId = #{courseId}
     </if>
     ORDER BY t1.orderby,t2.orderby,t3.orderby
 </select>

MySQL性能优化

  1. 当只需要获取一行数据时,使用LIMIT 1
  2. 为搜索字段创建索引。
  3. 在Join表时,使用相同类型的字段,并为其创建索引。
  4. 绝对不要使用"ORDER BY RAND()"语句。
  5. 避免使用SELECT *,而是明确列出需要查询的字段。
  6. 使用ENUM而不是VARCHAR类型。
  7. 尽可能使用NOT NULL约束。
  8. 固定长度的表会更快。
  9. 拆分大的DELETEINSERT语句。
  10. 越小的列会越快。

基本数据库对象命名

数据库对象前缀
表 (Table)tbl_
字段(Column)
视图 (View)viw_
存储过程 (Stored procedure)prd_
触发器(Trigger)trg_
索引(Index)idx_
主键(Primary key)pk_
外键(Foreign key)fk_
Check 约束(Check Constraint)ck_
Default 约束(Default Constraint)df_
用户定义数据类型 (User-defined data type)udt_
用户定义函数 (User-defined function)fun_