再談MySQL JSON數據類型

本文首發微信公衆號《andyqian》。期待你的關注~

前言

眨眼間,有一小段時間沒有更新文章了。唉,又懶了..。你是否還記得,以前寫過的《說說 MySQL JSON 數據類型》這篇文章,在這篇文章中,咱們簡單的介紹了MySQL JSON函數。可是在實際操做中。還有更多的實用操做沒有介紹。如: JSON字符串如何搜索?如何獲取JSON字符串中特定的屬性?能不能批量替換JSON中特定key?等等。別急,咱們就在下面給出答案。mysql

數據準備

數據以下所示:sql

create table t_base_data(   
    id bigint(20) not null primary key auto_increment comment "主鍵",
    content json null comment "內容",
    created_at datetime null comment "建立時間",
    updated_at datetime null comment "修改時間"
) engine=innodb charset=utf8

-- 初始化數據:
INSERT INTO `t_base_data` (`id`, `content`, `created_at`, `updated_at`) VALUES ('1', '{\"blog\": \"www.andyqian.com\", \"name\": \"andyqian\"}', NULL, '2018-04-08 11:19:44');

操做數據庫版本:5.7.20數據庫

搜索

當咱們須要獲取JSON字符串中的某個key值時。咱們能夠經過以下方式:json

  1. 列名->key

以下所示:微信

mysql> select content->"$.blog" from t_base_data;
+--------------------+
| content->"$.blog"  |
+--------------------+
| "www.andyqian.com" |
+--------------------+
1 row in set (0.00 sec

2.列名->>key 爲提供轉義後的字符。
以下所示:app

mysql> select content->>"$.blog" from t_base_data;
+--------------------+
| content->>"$.blog" |
+--------------------+
| www.andyqian.com   |
+--------------------+
1 row in set (0.00 sec)
  1. JSON_EXTRACT 函數

函數:JSON_EXTRA(JSON串, 操做符)。
用途: 用戶提取JSON屬性。函數

使用例子:spa

mysql> SELECT JSON_EXTRACT('{"blog":"www.andyqian.com","name": "andyqian"}' ,'$.blog');
+--------------------------------------------------------------------------+
| JSON_EXTRACT('{"blog":"www.andyqian.com","name": "andyqian"}' ,'$.blog') |
+--------------------------------------------------------------------------+
| "www.andyqian.com"                                                       |
+--------------------------------------------------------------------------+
1 row in set (0.00 sec)

json_insert

在Java中,附加字符串,咱們一般可使用append()方法進行操在MySQL中,varchar數據類型,咱們也可使用concat函數進行追加。一樣的,在JSON操做中,MySQL也給咱們提供了對應的函數:JSON_INSERT。
使用例子以下:.net

mysql> set @info = '{"blog":"www.andyqian.com","name": "andyqian"}';
Query OK, 0 rows affected (0.00 sec)

mysql> select json_insert(@info,"$.email","andytohome@gmail.com");
+-----------------------------------------------------------------------------------+
| json_insert(@info,"$.email","andytohome@gmail.com")                               |
+-----------------------------------------------------------------------------------+
| {"blog": "www.andyqian.com", "name": "andyqian", "email": "andytohome@gmail.com"} |
+-----------------------------------------------------------------------------------+
1 row in set (0.01 sec)

這裏須要注意的是: 若是新增的屬性已存在。該屬性不會被新增。設計

json_replace

有了新增。在批量修改指定JSON內容的值時。替換可少不了。如今咱們介紹下面這個函數json_replace函數。
使用方法以下所示:

mysql> set @info = '{"blog":"www.andyqian.com","name": "andyqian"}';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT json_replace(@info, '$.name', "juqian");
+------------------------------------------------+
| json_replace(@info, '$.name', "juqian")        |
+------------------------------------------------+
| {"blog": "www.andyqian.com", "name": "juqian"} |
+------------------------------------------------+
1 row in set (0.00 sec)

這個語句的意思爲: 咱們須要替換

{"blog":"www.andyqian.com","name": "andyqian"}

中的name屬性的值爲juyuqian

注意: 上面咱們是直接使用key的名稱,來進行查找。其實。咱們還可使用角標的方式。進行查找。例如在上述語句中,咱們能夠將$.name修改成$[1] 也是能夠的。

json_remove

有了新增,替換,固然還少不了刪除了。下面咱們就介紹json_remove函數

mysql> select json_remove('{"blog":"www.andyqian.com","name": "andyqian"}' , '$.blog');
+--------------------------------------------------------------------------+
| json_remove('{"blog":"www.andyqian.com","name": "andyqian"}' , '$.blog') |
+--------------------------------------------------------------------------+
| {"name": "andyqian"}                                                     |
+--------------------------------------------------------------------------+
1 row in set (0.00 sec)

咱們只須要指定,須要remove的key值便可。

最後

若是對上面的JSON操做,以爲一會兒適應不過來。咱們能夠當作是在Java中操做fastjson來進行JSON操做同樣。就容易理解一些了。

相關閱讀:

說說Java日誌

說幾個拖垮系統的小細節!

淺談MySQL表結構設計

說說 MySQL JSON 數據類型

 

這裏寫圖片描述

 掃碼關注,一塊兒進步

我的博客: http://www.andyqian.com

相關文章
相關標籤/搜索