mysql的json處理實(shí)現(xiàn)
寫在前面
需要注意,5.7以上版本才支持,但如果是生產(chǎn)環(huán)境需要使用的話,盡量使用8.0版本,因?yàn)?.0版本對json處理做了比較大的性能優(yōu)化。你你可以使用
select version();來查看版本信息。
本文看下MySQL的json處理。在正式開始讓我們先來準(zhǔn)備一些測試數(shù)據(jù):
CREATE TABLE `dept` (
`id` int(11) NOT NULL,
`dept` varchar(255) DEFAULT NULL,
`json_value` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into dept VALUES(1,'部門1','{"deptName": "部門1", "deptId": "1", "deptLeaderId": "3"}');
insert into dept VALUES(2,'部門2','{"deptName": "部門2", "deptId": "2", "deptLeaderId": "4"}');
insert into dept VALUES(3,'部門3','{"deptName": "部門3", "deptId": "3", "deptLeaderId": "5"}');
insert into dept VALUES(4,'部門4','{"deptName": "部門4", "deptId": "4", "deptLeaderId": "5"}');
insert into dept VALUES(5,'部門5','{"deptName": "部門5", "deptId": "5", "deptLeaderId": "5"}');1:json字段名->’$.json屬性’
通過json字段名->’$.json屬性’語法格式可以訪問到j(luò)son中某個key的值,以如下查詢方式看下。
1.1:用在DQL查詢結(jié)果中
mysql> select id,json_value->'$.deptLeaderId' from dept where id=2; +----+------------------------------+ | id | json_value->'$.deptLeaderId' | +----+------------------------------+ | 2 | "4" | +----+------------------------------+ 1 row in set (0.01 sec)
1.2:用在DQL條件中
單條件
mysql> select id from dept where json_value->'$.deptLeaderId'='4'; +----+ | id | +----+ | 2 | +----+ 1 row in set (0.01 sec)
和普通字段組合查詢
mysql> select id from dept where json_value->'$.deptLeaderId'='4' and id>1; +----+ | id | +----+ | 2 | +----+ 1 row in set (0.01 sec)
json多條件
mysql> select id from dept where json_value->'$.deptLeaderId'='4' and json_value->'$.deptName' like '%部門%'; +----+ | id | +----+ | 2 | +----+ 1 row in set (0.00 sec)
1.3:用在DQL關(guān)聯(lián)查詢中
先準(zhǔn)備數(shù)據(jù):
CREATE TABLE `dept_leader` (
`id` int(11) NOT NULL,
`leaderName` varchar(255) DEFAULT NULL,
`json_value` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into dept_leader VALUES(1,'leader1','{"name": "王一", "id": "1", "leaderId": "1"}');
insert into dept_leader VALUES(2,'leader2','{"name": "王二", "id": "2", "leaderId": "3"}');
insert into dept_leader VALUES(3,'leader3','{"name": "王三", "id": "3", "leaderId": "4"}');
insert into dept_leader VALUES(4,'leader4','{"name": "王四", "id": "4", "leaderId": "5"}');
insert into dept_leader VALUES(5,'leader5','{"name": "王五", "id": "5", "leaderId": "5"}');關(guān)聯(lián)查詢
mysql> SELECT dept.id,dept_leader.id from dept,dept_leader WHERE dept.json_value->'$.deptLeaderId'=dept_leader.json_value->'$.id' ; +----+----+ | id | id | +----+----+ | 1 | 3 | | 2 | 4 | | 3 | 5 | | 4 | 5 | | 5 | 5 | | 6 | 5 | | 7 | 5 | | 8 | 5 | +----+----+ 8 rows in set (0.00 sec)
2:json_extract
語法格式json_extract(字段名,$.json字段名),用來從json字段中提取值,如下:
mysql> select id,json_extract(json_value,'$.deptName') as deptName from dept;
+----+------------------------------+
| id | deptName |
+----+------------------------------+
| 1 | "部門1" |
...
mysql> SELECT * FROM dept WHERE JSON_EXTRACT(json_value,'$.deptName') like '%部門%'\G
*************************** 1. row ***************************
id: 1
dept: 部門1
json_value: {"deptId": "1", "deptName": "部門1", "deptLeaderId": "3"}
*************************** 2. row ***************************
id: 2
dept: 部門2
json_value: {"deptId": "2", "newData": "新增的數(shù)據(jù)", "deptName": "新增的部門1111", "deptLeaderId": "4"}
...cx 3:JSON_OBJECT()
語法格式JSON_OBJECT(k,v[,k,v]),用來轉(zhuǎn)換指定數(shù)據(jù)為json object,如下:
mysql> select json_object("name", "張三", "age", 99);
+------------------------------------------+
| json_object("name", "張三", "age", 99) |
+------------------------------------------+
| {"age": 99, "name": "張三"} |
+------------------------------------------+
1 row in set (0.01 sec)4:JSON_CONTAINS()
語法JSON_CONTAINS(target, candidate[, path]),用來判斷json格式中是否包含指定子對象,其中子對象需要通過json_object()生成,如下:
mysql> select * from dept WHERE JSON_CONTAINS(json_value, JSON_OBJECT("deptName","部門5"))
-> ;
+----+---------+-------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-------------------------------------------------------------+
| 5 | 部門5 | {"deptId": "5", "deptName": "部門5", "deptLeaderId": "5"} |
+----+---------+-------------------------------------------------------------+
1 row in set (0.01 sec)注意需要使用json_object轉(zhuǎn)換為object。
添加如下數(shù)據(jù),看一個嵌套json對象的例子:
insert into dept VALUES(6,'部門9','{"deptName": {"dept":"de","depp":"dd"}, "deptId": "5", "deptLeaderId": "5"}');判斷嵌套對象是否存在:
mysql> SELECT * from dept WHERE JSON_CONTAINS(json_value->'$.deptName',JSON_OBJECT("depp","dd"));
+----+---------+--------------------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+--------------------------------------------------------------------------------+
| 6 | 部門9 | {"deptId": "5", "deptName": {"depp": "dd", "dept": "de"}, "deptLeaderId": "5"} |
+----+---------+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT * from ( SELECT *,json_value->'$.deptName' as deptName FROM dept ) t WHERE JSON_CONTAINS(deptName,JSON_OBJECT("depp","dd"));
...5:JSON_ARRAY()
創(chuàng)建json數(shù)組,如下:
mysql> select json_array("pingpong","羽毛球","籃球");
+---------------------------------------------+
| json_array("pingpong","羽毛球","籃球") |
+---------------------------------------------+
| ["pingpong", "羽毛球", "籃球"] |
+---------------------------------------------+
mysql> select json_array(json_object("name", "張三"), "籃球", json_object("name", "李四"));
+------------------------------------------------------------------------------------+
| json_array(json_object("name", "張三"), "籃球", json_object("name", "李四")) |
+------------------------------------------------------------------------------------+
| [{"name": "張三"}, "籃球", {"name": "李四"}] |
+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)json格式化看下:

5.1:判斷數(shù)組是否是否包含某子數(shù)組
準(zhǔn)備數(shù)據(jù):
insert into dept VALUES(7,'部門9','{"deptName": ["1","2","3"], "deptId": "5", "deptLeaderId": "5"}');
insert into dept VALUES(7,'部門9','{"deptName": ["5","6","7"], "deptId": "5", "deptLeaderId": "5"}');
mysql> SELECT * from dept WHERE JSON_CONTAINS(json_value->'$.deptName',JSON_ARRAY("1"));
+----+---------+-------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-------------------------------------------------------------------+
| 7 | 部門9 | {"deptId": "5", "deptName": ["1", "2", "3"], "deptLeaderId": "5"} |
+----+---------+-------------------------------------------------------------------+
1 row in set (0.05 sec)6:JSON_TYPE()
獲取類型:
mysql> SELECT json_value->'$.deptName' ,JSON_TYPE(json_value->'$.deptName') as type from dept;
+------------------------------+--------+
| json_value->'$.deptName' | type |
+------------------------------+--------+
| "部門1" | STRING |
| "新增的部門1111" | STRING |
| "部門3" | STRING |
| "部門4" | STRING |
| "部門5" | STRING |
| {"depp": "dd", "dept": "de"} | OBJECT |
| ["1", "2", "3"] | ARRAY |
| ["5", "6", "7"] | ARRAY |
+------------------------------+--------+7:JSON_KEYS()
獲取文檔中所有的key,如下:
mysql> SELECT JSON_KEYS(json_value),json_value FROM dept where id=2\G
*************************** 1. row ***************************
JSON_KEYS(json_value): ["deptId", "newData", "deptName", "deptLeaderId"]
json_value: {"deptId": "2", "newData": "新增的數(shù)據(jù)", "deptName": "新增的部門1111", "deptLeaderId": "4"}
1 row in set (0.01 sec)8:JSON_SET()
更新或者是添加kv,無責(zé)插入,有則更新,語法格式JSON_SET(json_doc, path, val[, path, val] …),如下:
key存在時更新
mysql> select * from dept where id=1;
+----+---------+-------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-------------------------------------------------------------+
| 1 | 部門1 | {"deptId": "1", "deptName": "部門1", "deptLeaderId": "3"} |
+----+---------+-------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> update dept set json_value=JSON_SET(json_value, '$.deptName', '部門1_更新后') where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from dept where id=1;
+----+---------+-----------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-----------------------------------------------------------------------+
| 1 | 部門1 | {"deptId": "1", "deptName": "部門1_更新后", "deptLeaderId": "3"} |
+----+---------+-----------------------------------------------------------------------+
1 row in set (0.00 sec)key不存在時插入
mysql> select * from dept where id=1;
+----+---------+-----------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-----------------------------------------------------------------------+
| 1 | 部門1 | {"deptId": "1", "deptName": "部門1_更新后", "deptLeaderId": "3"} |
+----+---------+-----------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> update dept set json_value=JSON_SET(json_value, '$.deptAddr', '贏創(chuàng)動力4樓') where id=1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from dept where id=1;
+----+---------+-------------------------------------------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-------------------------------------------------------------------------------------------------------+
| 1 | 部門1 | {"deptId": "1", "deptAddr": "贏創(chuàng)動力4樓", "deptName": "部門1_更新后", "deptLeaderId": "3"} |
+----+---------+-------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)一個key不存在,一個key存在
mysql> select * from dept where id=1;
+----+---------+-------------------------------------------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-------------------------------------------------------------------------------------------------------+
| 1 | 部門1 | {"deptId": "1", "deptAddr": "贏創(chuàng)動力4樓", "deptName": "部門1_更新后", "deptLeaderId": "3"} |
+----+---------+-------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> update dept set json_value=JSON_SET(json_value, '$.deptAddr', '八維學(xué)院', '$.newKey', 'newKey的value') where id=1;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from dept where id=1; +----+---------+-------------------------------------------------------------------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-------------------------------------------------------------------------------------------------------------------------------+
| 1 | 部門1 | {"deptId": "1", "newKey": "newKey的value", "deptAddr": "八維學(xué)院", "deptName": "部門1_更新后", "deptLeaderId": "3"} |
+----+---------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)9:JSON_INSERT()
語法格式JSON_INSERT(json_doc, path, val[, path, val] …),插入文檔,當(dāng)值已經(jīng)存在時忽略,如下:
mysql> select * from dept where id=2;
+----+---------+-------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-------------------------------------------------------------+
| 2 | 部門2 | {"deptId": "2", "deptName": "部門2", "deptLeaderId": "4"} |
+----+---------+-------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> update dept set json_value=JSON_INSERT(json_value, '$.deptId', '已存在不更新', '$.addr', '西二旗') where id=2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from dept where id=2; +----+---------+----------------------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+----------------------------------------------------------------------------------+
| 2 | 部門2 | {"addr": "西二旗", "deptId": "2", "deptName": "部門2", "deptLeaderId": "4"} |
+----+---------+----------------------------------------------------------------------------------+
1 row in set (0.00 sec)10:JSON_REPLACE()
語法格式JSON_REPLACE(json_doc, path, val[, path, val] …),更新而不新增文檔,如下:
mysql> update dept set json_value=JSON_REPLACE(json_value, '$.deptName', '部門2_新名稱', '$.notExitsKey', '不會替換,因?yàn)椴淮嬖?) where id=2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from dept where id=2; +----+---------+--------------------------------------------------------------------------------------------+
| id | dept | json_value |
+----+---------+--------------------------------------------------------------------------------------------+
| 2 | 部門2 | {"addr": "西二旗", "deptId": "2", "deptName": "部門2_新名稱", "deptLeaderId": "4"} |
+----+---------+--------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)11:JSON_REMOVE()
語法格式JSON_REMOVE(json_doc, path[, path] …),刪除文檔:
mysql> select * from dept where id=3;
+----+---------+-------------------------------------------------------------+
| id | dept | json_value |
+----+---------+-------------------------------------------------------------+
| 3 | 部門3 | {"deptId": "3", "deptName": "部門3", "deptLeaderId": "5"} |
+----+---------+-------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> update dept set json_value=JSON_REMOVE(json_value, '$.depeName', '$.deptLeaderId') where id=3;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from dept where id=3;
+----+---------+----------------------------------------+
| id | dept | json_value |
+----+---------+----------------------------------------+
| 3 | 部門3 | {"deptId": "3", "deptName": "部門3"} |
+----+---------+----------------------------------------+
1 row in set (0.00 sec)12:JSON_SEARCH

