mysql8.0常用语法

文章目录

开窗函数

开窗函数 ,可以按组查询排列数据,且给每一行值都返回指定的聚合值,语法如下:

复制代码
开窗函数 over([PARTITION BY 分组字段(多个用,链接)]  [ORDER BY 排序字段(同前)])

开窗函数分为两类:

聚合开窗函数:sum,avg,count,max,min等

专用开窗函数:Rank,Dense_Rank,Row_Number 等
注意:聚合开窗函数使用ORDER BY时,必须跟在PARTITION BY之后。不能单独使用

详细教程可参看:Mysql开窗函数

字段拆分

有如下表 friend

name sex friend
张三 26 丽丽,红红,娜娜

现在因为某些需求,需要把friend字段进行拆分,并且和name、sex再次组成一条新的数据进行展示,如下

name sex friend
张三 26 丽丽
张三 26 红红
张三 26 娜娜

此时可以使用CROSS JOIN 函数,把friend进行拆分作为一个虚拟表后进行联表查询,语法如下

sql 复制代码
SELECT name,sex,jt.value
FROM friend
CROSS JOIN JSON_TABLE(
  friend,
  '$[*]' COLUMNS(value INT PATH '$')
) AS jt where name="张三"

从名字我们可以看出,该函数是对json字符串进行拆分的,而我们的frend字段存的不是json字符串,所以需要进行处理,把friend字段拼接成json字符串,如下

sql 复制代码
CONCAT('["',replace(friend,',','","'), '"]')

递归关联查询

-- 假定有如下的关联表结构

sql 复制代码
CREATE TABLE relations (
    parent_id INT,
    child_id INT,
    PRIMARY KEY (parent_id, child_id)
);

-- 插入现有关系

sql 复制代码
INSERT INTO relations (parent_id, child_id) VALUES
(1, 2), -- a -> b
(2, 3), -- b -> c
(3, 4); -- c -> d

-- 新增关系

sql 复制代码
INSERT INTO relations (parent_id, child_id) VALUES
(4, 5); -- d -> e

-- 递归查询来找到e的所有关联节点

sql 复制代码
WITH RECURSIVE cte_relations AS (
    SELECT child_id, parent_id FROM relations WHERE child_id = 5
    UNION ALL
    SELECT p.child_id, p.parent_id FROM relations p
    INNER JOIN cte_relations c ON p.child_id = c.parent_id
) SELECT * FROM cte_relations;

在这个查询中,CTE首先选出了与e直接关联的d,然后递归地向上找到d、c、b、a的关系。

注意,以上查询可能会出现死循环

比如,当数据中加入了parent_id = 5,child_id=1时,上面的递归查询会出现死循环,此时我们只需进行如下修改即可

sql 复制代码
WITH RECURSIVE cte_relations AS (
    SELECT child_id, parent_id FROM relations WHERE child_id = 5
    UNION ALL
    SELECT p.child_id, p.parent_id FROM relations p
    INNER JOIN cte_relations c ON p.child_id = c.parent_id where c.parent_id<>5
) SELECT * FROM cte_relations;

该查询将查询出所有和5有关系的数据

相关推荐
huhy~2 小时前
基于CentOS7.9搭建MySQL高可用集群【MGR单主】
数据库·mysql
不想写bug呀13 小时前
MySQL索引介绍
数据库·mysql
北辰当尹14 小时前
【小迪安全2023】day42 php应用&mysql架构&sql注入&跨库查询&文件读写&权限操作
mysql·安全·php
从天而降的扣篮16 小时前
MySQL自动添加分区表的函数
数据库·mysql
悄悄敲敲敲16 小时前
MySQL 事务
数据库·mysql
Linux蓝魔17 小时前
外网同步清华源mysql到内网搭建mysql源
数据库·mysql
Dxy123931021618 小时前
告别默认排序:MySQL自定义排序的“炼金术”
android·数据库·mysql
Chan1618 小时前
《MYSQL技术内幕》| InnoDB存储引擎与日志文件
java·大数据·spring boot·mysql·架构·java-ee·intellij-idea
无限码力18 小时前
华为OD技术面真题 - 数据库Mysql - 1
mysql·华为od·华为od技术面真题·华为od技术面八股·华为od技术面mysql八股
玄同76519 小时前
SQLAlchemy 模型定义完全指南:从基础到进阶的 ORM 实战
人工智能·python·sql·mysql·机器学习·自然语言处理·database