- 表结构
CREATE TABLE `jsonuse` (
`data` json DEFAULT NULL,
`id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
- JSON_OBJECT([KEY, val[, KEY, val] ...])
计算键值对列表(可能为空),并返回包含这些键值对的JSON对象。如果任何键名为NULL或参数为奇数(JSON_OBJECT里面的参数要为偶数),则会发生错误。
INSERT INTO jsonuse VALUES (JSON_OBJECT("name", "王五", "email", "wangwu@qq.com", "age",18),2 );
查看插入的数据:
- JSON_KEYS(json_doc[, PATH]):
以JSON数组的形式返回JSON对象顶级值中的键,如果给定了path参数,则返回所选路径中的顶级键。返回NULL如果任何参数为NULL,
json_doc参数不是对象,或者path(如果给定)没有找到对象。如果json_doc参数不是有效的json文档,或者path参数不是有效的路径表达式,或者包含*或**通配符,则会发生错误。
如果选定对象为空,则结果数组为空。如果顶级值具有嵌套的子对象,则返回值不包括来自这些子对象的关键帧。
SELECT * FROM jsonuse WHERE id = 4
SELECT JSON_KEYS(DATA,'$.b'),DATA FROM jsonuse WHERE id = 4 ;SELECT JSON_KEYS(DATA),DATA FROM jsonuse WHERE id = 4 ;
- JSON_EXTRACT(json_doc, PATH[, PATH] ...)
返回JSON文档中的数据,从与路径参数匹配的文档部分中选择。如果任何参数为NULL或文档中没有找到值的路径,则返回NULL。如果json_doc参数不是有效的json文档,或者任何path参数都不是有效的路径表达式,则会发生错误。
返回值由路径参数匹配的所有值组成。如果这些参数可能返回多个值,则匹配的值将自动包装为数组,顺序与生成它们的路径对应。否则,返回值为单个匹配值。
整体数据:
SELECT JSON_EXTRACT(DATA, '$.name'),JSON_EXTRACT(DATA, '$.address') FROM jsonuse;
//使用ifnull找到所有data里面包含email属性的行
SELECT * FROM jsonuse WHERE IFNULL (JSON_EXTRACT(DATA, '$.email'),NULL) IS NOT NULL
- JSON_REMOVE(json_doc, PATH[, PATH] ...)
从JSON文档中删除数据并返回结果。如果任何参数为NULL,则返回NULL。如果json_doc参数不是有效的json文档,或者任何路径参数都不是有效的路径表达式,或者是$,或者包含*或**通配符,则会发生错误。
路径参数从左到右求值。通过计算一条路径生成的文档将成为计算下一条路径的新值。
如果文档中不存在要删除的元素,则不是错误;在这种情况下,路径不会影响文档。
整体数据:
SELECT JSON_REMOVE(DATA,'$.b')FROM jsonuse WHERE id = 4 ;
不会实际删除表中的值
- JSON_LENGTH(json_doc[, path])
JSON_LENGTH(json_doc[, path])返回 JSON 文档的长度,或者,如果
path
给定参数,则返回路径标识的文档中值的长度。NULL
如果任何参数是NULL
或path
参数不标识文档中的值,则返回。json_doc
如果参数不是有效的 JSON 文档或path
参数不是有效的路径表达式,则会发生错误。在 MySQL 8.0.26 之前,如果路径表达式包含一个*
或**
通配符,也会引发错误。SELECT JSON_LENGTH(data) FROM jsonuse WHERE id = 1;
JSON_SET(json_doc, path, val[, path, val] ...)
现有对象中不存在的成员。该成员被添加到对象并与新值相关联。
超过现有数组末尾的位置。使用新值扩展数组。如果现有值不是数组,则将其自动包装为数组,然后使用新值进行扩展。
现有数据
SELECT JSON_SET(data,'$.age',21) FROM jsonuse WHERE id = 1;
SELECT JSON_SET(data,'$.interesr','playCompuate') FROM jsonuse WHERE id = 1;
JSON_INSERT(json_doc, path, val[, path, val] ...):插入值而不替换现有值。
现有对象中不存在的成员。该成员被添加到对象并与新值相关联。
超过现有数组末尾的位置。使用新值扩展数组。如果现有值不是数组,则将其自动包装为数组,然后使用新值进行扩展。
JSON_REPLACE(json_doc, path, val[, path, val] ...)。
- 替换 JSON 文档中的现有值并返回结果。如果任何参数是
NULL
则 返回NULL
。json_doc
如果参数不是有效的 JSON 文档或任何path
参数不是有效的路径表达式或包含 或通配符, 则会发生错误 。
JSON_ARRAYAGG(col_or_expr) [over_clause]
将结果集聚合为单个 JSON数组,其元素由行组成。此数组中元素的顺序未定义。该函数作用于计算结果为单个值的列或表达式。
NULL
如果结果不包含行,或者发生错误,则 返回 。
over_clause
从 MySQL 8.0.14 开始,如果存在 ,此函数将作为窗口函数执行。over_clause
如第 12.21.2 节,“窗口函数概念和语法”中所述。SELECT JSON_ARRAYAGG(rolename) FROM sysrole
JSON_OBJECTAGG(key, value) [over_clause]
将两个列名或表达式作为参数,其中第一个用作键,第二个用作值,并返回一个包含键值对的 JSON 对象。NULL如果结果不包含行,或者发生错误,则返回。NULL如果任何键名是或参数个数不等于 2, 则会发生错误。
over_clause从 MySQL 8.0.14 开始,如果存在 ,此函数将作为窗口函数执行
SELECT JSON_OBJECT(id,rolename)FROM sysrole
更多的json函数参考:MySQL :: MySQL 8.0 Reference Manual :: 12.18.1 JSON Function Reference