MySQL 从 v5.7.8 开始支持 JSON 数据类型。

JSON 数据类型和传统数据类型的操作还是有很大的差别,需要单独学习掌握。好在 JSON 数据类型的学习成本不算太高,只是在 SQL 语句中扩展了 JSON 函数,操作 JSON 数据类型主要是对函数的学习。

新建数据库

CREATE TABLE t(id INT, data json, PRIMARY KEY (id));

插入数据

新增 JSON 文档

函数描述JSON_ARRAY创建 JSON 数组JSON_OBJECT创建 JSON 对象

插入数据可以通过字符串的方式直接插入或者用 JSON_ARRAY 和 JSON_OBJECT 函数来构造数据。

插入数组

INSERT INTO t (id, data) VALUES (1, '[1, 2, 3]');

INSERT INTO t (id, data) VALUES (2, JSON_ARRAY(1, 2, 3));

插入对象

INSERT INTO t (id, data) VALUES (3, '{"a": 1, "b": 2}');

INSERT INTO t (id, data) VALUES (4, JSON_OBJECT("a", 1, "b", 2, "c", 3));

INSERT INTO t (id, data) VALUES (5, '{"a": "abc", "b": {"c": "dad"}, "c": {"b": "aaa"}}');

修改数据

修改 JSON 文档

函数描述JSON_SET当 Key 存在时修改,当 Key 不存在时新增JSON_INSERT当 Key 不存在时新增,当 Key 存在时不做任何变动JSON_REPLACE当 Key 存在时更新,当 Key 不存在时不做任何变动JSON_ARRAY_INSERT在数组末尾处追加新元素JSON_ARRAY_APPEND在数组指定下标处插入新元素JSON_MERGE_PATCH合并 JSON 数组或对象JSON_MERGE_PRESERVE合并 JSON 数组或对象

在 JSON_SET 中 $ 表示整个 JSON 文档,通过指定对象属性或数组下标的方式修改数据,当 key 存在时修改反之则新增。

UPDATE t SET data = '[1, 20, 30]' WHERE id = 1;

UPDATE t SET data = JSON_SET(data, '$.c', 30, '$.d', 40) WHERE id = 4;

UPDATE t SET data = JSON_INSERT(data, '$.c', 3) WHERE id = 4;

UPDATE t SET data = JSON_REPLACE(data, '$.c', 3) WHERE id = 4;

UPDATE t SET data = JSON_ARRAY_INSERT(data, '$[0]', 0) WHERE id = 1;

UPDATE t SET data = JSON_ARRAY_APPEND(data, '$', 4) WHERE id = 1;

JSON_MERGE_PATCH 和 JSON_MERGE_PRESERVE 都对 JSON 数组或对象进行合并操作,二者用法相同只是合并逻辑有所不同,具体的详情和细节可在文末参考链接中寻找。

删除数据

删除 JSON 文档

函数描述JSON_REMOVE当 Key 存在时删除,当 Key 不存在时不做任何变动

UPDATE t SET data = JSON_REMOVE(data, '$.c', '$.d') WHERE id = 4;

查询数据

查询 JSON 文档

函数描述JSON_CONTAINS判断源数据是否包含某个 JSON 数组或对象,包含返回 1, 否则返回 0JSON_CONTAINS_PATH判断源数据某个路径下是否包含某个 JSON 数组或对象,包含返回 1, 否则返回 0JSON_SEARCH指定关键字搜索 JSON 数组或对象,可以限制查找范围条件,支持 %、_、*、** 通配符,结果返回为 JSON 值的路径

SELECT JSON_CONTAINS(data, '{"b": 2}') FROM t WHERE id = 3; // 1

SELECT JSON_CONTAINS(data, '{"c": 3}') FROM t WHERE id = 3; // 0

第二个参数是控制返回数据的条数,参数如果是 one 只返回一条,参数如果是 all 则返回全部。

SELECT JSON_CONTAINS_PATH(data, 'one', '$.b', '$.c') FROM t WHERE id = 3; // 1

SELECT JSON_CONTAINS_PATH(data, 'all', '$.b', '$.c') FROM t WHERE id = 3; // 0

和 LIKE 一样,在字符串关键字的通过用 % 和 _ 在所有节点的值中匹配。

SELECT JSON_SEARCH(data, 'one', '%a%') FROM t WHERE id = 5; // $.a

SELECT JSON_SEARCH(data, 'all', '%a%') FROM t WHERE id = 5; // ["$.a", "$.b.c", "$.c.b"]

还可以对条件限制查找范围。

SELECT JSON_SEARCH(data, 'all', '%a%', NULL, '$.b') FROM t WHERE id = 5; // "$.b.c"

查找范围还可使用通配符,** 是递归匹配所有节点下的值。

SELECT JSON_SEARCH(data, 'all', '%a%', NULL, '$**.b') FROM t WHERE id = 5; // ["$.b.c", "$.c.b"]

在实际开发中,一般 JSON_SEARCH 用的是最多的,而且大部分情况是作为搜索条件出现的,例如:

SELECT * FROM `templates_data` WHERE `template_id`=4 AND data -> '$**.value' LIKE '%内蒙古%'

SELECT * FROM `templates_data` WHERE `template_id`=4 AND JSON_SEARCH(data, 'all', '%内蒙古%', null, '$**.value')

SELECT * FROM `templates_data` WHERE `template_id`=4 AND JSON_CONTAINS(data, JSON_OBJECT('value', '内蒙古'))

**注意:**只有 JSON_EXTRACT 和 JSON_SEARCH 中的 path 才支持通配符。

操作文档

操作 JSON 文档

函数描述JSON_QUOTE将 String 类型转成 JSON 类型JSON_UNQUOTE将 JSON 类型转成 String 类型JSON_KEYS以数组的方式返回 JSON 文档中的 KeyJSON_EXTRACT以字符串或数组的方式返回 JSON 文档中的 Value,支持通配符JSON_LENGTH返回 JSON 文档的长度JSON_DEPTH返回 JSON 文档的最大深度JSON_TYPE返回 JSON 文档值的类型JSON_VALID判断 JSON 文档是否合法

SELECT JSON_QUOTE('{"a": 1, "b": 2, "c": 3}'); // "{\"a\": 1, \"b\": 2, \"c\": 3}"

SELECT JSON_UNQUOTE('{"a": 1, "b": 2, "c": 3}'); // {"a": 1, "b": 2, "c": 3}

SELECT JSON_KEYS('{"a": 1, "b": 2, "c": 3}'); // ["a", "b", "c"]

SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": 3}', '$.b'); // 2

SELECT JSON_LENGTH('{"a": 1, "b": 2, "c": 3}', '$.b'); // 1

SELECT JSON_DEPTH('{"a": 1, "b": 2, "c": 3}'); // 2

SELECT JSON_TYPE('{"a": 1, "b": 2, "c": 3}'); // OBJECT

SELECT JSON_VALID('{"a": 1, "b": 2, "c": 3}'); // 1

参考链接: https://www.sjkjc.com/mysql-ref/json_array/ https://www.cnblogs.com/xyj179/p/11451593.html

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: