赞
踩
Mysql5.7版本及其以后提供了一个原生的Json字段类型,Json类型的值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。
MySQL JSON Functions:https://dev.mysql.com/doc/refman/5.7/en/json-functions.html
Name | 描述 | 介绍 | 已弃用 |
---|---|---|---|
-> | 评估路径后从 JSON 列返回值; 相当于 JSON_EXTRACT()。 | ||
->> | 评估路径和取消引用后从 JSON 列返回值 结果; 相当于 JSON_UNQUOTE(JSON_EXTRACT())。 | 5.7.13 | |
JSON_APPEND() | 将数据附加到 JSON 文档 | 是的 | |
JSON_ARRAY() | 创建 JSON 数组 | ||
JSON_ARRAY_APPEND() | 将数据附加到 JSON 文档 | ||
JSON_ARRAY_INSERT() | 插入 JSON 数组 | ||
JSON_CONTAINS() | JSON 文档是否在路径中包含特定对象 | ||
JSON_CONTAINS_PATH() | JSON 文档是否包含路径中的任何数据 | ||
JSON_DEPTH() | JSON 文档的最大深度 | ||
JSON_EXTRACT() | 从 JSON 文档返回数据 | ||
JSON_INSERT() | 将数据插入 JSON 文档 | ||
JSON_KEYS() | JSON 文档中的键数组 | ||
JSON_LENGTH() | JSON 文档中的元素数 | ||
JSON_MERGE() | 合并 JSON 文档,保留重复键。 已弃用 JSON_MERGE_PRESERVE() 的同义词 | 5.7.22 | |
JSON_MERGE_PATCH() | 合并 JSON 文档,替换重复键的值 | 5.7.22 | |
JSON_MERGE_PRESERVE() | 合并 JSON 文档,保留重复键 | 5.7.22 | |
JSON_OBJECT() | 创建 JSON 对象 | ||
JSON_PRETTY() | 以人类可读的格式打印 JSON 文档 | 5.7.22 | |
JSON_QUOTE() | 引用 JSON 文档 | ||
JSON_REMOVE() | 从 JSON 文档中删除数据 | ||
JSON_REPLACE() | 替换 JSON 文档中的值 | ||
JSON_SEARCH() | JSON 文档中值的路径 | ||
JSON_SET() | 将数据插入 JSON 文档 | ||
JSON_STORAGE_SIZE() | 用于存储 JSON 文档的二进制表示的空间 | 5.7.22 | |
JSON_TYPE() | JSON 值的类型 | ||
JSON_UNQUOTE() | 取消引用 JSON 值 | ||
JSON_VALID() | JSON值是否有效 |
MySQL 5.7.22 及更高版本支持两个聚合 JSON 函数 JSON_ARRAYAGG()
和 JSON_OBJECTAGG()
. 看 第 12.20 节,“聚合函数” ,用于 这些的描述。
MySQL JSON 函数参考 :https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html
-- 创建测试表 CREATE TABLE `tab_json` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `data` json DEFAULT NULL COMMENT 'json字符串', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='json测试表'; -- 查询tab_json表 select * from tab_json; -- 删除tab_json表 drop table tab_json; -- ---------------------------------------------------------------- -- 新增数据 INSERT INTO `tab_json`(`id`, `data`) VALUES (1, '{"Tel": "132223232444", "name": "david", "address": "Beijing"}'); INSERT INTO `tab_json`(`id`, `data`) VALUES (2, '{"Tel": "13390989765", "name": "Mike", "address": "Guangzhou"}'); INSERT INTO `testdb`.`tab_json`(`id`, `data`) VALUES (3, '{"success": true,"code": "0","message": "","data": {"name": "jerry","age": "18","sex": "男"}}'); INSERT INTO `testdb`.`tab_json`(`id`, `data`) VALUES (4, '{"success": true,"code": "1","message": "","data": {"name": "tome","age": "30","sex": "女"}}'); -- ---------------------------------------------------------------- -- json_extract select json_extract('{"name":"Zhaim","tel":"13240133388"}',"$.tel"); select json_extract('{"name":"Zhaim","tel":"13240133388"}',"$.name"); -- ---------------------------------------------------------------- -- 对tab_json表使用json_extract函数 select json_extract(data,'$.name') from tab_json; #如果查询没有的key,那么是可以查询,不过返回的是NULL. select json_extract(data,'$.name'),json_extract(data,'$.Tel') from tab_json; select json_extract(data,'$.name'),json_extract(data,'$.tel') from tab_json; select json_extract(data,'$.name'),json_extract(data,'$.address') from tab_json; -- ---------------------------------------------------------------- -- 条件查询 select json_extract(data,'$.name'),json_extract(data,'$.Tel') from tab_json where json_extract(data,'$.name') = 'Mike'; -- ---------------------------------------------------------------- -- 嵌套json查询 select * from tab_json where json_extract(data,'$.success') = true; select json_extract(data,'$.data') from tab_json where json_extract(data,'$.success') = true; -- 查询data对应json中key为name的值 select json_extract( json_extract(data,'$.data'),'$.name') from tab_json where json_extract(data,'$.code') = "1"; select json_extract( json_extract(data,'$.data'),'$.name'),json_extract( json_extract(data,'$.data'),'$.age') from tab_json where json_extract(data,'$.code') = "0"; -- ---------------------------------------------------------------- -- 性能验证 , 通过验证全部都是全表扫描,使用场景:数据量不大json字符串较大则可以采用,数据量较大不建议使用。 explain select * from tab_json where json_extract(data,'$.success') = true; explain select json_extract(data,'$.data') from tab_json where json_extract(data,'$.success') = true; -- 查询data对应json中key为name的值 explain select json_extract( json_extract(data,'$.data'),'$.name') from tab_json where json_extract(data,'$.code') = "1"; explain select json_extract( json_extract(data,'$.data'),'$.name'),json_extract( json_extract(data,'$.data'),'$.age') from tab_json where json_extract(data,'$.code') = "0"; -- ---------------------------------------------------------------- -- 查询json对接集合对象 INSERT INTO `tab_json`(`id`, `data`) VALUES (5, '{"employee":[{"name": "zhangsan", "code": "20220407001", "age": "18"},{"name": "zhangsan2", "code": "20220407002", "age": "28"}]}'); INSERT INTO `tab_json`(`id`, `data`) VALUES (6, '{"employee":[{"name": "lisi", "code": "20220407003", "age": "16"},{"name": "lisi2", "code": "20220407004", "age": "26"}]}'); -- 查询data对应json值的employee集合对象中name为zhangsan的用户 select * from tab_json tj where JSON_CONTAINS(json_extract(tj.data,'$.employee'),JSON_OBJECT('name', "zhangsan")); -- zhangsan3不存在返回空 select * from tab_json tj where JSON_CONTAINS(json_extract(tj.data,'$.employee'),JSON_OBJECT('name', "zhangsan3"));
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。