1. json
JSON數(shù)組包含一個由逗號分隔的值列表民晒,并包含在 字符[和]字符中:
["abc", 10, null, true, false]
JSON對象包含一組由逗號分隔的鍵值對锄禽,并包含在字符{和 }字符中,JSON對象中的鍵必須是字符串:
{"k1": "value", "k2": 10}
在JSON數(shù)組元素和JSON對象鍵值中允許嵌套:
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
在MySQL中磁滚,JSON值被寫為字符串垂攘。MySQL解析在需要JSON值的上下文中使用的任何字符串淤刃,如果它作為JSON無效則會產(chǎn)生錯誤。
2. 創(chuàng)建json值
1.JSON_ARRAY 生成json數(shù)組
JSON_ARRAY(val1,val2,val3...)生成一個包含指定元素的json數(shù)組逸贾。
SELECT JSON_ARRAY(1, "abc", NULL, TRUE); -- [1, "abc", null, true]
2.JSON_OBJECT 生成json對象
JSON_OBJECT(key1,val1,key2,val2...) 生成一個包含指定K-V對的json object耕陷。如果有key為NULL或參數(shù)個數(shù)為奇數(shù),則拋錯饺蔑。
SELECT JSON_OBJECT('name', 'lily', 'age', 20); -- {"name": "lily", "age": 20}
3.JSON_QUOTE 加"號
JSON_QUOTE(json_val) -- 將json_val用"號括起來嗜诀。
SELECT JSON_QUOTE('[1,2,3]'); -- "[1,2,3]"
- JSON_MERGE_PRESERVE()) 獲取兩個或多個JSON文檔并返回組合結果:
SELECT JSON_MERGE_PRESERVE('[1, "abc"]', '{"name": "lily"}');-- [1, "abc", {"name": "lily"}]
2.插入記錄
創(chuàng)建一個表
CREATE TABLE t_json(id INT PRIMARY KEY, name VARCHAR(20) , info JSON);
插入含有json數(shù)組的記錄
INSERT INTO t_json VALUES( 1, 'Lily', JSON_ARRAY(20, "student",now()));
插入含有json對象的記錄
INSERT INTO t_json(id,name,info) VALUES( 2, 'Amy', JSON_OBJECT("age", 19, "time", now()));
INSERT INTO t_json(id,sname,info) VALUES( 3, 'Tom', '{"age":20, "time":"2019-01-1 08:00:00"}');
3. 搜索json值隆敢。
路徑表達式對于提取JSON文檔的一部分或修改JSON文檔的函數(shù)很有用,以指定該文檔中的操作位置穴墅。例如,以下查詢從JSON文檔中提取具有name
鍵的成員的值 :
SELECT JSON_EXTRACT('{"id": 2, "name": "lucy"}', '$.name'); //lucy
路徑語法使用前導$
字符來表示正在考慮的JSON文檔皇钞,可選地后跟選擇器夹界,它們連續(xù)指示文檔的更多特定部分:
- 后跟密鑰名稱的句點用具有給定鍵的對象命名成員隘世。如果沒有引號的名稱在路徑表達式中不合法(例如,如果它包含空格)复斥,則必須在雙引號內(nèi)指定鍵名蔓钟。
-
[*
N*]
附加到apath
,選擇一個數(shù)組命名數(shù)組中位置的值N
。數(shù)組位置是從零開始的整數(shù)键俱。 - 路徑可以包含
*
或**
通配符:- .[*] 計算JSON對象中所有成員的值。
- [*] 計算JSON數(shù)組中所有元素的值缀辩。
-
prefix
****
suffix計算所有以命名前綴開頭并以命名后綴結尾的路徑臀玄。
- 文檔中不存在的路徑(評估為不存在的數(shù)據(jù))的計算結果為
NULL
畅蹂。
[3, {"a": [5, 6], "b": 10}, [99, 100]]
//$[1]為{"a": [5, 6], "b": 10},$[1].a[1]為 6
//$[3]為NULL累贤。
如果路徑表達式中的未加引號的鍵名稱不合法,則必須引用命名鍵的路徑組件臼膏。讓我們$
參考這個值示损,且密鑰都包含空格,必須引用:
{"a fish": "shark", "a bird": "sparrow"}
//$."a fish"`為 `shark`始鱼。
mysql> SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.*');//[1, 2, [3, 4, 5]]
可以使用帶有to
關鍵字的范圍來指定JSON數(shù)組的子集。
SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]');//[2, 3, 4]
last關鍵字被支撐為最后一個元素的陣列中的索引的同義詞嘉汰。表單的表達式可用于相對尋址状勤,也可用于范圍定義,如下所示:last - *
N*
SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[last-3 to last-1]');//[2, 3, 4]
4. 修改記錄
- json_array_insert()函數(shù):添加新值但不替換現(xiàn)有值
SET @j = '["a", {"b": [true, false]}, [10, 20]]';
SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2);
// ["a", {"b": [true, false]}, [10, 20, 2]]
- json_set(): 替換存在的路徑的值密似,并為不存在的路徑添加值:
SET @j = '["a", {"b": [true, false]}, [10, 20]]';
SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2);
//["a", {"b": [1, false]}, [10, 20, 2]]
- json_replace() 替換現(xiàn)有值并忽略新值:
SET @j = '["a", {"b": [true, false]}, [10, 20]]';
SELECT JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2);
// ["a", {"b": [1, false]}, [10, 20]]
4.JSON_REMOVE()獲取JSON文檔和一個或多個指定要從文檔中刪除的值的路徑葫盼。返回值是原始文檔減去文檔中存在的路徑選擇的值
SET @j = '["a", {"b": [true, false]}, [10, 20]]';
SELECT JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]');
//["a", {"b": [true]}]
5. JSON值的比較和排序
JSON值可以使用進行比較 =贫导、<、<=闺金、>峰档、>=、<>讥巡、!=、<=>
JSON值尚不支持以下比較運算符和函數(shù):BETWEEN槽棍、IN()吱涉、GREATEST()、LEAST()
以上列出的比較運算符和函數(shù)是通過將JSON值轉換為本機MySQL數(shù)值或字符串數(shù)??據(jù)類型特石,使它們具有一致的非JSON標量類型鳖链。
JSON值的比較發(fā)生在兩個級別墩莫。第一級比較基于比較值的JSON類型狂秦。如果類型不同推捐,則比較結果僅由哪種類型具有更高優(yōu)先級來確定。如果這兩個值具有相同的JSON類型牛柒,則使用特定于類型的規(guī)則進行第二級比較。
NULL->INTEGER, DOUBLE->STRING->OBJECT->ARRAY->BOOLEAN->DATE->TIME->DATETIME->OPAQUE->BIT->BLOB按此順序優(yōu)先級依次變大椭更。
對于具有相同優(yōu)先級的JSON值虑瀑,比較規(guī)則是特定于類型的:
1) BLOB、BIT舌狗、OPAQUE
比較兩個值 的第一個字節(jié)扔水,其中N是較短值中的字節(jié)數(shù)铭污。如果N兩個值的第一個字節(jié)相同嘹狞,則在較長值之前排序較短的值誓竿。
2) DATETIME
表示較早時間點的值在表示稍后時間點的值之前排序。如果兩個值最初 分別來自MySQL DATETIME
和TIMESTAMP
類型筷屡,則它們相等,如果它們代表相同的時間點燎潮。
3)TIME
兩個時間值中較小的一個在較大的值之前排序扼倘。
4) DATE`
較早的日期是在最近的日期之前訂購的。
5) ARRAY
如果兩個JSON數(shù)組具有相同的長度并且數(shù)組中相應位置的值相等爪喘,則它們是相等的。如果數(shù)組不相等泛豪,則它們的順序由第一個位置中存在差異的元素確定侦鹏。首先排序在該位置具有較小值的數(shù)組。如果較短數(shù)組的所有值都等于較長數(shù)組中的相應值种柑,則首先排序較短的數(shù)組。
[] < ["a"] < ["ab"] < ["ab", "cd", "ef"] < ["ab", "ef"]
- BOOLEAN
false小于 true 荠雕。 - OBJECT`
如果兩個JSON對象具有相同的鍵集驶赏,則它們是相等的,并且每個鍵在兩個對象中具有相同的值盖文。
{"a": 1, "b": 2} = {"b": 2, "a": 1}//相等
8) STRING
字符串在被比較的兩個字符串以詞法字典序排序 五续,其中N
是較短字符串的長度。如果N
兩個字符串的第一個 字節(jié)相同疙驾,則認為較短的字符串小于較長的字符串它碎。
"a" < "ab" < "b" < "bc"