MySQL操作之JSON数据类型操作详解
上⼀篇⽂章我们介绍了,今天我们看看MySQL操作之JSON数据类型的相关内容。
概述
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;
mysql 字符串转数组
这个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数据的获取⽅法,参照官⽅链接
创建索引
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 > 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 Name Description
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
总结
以上就是本⽂关于MySQL操作之JSON数据类型操作详解的全部内容,希望对⼤家有所帮助。感兴趣的朋友可以继续参阅本站:、、等,如有不⾜之处,欢迎留⾔指出,⼩编会及时回复⼤家并进⾏修改,努⼒为⼴⼤编程爱好及⼯作者提供更好的⽂章和阅读体验。下⾯推荐⼏本跟MySQL操作有关的书籍,供⼤家参考:
MySQL数据库应⽤从⼊门到精通(第2版) PDF扫描版
MySQL5 权威指南(第3版)中⽂版 PDF扫描版

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。