MySQL中的json處理相關(guān)方法詳解
起因:在使用tidb作為檢查點的存儲模塊時,想著tidb兼容mysql,于是借用的langgraph-checkpoint-mysql插件來實現(xiàn)tidb。但在驗證過程中發(fā)現(xiàn)并不如此,mysql很多處理json的語法tidb無法使用。下面介紹這些語法的功能,下一篇會介紹到底哪里不兼容。
json_table,json_unquote,json_extract,json_keys,json_arrayagg,json_array
在 MySQL 中,這些 JSON 函數(shù)用于處理 JSON 類型的數(shù)據(jù),方便對 JSON 數(shù)據(jù)進(jìn)行提取、轉(zhuǎn)換和聚合等操作。
JSON_TABLE
作用:將 JSON 數(shù)據(jù)轉(zhuǎn)換為關(guān)系表的形式,使得可以像查詢普通表一樣查詢 JSON 數(shù)據(jù)中的元素,方便進(jìn)行復(fù)雜的查詢和分析。
案例:假設(shè)有一個 students 表,其中 courses 字段是 JSON 類型,存儲了學(xué)生所選課程及其成績。
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
courses JSON
);
INSERT INTO students (id, name, courses) VALUES
(1, 'Alice', '[{"course": "Math", "score": 90}, {"course": "English", "score": 85}]'),
(2, 'Bob', '[{"course": "Math", "score": 80}, {"course": "English", "score": 88}]');
-- 使用 JSON_TABLE 展開 courses 字段
SELECT
s.id,
s.name,
jt.course,
jt.score
FROM
students s,
JSON_TABLE(
s.courses,
'$[*]' COLUMNS (
course VARCHAR(50) PATH '$.course',
score INT PATH '$.score'
)
) AS jt;查詢結(jié)果:
| id | name | course | score |
|---|---|---|---|
| 1 | Alice | Math | 90 |
| 1 | Alice | English | 85 |
| 2 | Bob | Math | 80 |
| 2 | Bob | English | 88 |
JSON_TABLE(
json_data, -- 輸入的 JSON 數(shù)據(jù)(可以是字段名、JSON 字符串或表達(dá)式)
row_path_expression -- 行路徑表達(dá)式,指定從 JSON 中提取“行”的范圍
COLUMNS (
-- 定義輸出表的列結(jié)構(gòu),每個列包含:列名、數(shù)據(jù)類型、JSON 路徑
column1 data_type PATH 'json_path1',
column2 data_type PATH 'json_path2',
...
)
) AS table_alias -- 為轉(zhuǎn)換后的表指定別名row_path_expression:行路徑表達(dá)式
- 用 JSON 路徑語法指定從 JSON 中哪些部分提取 “行”(每個匹配的元素會成為表中的一行)。
- 常用語法:
$[*]:匹配 JSON 數(shù)組中的所有元素(每個元素作為一行)。$.obj[*]:匹配 JSON 對象中obj字段對應(yīng)的數(shù)組的所有元素。
- 示例:
'$[*]'(解析 JSON 數(shù)組的所有元素為行)。
COLUMNS (...):定義輸出表的列結(jié)構(gòu)
用于指定轉(zhuǎn)換后的關(guān)系表包含哪些列,以及每個列的值從 JSON 中的哪個位置提取。每個列的定義格式為:列名 數(shù)據(jù)類型 PATH 'JSON路徑'
JSON_UNQUOTE 和JSON_EXTRACT
JSON_UNQUOTE
作用:移除 JSON 字符串中的引號,將 JSON 格式的字符串轉(zhuǎn)換為普通字符串。
案例:假設(shè)從 JSON 數(shù)據(jù)中提取出來的某個值是帶引號的字符串,想要得到不帶引號的內(nèi)容時使用。
JSON_EXTRACT
作用:從 JSON 數(shù)據(jù)中提取指定路徑的元素,可以是標(biāo)量值(如字符串、數(shù)字等),也可以是 JSON 對象或數(shù)組。
案例:繼續(xù)使用上述 students 表,查詢學(xué)生 Alice 的數(shù)學(xué)成績。
查詢結(jié)果:
| name |
|---|
| John |
SET @json_str = '{"name": "John"}';
- 定義一個名為
@json_str的用戶變量,并賦值為 JSON 格式的字符串{"name": "John"}。 - 這里的 JSON 字符串表示一個對象,包含一個鍵值對:
"name"對應(yīng)的值是"John"(注意 JSON 中字符串必須用雙引號包裹)。
SELECT JSON_UNQUOTE(JSON_EXTRACT(@json_str, '$.name')) AS name;
這是一個查詢語句,包含兩個嵌套的 JSON 函數(shù):
(1)JSON_EXTRACT(@json_str, '$.name')
- 作用:從 JSON 數(shù)據(jù)中提取指定路徑的值。
@json_str是要解析的 JSON 變量(即{"name": "John"})。'$.name'是 JSON 路徑,表示 “根節(jié)點下的name字段”($代表根節(jié)點)。- 執(zhí)行結(jié)果:提取到的值是
"John"(帶雙引號的 JSON 字符串)。
(2)JSON_UNQUOTE(...)
- 作用:移除 JSON 字符串外層的雙引號,將其轉(zhuǎn)換為普通字符串。
- 接收
JSON_EXTRACT的結(jié)果"John"作為參數(shù),移除引號后得到John。
(3)AS name
- 給查詢結(jié)果的列起一個別名
name,方便閱讀。
JSON_KEYS
作用:返回 JSON 對象中的所有鍵,以 JSON 數(shù)組的形式呈現(xiàn)。
案例:假設(shè)有一個存儲用戶信息的 JSON 數(shù)據(jù),獲取其中所有的鍵。
SET @user_info = '{"name": "Tom", "age": 25, "email": "tom@example.com"}';
SELECT JSON_KEYS(@user_info) AS keys;
查詢結(jié)果:
| keys |
|---|
| [“name”, “age”, “email”] |
JSON_ARRAYAGG
作用:將一組值聚合為一個 JSON 數(shù)組,常用于分組查詢中,將每組內(nèi)的相關(guān)數(shù)據(jù)聚合成 JSON 數(shù)組形式。
案例:統(tǒng)計每個學(xué)生所選課程的名稱,以 JSON 數(shù)組形式呈現(xiàn)。
SELECT
name,
JSON_ARRAYAGG(course) AS courses
FROM
students s,
JSON_TABLE(
s.courses,
'$[*]' COLUMNS (
course VARCHAR(50) PATH '$.course'
)
) AS jt
GROUP BY
name;查詢結(jié)果:
| name | courses |
|---|---|
| Alice | [“Math”, “English”] |
| Bob | [“Math”, “English”] |
JSON_ARRAY
作用:將一組值創(chuàng)建為一個 JSON 數(shù)組,它與 JSON_ARRAYAGG 的區(qū)別在于,JSON_ARRAY 不是聚合函數(shù),是直接創(chuàng)建數(shù)組。
案例:創(chuàng)建一個包含多個字符串的 JSON 數(shù)組。
SELECT JSON_ARRAY('red', 'green', 'blue') AS colors;
查詢結(jié)果:
| colors |
|---|
| [“red”, “green”, “blue”] |
到此這篇關(guān)于MySQL中的json處理相關(guān)方法詳解的文章就介紹到這了,更多相關(guān)mysql json處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql截取的字符串函數(shù)substring_index的用法
這篇文章主要介紹了mysql截取的字符串函數(shù)substring_index的用法,需要的朋友可以參考下2014-08-08
MySQL主鍵與外鍵設(shè)計原則 + 實戰(zhàn)案例解析
這篇文章詳細(xì)介紹了MySQL中的主鍵和外鍵,包括它們的基本概念、設(shè)計原則、應(yīng)用場景以及實戰(zhàn)案例,主鍵用于唯一標(biāo)識表中的每一行記錄,而外鍵用于建立和加強表之間的關(guān)聯(lián)關(guān)系,感興趣的朋友跟隨小編一起看看吧2026-01-01
navicat創(chuàng)建MySql定時任務(wù)的方法詳解
這篇文章主要介紹了navicat創(chuàng)建MySql定時任務(wù)的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
MySQL數(shù)據(jù)庫如何正確設(shè)置主鍵
主鍵是用于唯一標(biāo)識數(shù)據(jù)庫表中每一行數(shù)據(jù)的一列或一組列,主鍵可以確保數(shù)據(jù)的唯一性和完整性,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫如何正確設(shè)置主鍵的相關(guān)資料,需要的朋友可以參考下2024-04-04
關(guān)于mysql innodb count(*)速度慢的解決辦法
innodb引擎在統(tǒng)計方面和myisam是不同的,Myisam內(nèi)置了一個計數(shù)器,所以在使用 select count(*) from table 的時候,直接可以從計數(shù)器中取出數(shù)據(jù)。而innodb必須全表掃描一次方能得到總的數(shù)量2012-12-12