語法格式JSON_SEARCH(json_doc,one_or_all,search_str [,escape_char [,path] ...]),獲取指定文檔出現(xiàn)的位置,如果沒有則返回NULL。
12.1:官方例子
準(zhǔn)備數(shù)據(jù)
mysql> SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
Query OK, 0 rows affected (0.00 sec)
mysql> select @j;
+---------------------------------------------------------+
| @j |
+---------------------------------------------------------+
| ["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}] |
+---------------------------------------------------------+
1 row in set (0.01 sec)查詢
mysql> SELECT JSON_SEARCH(@j, 'one', 'abc'); // 第二參數(shù)查詢終止條件,設(shè)置為one,即只查詢一個 +-------------------------------+ | JSON_SEARCH(@j, 'one', 'abc') | +-------------------------------+ | "$[0]" | +-------------------------------+ 1 row in set (0.01 sec) mysql> SELECT JSON_SEARCH(@j, 'all', 'abc'); // 第二個參數(shù)查詢終止條件,設(shè)置為all,即查詢所有匹配的 +-------------------------------+ | JSON_SEARCH(@j, 'all', 'abc') | +-------------------------------+ | ["$[0]", "$[2].x"] | +-------------------------------+ 1 row in set (0.01 sec) mysql> SELECT JSON_SEARCH(@j, 'all', 'ghi'); // 全局匹配不存在的,會返回NULL +-------------------------------+ | JSON_SEARCH(@j, 'all', 'ghi') | +-------------------------------+ | NULL | +-------------------------------+ 1 row in set (0.00 sec) mysql> SELECT JSON_SEARCH(@j, 'all', '10'); // 全局匹配10,返回具體位置的具體key +------------------------------+ | JSON_SEARCH(@j, 'all', '10') | +------------------------------+ | "$[1][0].k" | +------------------------------+ 1 row in set (0.01 sec)
指定路徑搜索
mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$'); +-----------------------------------------+ | JSON_SEARCH(@j, 'all', '10', NULL, '$') | +-----------------------------------------+ | "$[1][0].k" | +-----------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[*]'); +--------------------------------------------+ | JSON_SEARCH(@j, 'all', '10', NULL, '$[*]') | +--------------------------------------------+ | "$[1][0].k" | +--------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$**.k'); +---------------------------------------------+ | JSON_SEARCH(@j, 'all', '10', NULL, '$**.k') | +---------------------------------------------+ | "$[1][0].k" | +---------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[*][0].k'); +-------------------------------------------------+ | JSON_SEARCH(@j, 'all', '10', NULL, '$[*][0].k') | +-------------------------------------------------+ | "$[1][0].k" | +-------------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[1]'); +--------------------------------------------+ | JSON_SEARCH(@j, 'all', '10', NULL, '$[1]') | +--------------------------------------------+ | "$[1][0].k" | +--------------------------------------------+ #指定搜索路徑為數(shù)組中第二個元素內(nèi)的第一個元素 mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[1][0]'); +-----------------------------------------------+ | JSON_SEARCH(@j, 'all', '10', NULL, '$[1][0]') | +-----------------------------------------------+ | "$[1][0].k" | +-----------------------------------------------+ mysql> SELECT JSON_SEARCH(@j, 'all', 'abc', NULL, '$[2]'); +---------------------------------------------+ | JSON_SEARCH(@j, 'all', 'abc', NULL, '$[2]') | +---------------------------------------------+ | "$[2].x" | +---------------------------------------------+
模糊匹配
mysql> SELECT JSON_SEARCH(@j, 'all', '%a%');
+-------------------------------+
| JSON_SEARCH(@j, 'all', '%a%') |
+-------------------------------+
| ["$[0]", "$[2].x"] |
+-------------------------------+
mysql> SELECT JSON_SEARCH(@j, 'all', '%b%');
+-------------------------------+
| JSON_SEARCH(@j, 'all', '%b%') |
+-------------------------------+
| ["$[0]", "$[2].x", "$[3].y"] |
+-------------------------------+
# 指定搜索路徑,$[0] = "abc"
mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[0]');
+---------------------------------------------+
| JSON_SEARCH(@j, 'all', '%b%', NULL, '$[0]') |
+---------------------------------------------+
| "$[0]" |
+---------------------------------------------+
# $[2] = {"x":"abc"}
mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[2]');
+---------------------------------------------+
| JSON_SEARCH(@j, 'all', '%b%', NULL, '$[2]') |
+---------------------------------------------+
| "$[2].x" |
+---------------------------------------------+
# $[1] = [{"k": "10"}, "def"] 模糊匹配無結(jié)果
mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[1]');
+---------------------------------------------+
| JSON_SEARCH(@j, 'all', '%b%', NULL, '$[1]') |
+---------------------------------------------+
| NULL |
+---------------------------------------------+
mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', '', '$[1]');
+-------------------------------------------+
| JSON_SEARCH(@j, 'all', '%b%', '', '$[1]') |
+-------------------------------------------+
| NULL |
+-------------------------------------------+
mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', '', '$[3]');
+-------------------------------------------+
| JSON_SEARCH(@j, 'all', '%b%', '', '$[3]') |
+-------------------------------------------+
| "$[3].y" |
+-------------------------------------------+12.2:實(shí)際例子
在日常開發(fā)過程中如果需要使用JSON_SEARCH查詢的話,需要搭配IS NOT NULL來獲取符合條件的數(shù)據(jù),如果是返回是NULL則說明不存在,反之存在,所以,對于返回的具體位置信息我們一般是使用不到的,準(zhǔn)備數(shù)據(jù)如下:
Create Table: CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL COMMENT '名字',
`age` int(4) unsigned NOT NULL COMMENT '年齡',
`info` text COMMENT '補(bǔ)充信息',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表'
INSERT INTO `user` (`name`, `age`, `info`) VALUES ('suhw', '23', '{"phone":"12312123434","language":["c++","java","go"]}');
INSERT INTO `user` (`name`, `age`, `info`) VALUES ('bob', '20', '{"phone":"18912123434","language":["c++","c","go","php"]}');查詢會java和go語言的數(shù)據(jù):
mysql> select * from user where json_search(info, 'all', 'go') is not null and json_search(info, 'all', 'java') is not null;
+----+------+-----+--------------------------------------------------------+
| id | name | age | info |
+----+------+-----+--------------------------------------------------------+
| 1 | suhw | 23 | {"phone":"12312123434","language":["c++","java","go"]} |
+----+------+-----+--------------------------------------------------------+
1 row in set (0.00 sec)寫在后面 參考文章列表
【MySQL】對JSON數(shù)據(jù)操作(全網(wǎng)最全) 。
到此這篇關(guān)于mysql的json處理實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)mysql json內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL數(shù)據(jù)表損壞的原因分析和修復(fù)方法小結(jié)(推薦)
MYSQL數(shù)據(jù)表損壞的原因分析和修復(fù)方法小結(jié),碰到的朋友可以參考,下面整理一些比較全,希望對大家有所幫助。2011-01-01
SQL中current_date()函數(shù)的實(shí)現(xiàn)
日期時間類型的數(shù)據(jù)也是經(jīng)常要用到的,SQL中也提供了一些函數(shù)對這些數(shù)據(jù)進(jìn)行處理,本文主要介紹了SQL中current_date()函數(shù)的實(shí)現(xiàn),具有一定的參考價值2024-02-02

