MySQL操作之JSON數(shù)據(jù)類型操作詳解
上一篇文章我們介紹了mysql數(shù)據(jù)存儲(chǔ)過程參數(shù)實(shí)例詳解,今天我們看看MySQL操作之JSON數(shù)據(jù)類型的相關(guān)內(nèi)容。
概述
mysql自5.7.8版本開始,就支持了json結(jié)構(gòu)的數(shù)據(jù)存儲(chǔ)和查詢,這表明了mysql也在不斷的學(xué)習(xí)和增加nosql數(shù)據(jù)庫的有點(diǎn)。但mysql畢竟是關(guān)系型數(shù)據(jù)庫,在處理json這種非結(jié)構(gòu)化的數(shù)據(jù)時(shí),還是比較別扭的。
創(chuàng)建一個(gè)JSON字段的表
首先先創(chuàng)建一個(gè)表,這個(gè)表包含一個(gè)json格式的字段:
CREATE TABLE table_name ( id INT NOT NULL AUTO_INCREMENT, json_col JSON, PRIMARY KEY(id) );
上面的語句,主要注意json_col這個(gè)字段,指定的數(shù)據(jù)類型是JSON。
插入一條簡(jiǎn)單的JSON數(shù)據(jù)
INSERT INTO
table_name (json_col)
VALUES
('{"City": "Galle", "Description": "Best damn city in the world"}');
上面這個(gè)SQL語句,主要注意VALUES后面的部分,由于json格式的數(shù)據(jù)里,需要有雙引號(hào)來標(biāo)識(shí)字符串,所以,VALUES后面的內(nèi)容需要用單引號(hào)包裹。
插入一條復(fù)雜的JSON數(shù)據(jù)
INSERT INTO table(col)
VALUES('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}');
這地方,我們插入了一個(gè)json數(shù)組。主要還是注意單引號(hào)和雙引號(hào)的問題。
修改JSON數(shù)據(jù)
之前的例子中,我們插入了幾條JSON數(shù)據(jù),但是如果我們想修改JSON數(shù)據(jù)里的某個(gè)內(nèi)容,怎么實(shí)現(xiàn)了?比如我們向 variations 數(shù)組里增加一個(gè)元素,可以這樣:
UPDATE myjson SET dict=JSON_ARRAY_APPEND(dict,'$.variations','scheveningen') WHERE id = 2;
這個(gè)SQL語句中,$符合代表JSON字段,通過.號(hào)索引到variations字段,然后通過JSON_ARRAY_APPEND函數(shù)增加一個(gè)元素?,F(xiàn)在我們執(zhí)行查詢語句:
SELECT * FROM myjson
得到的結(jié)果是:
+----+-----------------------------------------------------------------------------------------+
| id | dict |
+---+-----------------------------------------------------------------------------------------+
| 2 | {"opening": "Sicilian", "variations": ["pelikan", "dragon", "najdorf", "scheveningen"]} |
+----+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
關(guān)于MySQL中,JSON數(shù)據(jù)的獲取方法,參照官方鏈接JSON Path Syntax
創(chuàng)建索引
MySQL的JSON格式數(shù)據(jù)不能直接創(chuàng)建索引,但是可以變通一下,把要搜索的數(shù)據(jù)單獨(dú)拎出來,單獨(dú)一個(gè)數(shù)據(jù)列,然后在這個(gè)字段上鍵一個(gè)索引。下面是官方的例子:
mysql> CREATE TABLE jemp (
-> c JSON,
-> g INT GENERATED ALWAYS AS (c->"$.id"),
-> INDEX i (g)
-> );
Query OK, 0 rows affected (0.28 sec)
mysql> INSERT INTO jemp (c) VALUES
> ('{"id": "1", "name": "Fred"}'), ('{"id": "2", "name": "Wilma"}'),
> ('{"id": "3", "name": "Barney"}'), ('{"id": "4", "name": "Betty"}');
Query OK, 4 rows affected (0.04 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> SELECT c->>"$.name" AS name
> FROM jemp WHERE g > 2;
+--------+
| name |
+--------+
| Barney |
| Betty |
+--------+
2 rows in set (0.00 sec)
mysql> EXPLAIN SELECT c->>"$.name" AS name
> FROM jemp WHERE g > 2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: jemp
partitions: NULL
type: range
possible_keys: i
key: i
key_len: 5
ref: NULL
rows: 2
filtered: 100.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select json_unquote(json_extract(`test`.`jemp`.`c`,'$.name'))
AS `name` from `test`.`jemp` where (`test`.`jemp`.`g` > 2)
1 row in set (0.00 sec)
這個(gè)例子很簡(jiǎn)單,就是把JSON字段里的id字段,單獨(dú)拎出來成字段g,然后在字段g上做索引,查詢條件也是在字段g上。
字符串轉(zhuǎn)JSON格式
把json格式的字符串轉(zhuǎn)換成MySQL的JSON類型:
SELECT CAST('[1,2,3]' as JSON) ;
SELECT CAST('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}' as JSON);
所有MYSQL JSON函數(shù)
| Name | Description |
|---|---|
| JSON_APPEND() | Append data to JSON document |
| JSON_ARRAY() | Create JSON array |
| JSON_ARRAY_APPEND() | Append data to JSON document |
| JSON_ARRAY_INSERT() | Insert into JSON array-> Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT(). |
| JSON_CONTAINS() | Whether JSON document contains specific object at path |
| JSON_CONTAINS_PATH() | Whether JSON document contains any data at path |
| JSON_DEPTH() | Maximum depth of JSON document |
| JSON_EXTRACT() | Return data from JSON document->> Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()). |
| JSON_INSERT() | Insert data into JSON document |
| JSON_KEYS() | Array of keys from JSON document |
| JSON_LENGTH() | Number of elements in JSON document |
| JSON_MERGE() | Merge JSON documents, preserving duplicate keys. Deprecated synonym for JSON_MERGE_PRESERVE() |
| JSON_MERGE_PRESERVE() | Merge JSON documents, preserving duplicate keys |
| JSON_OBJECT() | Create JSON object |
| JSON_QUOTE() | Quote JSON document |
| JSON_REMOVE() | Remove data from JSON document |
| JSON_REPLACE() | Replace values in JSON document |
| JSON_SEARCH() | Path to value within JSON document |
| JSON_SET() | Insert data into JSON document |
| JSON_TYPE() | Type of JSON value |
| JSON_UNQUOTE() | Unquote JSON value |
| JSON_VALID() | Whether JSON value is valid |
總結(jié)
以上就是本文關(guān)于MySQL操作之JSON數(shù)據(jù)類型操作詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:mysql數(shù)據(jù)存儲(chǔ)過程參數(shù)實(shí)例詳解、簡(jiǎn)述Redis和MySQL的區(qū)別、幾個(gè)比較重要的MySQL變量等,如有不足之處,歡迎留言指出,小編會(huì)及時(shí)回復(fù)大家并進(jìn)行修改,努力為廣大編程愛好及工作者提供更好的文章和閱讀體驗(yàn)。下面推薦幾本跟MySQL操作有關(guān)的書籍,供大家參考:
MySQL數(shù)據(jù)庫應(yīng)用從入門到精通(第2版) PDF掃描版
https://www.jb51.net/books/361239.html
MySQL5 權(quán)威指南(第3版)中文版 PDF掃描版
https://www.jb51.net/books/367031.html
希望大家能夠喜歡,更多精彩內(nèi)容盡在:https://www.jb51.net/
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信