mysql數(shù)據(jù)庫中查詢json的技巧大全
前置工作
CREATE TABLE `mk_task_record` ( `task_id` int NOT NULL AUTO_INCREMENT, `task_name` varchar(50) DEFAULT NULL, `result_json` json DEFAULT NULL, `result_str` longtext, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`task_id`), KEY `task_name` (`task_name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
插入數(shù)據(jù):
插入帶轉(zhuǎn)義符的json:
INSERT INTO `test`.`mk_task_record`(`task_id`, `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES (1, '哈哈1', '{\"age\": 22, \"name\": \"李四\", \"major\": \"計(jì)算機(jī)科學(xué)\", \"university\": \"清華大學(xué)\", \"is_graduated\": false}', '{\r\n \"name\": \"李四\",\r\n \"age\": 22,\r\n \"major\": \"計(jì)算機(jī)科學(xué)\",\r\n \"university\": \"清華大學(xué)\",\r\n \"is_graduated\": false\r\n}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');
INSERT INTO `test`.`mk_task_record`(`task_id`, `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES (2, '哈哈2', '{\"age\": 22, \"name\": \"張三\", \"major\": \"計(jì)算機(jī)科學(xué)\", \"university\": \"清華大學(xué)\", \"is_graduated\": false}', '{\r\n \"name\": \"張三\",\r\n \"age\": 22,\r\n \"major\": \"計(jì)算機(jī)科學(xué)\",\r\n \"university\": \"清華大學(xué)\",\r\n \"is_graduated\": false\r\n}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');插入不帶轉(zhuǎn)義符的json:
INSERT INTO `test`.`mk_task_record`( `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES ( '哈哈3', '{"name": "王五", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}', '{"name": "王五", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');
INSERT INTO `test`.`mk_task_record`( `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES ( '哈哈4', '{"name": "趙六", "age": 30, "address": {"street": "123 Main St", "city": "Chicago"}}','{"name": "趙六", "age": 30, "address": {"street": "123 Main St", "city": "Chicago"}}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');- result_json是json格式;
- result_result是longtext格式;
經(jīng)過實(shí)際測試,json、varchar、text類型的json格式都可以使用以下的函數(shù),且效果相同。
一、JSON_EXTRACT 提取指定數(shù)據(jù)
1.1 提取簡單值
SELECT JSON_EXTRACT(result_str,'$.name') from mk_task_record; SELECT JSON_EXTRACT(result_json,'$.name') from mk_task_record;
- json類型:

- text類型
結(jié)果也帶引號;
如何去掉引號呢?
——查看【四、JSON_UNQUOTE 取消雙引號】
- 作條件查詢
select *from mk_task_record where json_extract(result_str,'$.name') ='張三'; select *from mk_task_record where json_extract(result_json,'$.name') ='張三';
兩條sql返回的都一樣:

http://m.fzitv.net/database/3356367c4.htm
二、字段->'$.json屬性’進(jìn)行查詢條件,以及數(shù)據(jù)反顯
select result_json->'$.name' from mk_task_record;

作為查詢條件,不用轉(zhuǎn)移雙引號。
三、JSON_UNQUOTE 取消雙引號
JSON_UNQUOTE() 函數(shù)取消雙引號引用 JSON 值,并將結(jié)果作為字符串返回。
3.1 語法:
JSON_UNQUOTE(json_val)
參數(shù)說明:
json_val:必需的。一個(gè)字符串。
返回值:
取消雙引號引用 JSON 值
返回NULL情況:參數(shù)為 NULL。
報(bào)錯(cuò)情況:不是有效的 JSON 字符串文本。能夠識別下表中的轉(zhuǎn)義字符:
- ":雙引號 "
- \b:退格字符
- \f:換頁符
- \n:換行符
- \r:回車符
- \t:制表符
- \:反斜杠
- \uXXXX:Unicode 值 XXXX 的 UTF-8 字節(jié)
3.2 示例:
SELECT JSON_UNQUOTE(JSON_EXTRACT(result_json,'$.name')) from mk_task_record;

五、JSON_SEARCH 查找
JSON_SEARCH() 函數(shù)返回一個(gè)給定字符串在一個(gè) JSON 文檔中的路徑。
5.1 語法:
JSON_SEARCH(json, one_or_all, search_str) JSON_SEARCH(json, one_or_all, search_str, escape_char) JSON_SEARCH(json, one_or_all, search_str, escape_char, path)
參數(shù)說明:
- on:必需的。一個(gè) JSON 文檔。
- one_or_all:必需的??捎弥担?lsquo;one’, ‘all’。
- 規(guī)則如下:‘one’:返回第一個(gè)匹配的路徑。‘all’:返回所有匹配的路徑。所有的路徑會(huì)包裝在一個(gè)數(shù)組內(nèi)返回。
- search_str:必需的。被搜索的字符串。 您可以在 search_str 參數(shù)中使用 % 和 _ 通配符,就像 LIKE 一樣:% 匹配任意數(shù)量的任意字符。_ 匹配一個(gè)任意字符。
- escape_char:可選的。 如果 search_str 中包含 % 和 _,需要在他們之前添加轉(zhuǎn)移字符。默認(rèn)是 \。
- path:可選的。只能在此路徑下進(jìn)行搜索。
返回值:一個(gè)路徑字符串或者由多個(gè)路徑組成的數(shù)組。返回 NULL情況:未搜索到指定的字符串。JSON 文檔中不存在指定的 path。任意一個(gè)參數(shù)為 NULL。
報(bào)錯(cuò)情況:json 不是有效的 JSON 文檔。path 不是有效的路徑表達(dá)式。
5.2 示例:
select *from mk_task_record where JSON_SEARCH(result_json,'one','張三');
六、JSON_SET 插入或更新數(shù)據(jù)
JSON_SET() 函數(shù)在一個(gè) JSON 文檔中插入或更新數(shù)據(jù)并返回新的 JSON 文檔。它相當(dāng)于是 JSON_INSERT() 和 JSON_REPLACE() 的組合。
6.1 語法:
JSON_SET(json, path, value[, path2, value2] ...)
參數(shù)說明:
- json:必需的。被修改的 JSON 文檔。
- path:必需的。一個(gè)有效的路徑表達(dá)式,它不能包含 * 或 **。
- value:必需的。要設(shè)置的數(shù)據(jù)。
插入或更新數(shù)據(jù)并返回新的 JSON 文檔。規(guī)則如下:
- 存在路徑:更新。
- 不存在路徑:添加。
- 若value 為字符串:直接插入。
- 返回 NULL情況:JSON 文檔或者路徑為 NULL。
報(bào)錯(cuò)情況:json 不是有效的 JSON 文檔。
path 不是有效的路徑表達(dá)式或者其中包含 * 或 **。
6.2 示例:
UPDATE mk_task_record SET result_str = JSON_SET(result_str, '$.name', '王麻子', '$.age', '36') where task_id =1;

七、JSON_CONTAINS 判斷是否包含
JSON_CONTAINS() 函數(shù)檢查一個(gè) JSON 文檔中是否包含另一個(gè) JSON 文檔。
7.1 語法:
JSON_CONTAINS(target_json, candidate_json) JSON_CONTAINS(target_json, candidate_json, path)
參數(shù)說明:
- target_json必需的。一個(gè) JSON 文檔。
- candidate_json:必需的。被包含的 JSON 文檔。
- path:可選的。一個(gè)路徑表達(dá)式。
- 返回值:
包含:返回1。
不包含:返回0。
返回 NULL情況:JSON 文檔中不存在指定的路徑。
任意一個(gè)參數(shù)為 NULL。
報(bào)錯(cuò)情況:
json 不是有效的 JSON 文檔。path 不是有效的路徑表達(dá)式。
示例:
SELECT * FROM mk_task_record WHERE JSON_CONTAINS(result_json, '"張三"','$.name');

注意:"張三"有雙引號一定加,否則報(bào)錯(cuò):

八、JSON_REMOVE 刪除指定數(shù)據(jù)
JSON_REMOVE() 函數(shù)從一個(gè) JSON 文檔中刪除由路徑指定的數(shù)據(jù)并返回修改后的 JSON 文檔。
8.1 語法:
JSON_REMOVE(json, path[, path] ...)
參數(shù)說明:
- json:必需的。一個(gè) JSON 文檔。
- path:必需的。一個(gè)有效的路徑表達(dá)式,它不能包含 * 或 **。
返回值:刪除后的JSON文檔。
8.2 示例:
select JSON_REMOVE(result_str,'$.major') from mk_task_record where task_id =1;
九、JSON_REPLACE 替換數(shù)據(jù)
JSON_REPLACE() 函數(shù)在一個(gè) JSON 文檔中替換已存在的數(shù)據(jù)并返回新的 JSON 文檔
9.1 語法:
JSON_REPLACE(json, path, value[, path2, value2] ...)
參數(shù)說明:
- json:必需的。被修改的 JSON 文檔。
- path:必需的。一個(gè)有效的路徑表達(dá)式,它不能包含 * 或 **。
- value:必需的。新的數(shù)據(jù)。
- 返回值:替換后的JSON文檔。回 NULL情況:JSON 文檔或者路徑為 NULL。
報(bào)錯(cuò)情況:
json 不是有效的 JSON 文檔。path 不是有效的路徑表達(dá)式或者其中包含 * 或 **。
9.2 示例:
select JSON_REPLACE(result_str,'$.university','復(fù)旦大學(xué)') from mk_task_record where task_id =1;

拓展:
http://m.fzitv.net/database/3356414s9.htm
總結(jié)
到此這篇關(guān)于mysql數(shù)據(jù)庫中查詢json技巧大全的文章就介紹到這了,更多相關(guān)mysql查詢json技巧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
史上最簡單的MySQL數(shù)據(jù)備份與還原教程(下)(三十七)
這篇文章主要為大家詳細(xì)介紹了史上最簡單的MySQL數(shù)據(jù)備份與還原教程下篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
MySQL中TINYINT、INT 和 BIGINT的具體使用
MySQL提供了多種整數(shù)類型來滿足不同的數(shù)據(jù)存儲需求,本文主要介紹了MySQL中TINYINT、INT 和 BIGINT的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
Docker啟動(dòng)mysql配置實(shí)現(xiàn)過程
這篇文章主要介紹了Docker啟動(dòng)mysql配置實(shí)現(xiàn)過程,文中附含詳細(xì)的圖文示例,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日升職加薪2021-09-09
MySQL語句之刪除指令deleted和truncate在使用中的異同詳解
這篇文章主要介紹了MySQL語句之刪除指令deleted和truncate在使用中的異同,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
MYSQL突破secure_file_priv寫shell問題
這篇文章主要介紹了MYSQL突破secure_file_priv寫shell問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Mysql復(fù)制表結(jié)構(gòu)、表數(shù)據(jù)的方法
這篇文章主要介紹了Mysql復(fù)制表結(jié)構(gòu)、表數(shù)據(jù)的方法,需要的朋友可以參考下2015-10-10

