前言
在使用MySQL过程中,有时候使用json存储时,需要查询里面的字段,MySQL5.7版本以上提供了一种新的字段json格式存储,跟Mongodb类似,可以查询json字段里面的数据
MySQL操作json
创建json字段
在MySQL中创建json字段,执行以下SQL语句
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '名字',
`phone_no` int NOT NULL DEFAULT 0 COMMENT '电话号码',
`extra` json NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;
或者工具类可以手动创建
**备注:**本文使用的是MySQL9
json操作
先插入两条数据
INSERT INTO `test`.`t_user` (`id`, `name`, `phone_no`, `extra`) VALUES (1, 'aaa', 0, '{\"id\": 1, \"name\": \"aaa\"}');
INSERT INTO `test`.`t_user` (`id`, `name`, `phone_no`, `extra`) VALUES (2, 'bbb', 1, '{\"id\": 2, \"name\": \"aaa1\"}');
$操作
$可以指定json里面的字段,比如
select * from t_user t where t.extra -> '$.id' = 2;
代表跟节点
json_extract
使用json_extract(),可以从json中返回想要的字段
用法:json_extract(字段名,$.json字段名)
用法如下:
select id, JSON_EXTRACT(t.extra, '$.name') as jsonName from t_user t where t.extra -> '$.id' = 2 ;
返回如下
或者
select * from t_user t where JSON_EXTRACT(t.extra, '$.name') = 'aaa1'
结果如下:
JSON_CONTAINS()
使用JSON_CONTAINS(),可以查询JSON格式数据是否在字段中包含特定对象,使用如下
SELECT * FROM t_user t WHERE JSON_CONTAINS(t.extra->'$.name', '"aaa1"');
备注: 这里中的name值,要加"",否则会报错
SELECT * FROM t_user t WHERE JSON_CONTAINS(t.extra->'$.id', '2');
还可以这么写
SELECT * FROM t_user t WHERE JSON_CONTAINS(t.extra, '1', '$.id');
JSON_OBJECT()
JSON_OBJECT()将一个键值对列表转换成json对象
示例如下:
SELECT JSON_OBJECT("userName","hello1")
结果如下:
还可以这么写
SELECT * FROM t_user t WHERE JSON_CONTAINS(t.extra, JSON_OBJECT("name","aaa1"));
结果如下
JSON_ARRAY()
使用JSON_ARRAY()创建json数组
示例如下
SELECT JSON_ARRAY('aa', 'bb', 'cc') as name;
结果如下
执行inert操作,插入一条数据
INSERT INTO `test`.`t_user` (`id`, `name`, `phone_no`, `extra`) VALUES (3, 'ccc', 2, '{\"id\": 3, \"name\": \"aaa3\", \"roles\": [\"aa\", \"bb\", \"cc\"]}');
然后使用使用JSON_ARRAY查询
SELECT * from t_user t WHERE JSON_CONTAINS(t.extra->'$.roles',JSON_ARRAY("aa"))
结果为
JSON_TYPE
使用JSON_TYPE(),可以查询属性字段属性是什么类型
用法:JSON_TYPE(json_val)
使用如下
SELECT t.extra->'$.id' as jsonId ,JSON_TYPE(t.extra->'$.id') as jsonType FROM t_user t;
输出结果如下
JSON_EXTRACT
使用JSON_EXTRACT()函数来提取json中特定的值,示例如下
SELECT * FROM t_user t WHERE JSON_EXTRACT(t.extra,'$.name') like '%aa1%';
输出结果如下
JSON_KEYS()
JSON_KEYS()函数返回json中的key值
SELECT JSON_KEYS(t.extra) FROM t_user t
输出结果为:
JSON_INSERT()
向一个 JSON 文档中插入数据并返回新的 JSON 文档,使用如下
update t_user t set t.extra = json_insert(t.extra,"$.age","20") where id = 1;
select * from t_user t where t.id = 1;
输出结果为:
备注: 但是注意的是,已经存在的字段,不会更新
update t_user t set t.extra = json_insert(t.extra,"$.age","22") where id = 1;
执行以上这句,不会更新age字段
JSON_REPLACE
JSON_REPLACE() 函数在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档
使用如下:
update t_user t set t.extra = JSON_REPLACE(t.extra,"$.age","22") where id = 1;
select * from t_user t where t.id = 1;
输出结果如下:
备注: 但是注意的是,如果
json中不存在这字段,不会更新
update t_user t set t.extra = JSON_REPLACE(t.extra,"$.age","22") where id = 2;
select * from t_user t where t.id = 2;
输出结果为:
JSON_REMOVE()
JSON_REMOVE() 函数从一个 JSON 文档中删除由路径指定的数据并返回修改后的 JSON 文档
使用如下
update t_user t set t.extra = JSON_REMOVE(t.extra,"$.age") where id = 1;
select * from t_user t where t.id = 1;
输出结果为
JSON_CONTAINS_PATH()
JSON_CONTAINS_PATH() 函数检查一个 JSON 文档中在指定的路径上是否有值存在
参数
-
json必需的。一个 JSON 文档。
-
one_or_all必需的。可用值:
'one','all'。它指示是否检查所有的路径。 -
path必需的。您应该至少指定一个路径表达式
使用如下:
select * from t_user t where JSON_CONTAINS_PATH(t.extra, 'all', '$.name');
返回值如下:
详情可以参考以下文档
https://www.sjkjc.com/mysql-ref/json_contains_path/
JSON_SEARCH()
JSON_SEARCH() 函数返回一个给定字符串在一个 JSON 文档中的路径
参数
-
json必需的。一个 JSON 文档。
-
one_or_all必需的。可用值:
'one','all'。JSON_SEARCH()根据one_or_all参数决定是否返回所有匹配的路径:- 如果是
'one',JSON_SEARCH()函数将返回第一个匹配的路径。 - 如果是
'all',JSON_SEARCH()函数将返回所有匹配的路径。所有的路径会包装在一个数组内返回。
- 如果是
-
search_str必需的。被搜索的字符串。 您可以在
search_str参数中使用%和_通配符,就像LIKE一样:%匹配任意数量的任意字符。_匹配一个任意字符。
-
escape_char可选的。 如果
search_str中包含%和_,需要在他们之前添加转移字符。默认是 ``。 -
path可选的。只能在此路径下进行搜索。
使用如下
select * from t_user t where JSON_SEARCH(t.extra, 'all', 'aaa');
返回值为
总结
MySQL的json查询可以作为一个拓展查询用到项目,是一个非常强大的功能,可以根据具体项目决定采用不采用