激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL5.7中的JSON基本操作指南

MySQL5.7中的JSON基本操作指南

2020-09-16 20:28南丞_ Mysql

這篇文章主要給大家介紹了關于MySQL5.7中JSON的基本操作,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Mysql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

因為項目需要,存儲字段存儲成了JSON格式,在項目中是將查詢出來的值通過jackson轉成相應的bean進行處理的,覺得不夠簡單方便。

MySQL從5.7版本開始就支持JSON格式的數據,操作用起來挺方便的。

建表

在新建表時字段類型可以直接設置為json類型,比如我們創建一張表:

?
1
mysql> CREATE TABLE `test_user`(`id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `info` JSON);

json類型字段可以為NULL

插入數據:

?
1
mysql> INSERT INTO test_user(`name`, `info`) VALUES('xiaoming','{"sex": 1, "age": 18, "nick_name": "小萌"}');

json類型的字段必須時一個有效的json字符串

可以使用JSON_OBJECT()函數構造json對象:

?
1
mysql> INSERT INTO test_user(`name`, `info`) VALUES('xiaohua', JSON_OBJECT("sex", 0, "age", 17));

使用JSON_ARRAY()函數構造json數組:

?
1
mysql> INSERT INTO test_user(`name`, `info`) VALUES('xiaozhang', JSON_OBJECT("sex", 1, "age", 19, "tag", JSON_ARRAY(3,5,90)));

現在查看test_user表中的數據:

?
1
2
3
4
5
6
7
8
9
mysql> select * from test_user;
+----+-----------+--------------------------------------------+
| id | name | info     |
+----+-----------+--------------------------------------------+
| 1 | xiaoming | {"age": 18, "sex": 1, "nick_name": "小萌"} |
| 2 | xiaohua | {"age": 17, "sex": 0}   |
| 3 | xiaozhang | {"age": 19, "sex": 1, "tag": [3, 5, 90]} |
+----+-----------+--------------------------------------------+
3 rows in set (0.04 sec)

查詢

表達式: 對象為json列->'$.鍵', 數組為json列->'$.鍵[index]'

?
1
2
3
4
5
6
7
8
9
mysql> select name, info->'$.nick_name', info->'$.sex', info->'$.tag[0]' from test_user;
+-----------+---------------------+---------------+------------------+
| name | info->'$.nick_name' | info->'$.sex' | info->'$.tag[0]' |
+-----------+---------------------+---------------+------------------+
| xiaoming | "小萌"  | 1  | NULL  |
| xiaohua | NULL  | 0  | NULL  |
| xiaozhang | NULL  | 1  | 3  |
+-----------+---------------------+---------------+------------------+
3 rows in set (0.04 sec)

等價于:對象為JSON_EXTRACT(json列 , '$.鍵') ,數組為JSON_EXTRACT(json列 , '$.鍵[index]')

?
1
2
3
4
5
6
7
8
9
mysql> select name, JSON_EXTRACT(info, '$.nick_name'), JSON_EXTRACT(info, '$.sex'), JSON_EXTRACT(info, '$.tag[0]') from test_user;
 +-----------+-----------------------------------+-----------------------------+--------------------------------+
| name | JSON_EXTRACT(info, '$.nick_name') | JSON_EXTRACT(info, '$.sex') | JSON_EXTRACT(info, '$.tag[0]')
| +-----------+-----------------------------------+-----------------------------+--------------------------------+
| xiaoming | "小萌"    | 1    | NULL    |
| xiaohua | NULL    | 0    | NULL    |
| xiaozhang | NULL    | 1    | 3    |
+-----------+-----------------------------------+-----------------------------+--------------------------------+
3 rows in set (0.04 sec)

不過看到上面"小萌"是帶雙引號的,這不是我們想要的,可以用JSON_UNQUOTE函數將雙引號去掉

?
1
2
3
4
5
6
7
mysql> select name, JSON_UNQUOTE(info->'$.nick_name') from test_user where name='xiaoming';
+----------+-----------------------------------+
| name | JSON_UNQUOTE(info->'$.nick_name') |
+----------+-----------------------------------+
| xiaoming | 小萌    |
+----------+-----------------------------------+
1 row in set (0.05 sec)

也可以直接使用操作符->>

?
1
2
3
4
5
6
7
mysql> select name, info->>'$.nick_name' from test_user where name='xiaoming';
+----------+----------------------+
| name | info->>'$.nick_name' |
+----------+----------------------+
| xiaoming | 小萌   |
+----------+----------------------+
1 row in set (0.06 sec)

當然屬性也可以作為查詢條件

?
1
2
3
4
5
6
7
mysql> select name, info->>'$.nick_name' from test_user where info->'$.nick_name'='小萌';
+----------+----------------------+
| name | info->>'$.nick_name' |
+----------+----------------------+
| xiaoming | 小萌   |
+----------+----------------------+
1 row in set (0.05 sec)

值得一提的是,可以通過虛擬列對JSON類型的指定屬性進行快速查詢。

創建虛擬列:

?
1
mysql> ALTER TABLE `test_user` ADD `nick_name` VARCHAR(50) GENERATED ALWAYS AS (info->>'$.nick_name') VIRTUAL;

注意用操作符->>

使用時和普通類型的列查詢是一樣:

?
1
2
3
4
5
6
7
mysql> select name,nick_name from test_user where nick_name='小萌';
+----------+-----------+
| name  | nick_name |
+----------+-----------+
| xiaoming | 小萌  |
+----------+-----------+
1 row in set (0.05 sec)

更新

使用JSON_INSERT()插入新值,但不會覆蓋已經存在的值

?
1
mysql> UPDATE test_user SET info = JSON_INSERT(info, '$.sex', 1, '$.nick_name', '小花') where id=2;

看下結果

?
1
2
3
4
5
6
7
mysql> select * from test_user where id=2;
+----+---------+--------------------------------------------+-----------+
| id | name | info          | nick_name |
+----+---------+--------------------------------------------+-----------+
| 2 | xiaohua | {"age": 17, "sex": 0, "nick_name": "小花"} | 小花  |
+----+---------+--------------------------------------------+-----------+
1 row in set (0.06 sec)

使用JSON_SET()插入新值,并覆蓋已經存在的值

?
1
mysql> UPDATE test_user SET info = JSON_INSERT(info, '$.sex', 0, '$.nick_name', '小張') where id=3;

看下結果

?
1
2
3
4
5
6
7
mysql> select * from test_user where id=3;
+----+-----------+---------------------------------------------------------------+-----------+
| id | name  | info               | nick_name |
+----+-----------+---------------------------------------------------------------+-----------+
| 3 | xiaozhang | {"age": 19, "sex": 1, "tag": [3, 5, 90], "nick_name": "小張"} | 小張  |
+----+-----------+---------------------------------------------------------------+-----------+
1 row in set (0.06 sec)

使用JSON_REPLACE()只替換存在的值

?
1
mysql> UPDATE test_user SET info = JSON_REPLACE(info, '$.sex', 1, '$.tag', '[1,2,3]') where id=2;

看下結果

?
1
2
3
4
5
6
7
mysql> select * from test_user where id=2;
+----+---------+--------------------------------------------+-----------+
| id | name | info          | nick_name |
+----+---------+--------------------------------------------+-----------+
| 2 | xiaohua | {"age": 17, "sex": 1, "nick_name": "小花"} | 小花  |
+----+---------+--------------------------------------------+-----------+
1 row in set (0.06 sec)

可以看到tag沒有更新進去

刪除

使用JSON_REMOVE()刪除JSON元素

?
1
mysql> UPDATE test_user SET info = JSON_REMOVE(info, '$.sex', '$.tag') where id=1;

看下結果

?
1
2
3
4
5
6
7
mysql> select * from test_user where id=1;
+----+----------+----------------------------------+-----------+
| id | name  | info        | nick_name |
+----+----------+----------------------------------+-----------+
| 1 | xiaoming | {"age": 18, "nick_name": "小萌"} | 小萌  |
+----+----------+----------------------------------+-----------+
1 row in set (0.05 sec)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。

原文鏈接:https://segmentfault.com/a/1190000018612255

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品亚洲三区 | 中文字幕一区二区三区四区 | www.av520| 12av电影| 欧美黑大粗硬毛片视频 | 49vvv| 成年人免费高清视频 | 黄色片免费看看 | 泰剧19禁啪啪无遮挡大尺度 | 午夜精品一区二区三区免费 | 亚洲午夜电影 | 特级黄色影院 | 一级一级一级毛片 | 特级无码毛片免费视频尤物 | 欧美国产第一页 | 欧美色性 | 欧美一级高潮片免费的 | 亚洲成人免费影视 | 激情小说色| 欧美 日韩 国产 成人 | 91九色网址 | 日韩精品一区二区亚洲 | 关键词| 成年毛片 | 欧美成人毛片 | 12av毛片| 亚洲成年人免费网站 | 国产亚洲黑人性受xxxx精品 | 欧美另类综合 | 国产午夜精品在线 | 亚洲福利在线视频 | 亚洲精品tv久久久久久久久久 | 色综合久久久久综合99 | 一级免费黄色 | 法国性xxx精品hd | 操碰在线视频 | 成年免费大片黄在线观看岛国 | 欧美偷拍一区二区 | 激情视频日韩 | 久久综合伊人 | 爽爽视频免费看 |