惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 聂微东
F
Fortinet All Blogs
H
Help Net Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
DataBreaches.Net
MyScale Blog
MyScale Blog
B
Blog
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
IT之家
IT之家
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
博客园_首页
L
LangChain Blog
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky

博客园 - 陈惟鲜的博客

win11安装mysql8 AI软件修改脚本与代码,还真不敢完全操作 linux 磁盘满了,排查 Ecelipse 安装 MAT linux 增加新磁盘 redis自身查询很慢 排查redis-benchmark prometheus监控mysql数据库 prometheus监控springboot项目配置 监控工具prometheus配置-docker版 linux 文件属性被替换修改查询并修改 ----i----------- ZonedDateTime 转为 java.util.Date docker 容器查看jvm参数配置 redis 事务处理,一旦异常,则回滚 linux 下安装使用jmeter 执行压测 大批量订单来了由于入库慢,先缓存后通知入库 eclipse 合并错分支代码还原,合并到本分支但未push到库上 maven打包慢,使用maven-mvnd 打包可以快一半 postman 参数化构建 批量测试 postman 常用参数例子 使用AOP实现+自定义注解 实现 缓存 如何判断redis慢了
mysql 查询jason格式数据
陈惟鲜的博客 · 2023-07-08 · via 博客园 - 陈惟鲜的博客

简单查询。

很多时候有复杂结构,我们存储为json格式,但字段很复杂。

假设有一个名为data的JSON字段,可以使用以下语法提取其中的值。

SELECT data->'$.key' FROM table_name;

使用JSON_CONTAINS函数可以过滤JSON数组中包含特定值的记录。例如,假设有一个名为data的JSON字段,其中包含一个名为tags的数组,可以使用以下语法过滤包含特定标签的记录:

SELECT JSON_LENGTH(data->'$.array_field') FROM table_name;

使用JSON_KEYS函数可以查询JSON字段中的键名。例如,假设有一个名为data的JSON字段,可以使用以下语法查询其键名:

SELECT JSON_KEYS(data) FROM table_name;

提取JSON字段的值​

  • ​使用 -> 和 ->> 操作符​:
    -- 提取name字段(带引号)
    SELECT json_data->'$.name' FROM table;
    
    -- 提取name字段并去除引号
    SELECT json_data->>'$.name' FROM table;
  • 条件查询​​根据键值过滤​

  • -- 字符串比较(推荐使用->>)
    SELECT * FROM table WHERE json_data->>'$.name' = 'John';
    
    -- 数值比较
    SELECT * FROM table WHERE JSON_EXTRACT(json_data, '$.age') = 30;
    SELECT * FROM table WHERE json_data->>'$.user.address.city' = 'New York';
  • 检查键或路径是否存在

  • -- 检查是否存在email字段
    SELECT * FROM table WHERE JSON_CONTAINS_PATH(json_data, 'one', '$.email');
    
    -- 检查多路径是否存在(all表示所有路径必须存在)
    SELECT * FROM table WHERE JSON_CONTAINS_PATH(json_data, 'all', '$.name', '$.age');
  • 处理JSON数组​​查询数组包含特定值​:

  • -- 查找tags数组包含"mysql"
    SELECT * FROM table WHERE JSON_CONTAINS(json_data->'$.tags', '"mysql"', '$');
    
    
    -- 获取第一个hobby(索引从0开始)
    SELECT json_data->>'$.hobbies[0]' FROM table;
  • 更新JSON数据​​​:

  • ​修改字段值​:
    UPDATE table SET json_data = JSON_REPLACE(json_data, '$.age', 31) WHERE id = 1;
    
    新增字段​:
    UPDATE table SET json_data = JSON_INSERT(json_data, '$.email', 'john@example.com') WHERE id = 1;
    
    
    删除字段​:
    UPDATE table SET json_data = JSON_REMOVE(json_data, '$.oldKey') WHERE id = 1;

    追加数组元素​:
    UPDATE table SET json_data = JSON_ARRAY_APPEND(json_data, '$.tags', 'new_tag');

  • 创建索引优化查询

  • 生成虚拟列并创建索引​:
    ALTER TABLE table
      ADD COLUMN name_virtual VARCHAR(50) AS (json_data->>'$.name'),
      ADD INDEX (name_virtual);
  • 展开JSON数组为行(MySQL 8.0+)​

  • SELECT t.id, j.tag
    FROM table t
    JOIN JSON_TABLE(
      t.json_data->'$.tags',
      '$[*]' COLUMNS (tag VARCHAR(50) PATH '$')
    ) AS j;