MySQL8.0新特性_01_JSON数据格式的支持

1. JSON语法规则

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

JSON 名称/值对

JSON 数据的书写格式是:{Key:Value}{Key:Array}

{Key:Value},前面是键,中间是英文的“:”(冒号),然后是值。但是注意的是如果是字符串,严格来说都是英文双引号引起来的。

如:{"Key":"Value"}

{"name" : "鹿晗"}   等价于  name = "鹿晗"

JSON 值范围

  • 数字 (整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(truefalse
  • 数组 (在方括号[]中)
  • 对象 (在花括号{}中)
  • null

JSON 对象

JSON 对象在花括号中,对象可以包含多个名称/值对,如下代码所示:

{
    "name": "鹿晗",
    "age": 26,
    "birthday": "1990年4月20日",
}

这一点也容易理解,与这条 JavaScript 语句等价:

name = "鹿晗";
age = 26;
birthday = "1990年4月20日";

JSON 数组

JSON数组在方括号("[]")中书写,数组可包含多个对象,如下“star_male”描述

{
    "star_male": [
        {
            "name": "鹿晗",
            "age": "26"
        },
        {
            "nickname": "李易峰",
            "age": "29"
        },
        {
            "nickname": "陈赫",
            "lastName": "31"
        }
    ]
}

在上面的例子中,对象 "star_male" 是包含三个对象的数组。每个对象代表一条关于一个明星(姓名和年龄)的记录。

2.JSON基础函数应用:增、删、改、查

创建json的表

use test;
CREATE TABLE t_json(id INT PRIMARY KEY, sname VARCHAR(20) , info  JSON);
desc t_json;

插入记录

-- 插入含有json数组的记录  数组格式
INSERT INTO t_json(id,sname,info) VALUES( 1, 'name1', JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()));    # CURTIME() 时间函数 20:24:23.000000

-- 插入含有json对象的记录  使用最多的。
INSERT INTO t_json(id,sname,info) VALUES( 2, 'name2', JSON_OBJECT("age", 20, "time", now()));    # now()时间函数的值 2020-11-22 20:26:06.000000
INSERT INTO t_json(id,sname,info) VALUES( 3, 'name3', '{"age":20, "time":"2020-11-22 20:34:00"}');  #对象类型使用居多

查询记录

-- 查询全部的数据
mysql> select * from t_json;
+----+-------+---------------------------------------------------+
| id | sname | info                                              |
+----+-------+---------------------------------------------------+
|  1 | name1 | [1, "abc", null, true, "20:24:23.000000"]         |
|  2 | name2 | {"age": 20, "time": "2020-11-22 20:26:06.000000"} |
|  3 | name3 | {"age": 20, "time": "2020-11-22 20:34:00"}        |
+----+-------+---------------------------------------------------+
3 rows in set (0.01 sec)

-- 查询记录
SELECT sname,JSON_EXTRACT(info,'$.age') FROM t_json;   # 使用函数居多

SELECT sname,info->'$.age' FROM t_json;
-- 查询key
SELECT id,json_keys(info) FROM t_json;

修改记录

-- 增加键
UPDATE t_json SET info = json_set(info,'$.ip','192.168.1.1') WHERE id = 2;
-- 变更值
UPDATE t_json SET info = json_set(info,'$.ip','192.168.1.2') WHERE id = 2;   
-- 删除键
UPDATE t_json SET info = json_remove(info,'$.ip') WHERE id = 2;

# 说明:
正常的mysql的语句 UPDATE t_json SET info = 
json_set     说明的是  当info字段中没有ip这列的时候,增加一列值 ,如果有列和值的话,修改这列的值。 条件为2的行数
json_remove  说明的是  删除ip这列和值。 条件为2的行数

和set 相关的还有一个 json_replace 有的话就替换,没有的就不操作。
posted @ 2020-11-22 21:16  oldliych  阅读(2034)  评论(0编辑  收藏  举报