概述
mysql自5.7.8版本開始,就支援了json結構的資料儲存和查詢,這表明了mysql也在不斷的學習和增加nosql資料庫的有點。但mysql畢竟是關係型資料庫,在處理json這種非結構化的資料時,還是比較彆扭的。
建立一個JSON欄位的表
首先先建立一個表,這個表包含一個json格式的欄位:
CREATE TABLE table_name (
id INT NOT NULL AUTO_INCREMENT,
json_col JSON,
PRIMARY KEY(id)
);複製程式碼
上面的語句,主要注意json_col這個欄位,指定的資料型別是JSON。
插入一條簡單的JSON資料
INSERT INTO
table_name (json_col)
VALUES
(`{"City": "Galle", "Description": "Best damn city in the world"}`);複製程式碼
上面這個SQL語句,主要注意VALUES後面的部分,由於json格式的資料裡,需要有雙引號來標識字串,所以,VALUES後面的內容需要用單引號包裹。
插入一條複雜的JSON資料
INSERT INTO table(col)
VALUES(`{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}`);複製程式碼
這地方,我們插入了一個json陣列。主要還是注意單引號和雙引號的問題。
修改JSON資料
之前的例子中,我們插入了幾條JSON資料,但是如果我們想修改JSON資料裡的某個內容,怎麼實現了?比如我們向 variations 陣列裡增加一個元素,可以這樣:
UPDATE myjson SET dict=JSON_ARRAY_APPEND(dict,`$.variations`,`scheveningen`) WHERE id = 2;複製程式碼
這個SQL語句中,$符合代表JSON欄位,通過.號索引到variations欄位,然後通過JSON_ARRAY_APPEND函式增加一個元素。現在我們執行查詢語句:
SELECT * FROM myjson複製程式碼
得到的結果是:
+----+-----------------------------------------------------------------------------------------+
| id | dict |
+---+-----------------------------------------------------------------------------------------+
| 2 | {"opening": "Sicilian", "variations": ["pelikan", "dragon", "najdorf", "scheveningen"]} |
+----+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)複製程式碼
關於MySQL中,JSON資料的獲取方法,參照官方連結JSON Path Syntax
建立索引
MySQL的JSON格式資料不能直接建立索引,但是可以變通一下,把要搜尋的資料單獨拎出來,單獨一個資料列,然後在這個欄位上鍵一個索引。下面是官方的例子:
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 > 2G
*************************** 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 WARNINGSG
*************************** 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)複製程式碼
這個例子很簡單,就是把JSON欄位裡的id欄位,單獨拎出來成欄位g,然後在欄位g上做索引,查詢條件也是在欄位g上。
字串轉JSON格式
把json格式的字串轉換成MySQL的JSON型別:
SELECT CAST(`[1,2,3]` as JSON) ;
SELECT CAST(`{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}` as JSON);複製程式碼
所有MYSQL JSON函式
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 |