MySQL JSON數據類型操做

概述

mysql自5.7.8版本開始,就支持了json結構的數據存儲和查詢,這代表了mysql也在不斷的學習和增長nosql數據庫的有點。但mysql畢竟是關係型數據庫,在處理json這種非結構化的數據時,仍是比較彆扭的。html

建立一個JSON字段的表

首先先建立一個表,這個表包含一個json格式的字段:mysql

CREATE TABLE table_name (
    id INT NOT NULL AUTO_INCREMENT, 
    json_col JSON,
    PRIMARY KEY(id)
);

上面的語句,主要注意json_col這個字段,指定的數據類型是JSON。sql

插入一條簡單的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數據,可是若是咱們想修改JSON數據裏的某個內容,怎麼實現了?好比咱們向 variations 數組裏增長一個元素,能夠這樣:數組

UPDATE myjson SET dict=JSON_ARRAY_APPEND(dict,'$.variations','scheveningen') WHERE id = 2;

這個SQL語句中,$符合表明JSON字段,經過.號索引到variations字段,而後經過JSON_ARRAY_APPEND函數增長一個元素。如今咱們執行查詢語句:nosql

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格式數據不能直接建立索引,可是能夠變通一下,把要搜索的數據單獨拎出來,單獨一個數據列,而後在這個字段上鍵一個索引。下面是官方的例子:ui

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)

這個例子很簡單,就是把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

轉載自個人博客捕蛇者說

相關文章
相關標籤/搜索