1. 程式人生 > >MySQL json 型別操作快速入門

MySQL json 型別操作快速入門

MySQL 5.7.8開始支援 json型別.

create table t(id int,js json,PRIMARY KEY (`id`))

插入資料
insert into t values(1,'{"a":1,"s":"abc"}')
insert into t values(2,'[1,2,{"a":123}]')
insert into t values(3,'"str"')
insert into t values(4,'123')

直接提供字串即可。還可以用JSON_Array和JSON_Object函式來構造
insert into t values(5,JSON_Object('key1',v1,'key2',v2))
insert into t values(4,JSON_Array(v1,v2,v3))

JSON_OBJECT([key, val[, key, val] ...])
JSON_ARRAY([val[, val] ...])


JSON_SET(json_doc, path, val[, path, val] ...)
修改資料

update t set js=json_set('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') where id=1

結果js={"a":456,"s":"abc","b":"bbb"}

path中$就代表整個doc,然後可以用JavaScript的方式指定物件屬性或者陣列下標等.
執行效果,類似json的語法
$.a=456
$.b="bbb"

存在就修改,不存在就設定.

$.c.c=123
這個在javascript中會出錯,因為.c為null。
但是在json_set('{}','$.c.c',123)中,不存在的路徑將直接被忽略。

特殊的對於陣列,如果目標doc不是陣列則會被轉換成[doc],然後再執行set,
如果set的下標超過陣列長度,只會新增到陣列結尾。

select json_set('{"a":456}','$[1]',123)
結果[{"a":456},123]。目標現被轉換成[{"a":456}],然後應用$[1]=123。

select json_set('"abc"','$[999]',123)
結果["abc",123]。

再舉幾個例子
select json_set('[1,2,3]','$[0]',456,'$[3]','bbb')
結果[456,2,3,'bbb']

注意:
對於javascript中
var a=[1,2,3]
a.a='abc'
是合法的,但是一旦a轉成json字串,a.a就丟失了。

而在mysql中,這種算作路徑不存在,因此
select json_set('[1,2,3]','$.a',456)
結果還是[1,2,3]

然後還有另外兩個版本
JSON_INSERT(json_doc, path, val[, path, val] ...)
如果不存在對應屬性則插入,否則不做任何變動

JSON_REPLACE(json_doc, path, val[, path, val] ...)
如果存在則替換,否則不做任何變動

這兩個操作倒是沒有javascript直接對應的操作
select json_insert('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
結果{"a":1,"s":"abc","b":"bbb"}

select json_replace('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
結果{"a":456,"s":"abc"}

加上刪除節點
JSON_REMOVE(json_doc, path[, path] ...)
如果存在則刪除對應屬性,否則不做任何變動
select json_replace('{"a":1,"s":"abc"}','$.a','$.b')
結果{"s":"abc"}

涉及陣列時,三個函式與json_set基本一樣
select json_insert('{"a":1}','$[0]',456)
結果不變,認為0元素已經存在了,注意這裡結果不是[{"a":1}]

select json_insert('{"a":1}','$[999]',456)
結果追加到陣列結尾[{"a":1},456]


select json_replace('{"a":1}','$[0]',456)
結果456!而非[456]

select json_replace('{"a":1}','$[1]',456)
結果不變。

其實對於json_insert和json_replace來說一般情況沒必要針對陣列使用。


select json_remove('{"a":1}','$[0]')
結果不變!

select json_remove('[{"a":1}]','$[0]')
結果[]

總之涉及陣列的時候要小心。


JSON_MERGE(json_doc, json_doc[, json_doc] ...)
將多個doc合併

select json_merge('[1,2,3]','[4,5]')
結果[1,2,3,4,5]。陣列簡單擴充套件

select json_merge('{"a":1}','{"b":2}')
結果{"a":1,"b":2}。兩個物件直接融合。

特殊的還是在陣列
select json_merge('123','45')
結果[123,45]。兩個常量變成陣列

select json_merge('{"a":1}','[1,2]')
結果[{"a":1},1,2]。目標碰到陣列,先轉換成[doc]

select json_merge('[1,2]','{"a":1}')
結果[1,2,{"a":1}]。非陣列都追加到陣列後面。

JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
給指定的節點,新增元素,如果節點不是陣列,則先轉換成[doc]

select json_Array_append('[1,2]','$','456')
結果[1,2,456]

select json_Array_append('[1,2]','$[0]','456')
結果[[1,456],2]。指定插在$[0]這個節點,這個節點非陣列,所以等效為
select json_Array_append('[[1],2]','$[0]','456')


JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
在陣列的指定下標處插入元素

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[1]',4)
結果[1,4,2,3]。在$陣列的下標1處插入

SELECT JSON_ARRAY_INSERT('[1,[1,2,3],3]','$[1][1]',4)
結果[1,[1,4,2,3],3]。在$[1]陣列的下標1處插入

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[0]',4,'$[1]',5)
結果[4,5,1,2,3]。注意後續插入是在前面插入基礎上的,而非[4,1,5,2,3]

提取json資訊的函式
JSON_KEYS(json_doc[, path])
返回指定path的key

select json_keys('{"a":1,"b":2}')
結果["a","b"]

select json_keys('{"a":1,"b":[1,2,3]}','$.b')
結果null。陣列沒有key

JSON_CONTAINS(json_doc, val[, path])
是否包含子文件

select json_contains('{"a":1,"b":4}','{"a":1}')
結果1

select json_contains('{"a":2,"b":1}','{"a":1}')
結果0

select json_contains('{"a":[1,2,3],"b":1}','[1,2]','$.a')
結果1。陣列包含則需要所有元素都存在。

select json_contains('{"a":[1,2,3],"b":1}','1','$.a')
結果1。元素存在陣列元素中。


JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
檢查路徑是否存在

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'one','$.a','$.c')
結果1。只要存在一個

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'all','$.a','$.c')
結果0。必須全部存在。


select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.b.c.d')
結果1。

select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.a.c.d')
結果0。


JSON_EXTRACT(json_doc, path[, path] ...)
獲得doc中某個或多個節點的值。

select json_extract('{"a":1,"b":2}','$.a')
結果1

select json_extract('{"a":[1,2,3],"b":2}','$.a[1]')
結果2


select json_extract('{"a":{"a":1,"b":2,"c":3},"b":2}','$.a.*')
結果[1,2,3]。a.*通配a所有屬性的值返回成陣列。


select json_extract('{"a":{"a":1,"b":2,"c":3},"b":4}','$**.b')
結果[2,4]。通配$中所有層次下的屬性b的值返回成陣列。

mysql5.7.9開始增加了一種簡寫方式:column->path

select id,js->'$.id' from t where js->'$.a'=1 order by js->'$.b'
等價於
select id,json_extract(js,'$.id') 
from t where json_extract(js,'$.a')=1
order by json_extract(js,'$.b')

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
強大的查詢函式,用於在doc中返回符合條件的節點,select則是在表中返回符合要求的紀錄。

select json_search('{"a":"abc","b":{"c":"dad"}}','one','%a%')

結果$.a。和like一樣可以用%和_匹配,在所有節點的值中匹配,one只返回一個。

select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%')
結果["$.a","$.b.c"]


select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%',null,'$.b')
結果["$.b.c"]。限制查詢範圍。

select json_search('{"a":"abc","b":{"c":"dad"},"c":{"b":"aaa"}}','all','%a%',null,'$**.b')
結果["$.b.c","$.c.b"]。查詢範圍還可使用萬用字元!在每個匹配節點和其下查詢。


注意,只有json_extract和json_search中的path才支援通配,其他json_set,json_insert等都不支援。


JSON_LENGTH(json_doc[, path])
返回陣列的長度,如果是object則是屬性個數,常量則為1

select json_length('[1,2,3]')
結果3

select json_length('123')
結果1

select json_length('{"a":1,"b":2}')
結果2

可再跟path引數
select json_length('{"a":1,"b":[1,2,3]}','$.b')
結果3


JSON_DEPTH(json_doc)
返回doc深度


select json_depth('{}'),json_depth('[]'),json_depth('123')
結果1,1,1

select json_depth('[1,2,3,4,5,6]')
結果2

select json_depth('{"a":{"b":{"c":1}}}')
結果4

相關推薦

MySQL json 型別操作快速入門

MySQL 5.7.8開始支援 json型別. create table t(id int,js json,PRIMARY KEY (`id`)) 插入資料 insert into t values(1,'{"a":1,"s":"abc"}') insert int

mysql json型別操作

基於 mysql  5.7 插入 JSON  INSERT INTO `lnmp` (category, tags) VALUES ('{"id": 1, "name": "lnmp.cn"}', '[1, 2, 3]'); 更新 JSON JSON_IN

mysql json型別快速入門

 MySQL 5.7.8開始支援 json型別. create table t(id int,js json,PRIMARY KEY (`id`)) 插入資料 insert into t values(1,'{"a":1,"s":"abc"}') insert int

MySQL JSON 型別資料操作

1、Java 中動態擴充套件欄位,會導致資料庫表被鎖,在MySQL 5.7.8版本之前,因為MySQL不能直接操作JSON型別資料,可以將一個欄位設定成varchar型別,裡面存放JSON格式資料,這樣在需要擴充套件欄位時,不需要修改表結構; 2、mysql自5.7.8版本開始,就支援了json結構的資

MongoDb的基本操作快速入門

基本操作 mongodb mongodb增刪該查操作示例 mongodb快速入門 1.MongoDb簡介 mongodb是一個基於分布式存儲的開源數據庫系統又被稱為文檔數據庫,可以將數據存儲為一個文檔,數據結構有鍵值對(key=>value)對組成,存儲的文檔類似於JSON對象(BS

MySQL資料庫基本操作知識------入門第二天

第二天啦。 解決中文亂碼問題:(資料庫(伺服器)使用utf8字符集,命令列(客戶端)使用gbk字符集時,亂碼) set names gbk  一些小細節:如果想退出當前語句:(反斜槓+c) 跳出執行 一些常見的報錯: 錯誤一:   這個報錯是:主鍵重複了。 

SVN客戶端服務端安裝、操作快速入門

在linux伺服器上安裝SVN 一、安裝SVN 用命令檢視是否安裝 svnserve --version 表示安裝成功,如果出現command not found,執行 yum install -y subversion 再用命令,檢查是否安裝成功 svn

mysql 資料庫快速入門 DML資料操作語言

目錄 DML:資料操作語言 檢視資料庫編碼 插入操作 更新操作 刪除操作 DML:資料操作語言 用來定義資料庫記錄(資料)DML是對表中的資料進行增、刪、改的操作。不要與DDL混淆了。 關鍵字:INSERT 、UPDATE、 DELETE 小知識:

mysql 資料庫快速入門 DDL:操作資料庫、表、列等

DDL:資料庫定義語言 用來定義資料庫物件:庫、表、列等。 使用的關鍵字:CREATE、 ALTER、 DROP 操作資料庫 建立資料庫 Create database mydb1; Create database mydb2 character set gbk; Creat

mysql 資料庫快速入門 MySQL的資料型別

目錄 MySQL 資料型別 數值型別 字串(字元)型別 日期/時間型別 MySQL 資料型別 MySQL支援所有標準SQL數值資料型別。 資料欄位的型別對資料庫的優化是非常重要的,合理的使用資料型別,對資料庫的真來說都是有益的。 MySQL支援多種型別,大致可以分

mysql 5.7 新特性之 json 型別 基本操作

近幾年來,nosql大行其道,json更是火的一塌糊塗,作為資料庫的元老,mysql在5.7版本中添加了對json資料的支援。這片部落格主要記錄對mysql json型別的學習筆記和總結心得。首先建立一個數據庫learnjson,並建立一張表json_start:create

JSON快速入門

面積 單獨 不同 ati scala 運行 字符串 互聯 所有 http://www.json.org/ documnt:http://stleary.github.io/JSON-java/index.html JSON快速入門(Java版)http://www.im

npm 與 package.json 快速入門

含義 all 裝包 針對 工作過程 sym demo ejs 直接 npm 是前端開發廣泛使用的包管理工具,之前使用 Weex 時看了阮一峰前輩的文章了解了一些,這次結合官方文章總結一下,加深下理解吧! 讀完本文你將了解: 什麽是 npm 安裝 npm

Spring Boot快速入門(五):使用MyBatis(註解形式)進行數據庫操作

訪問 ins name ont clas assert xxx main apach 原文地址:https://lierabbit.cn/articles/7 添加依賴 新建項目選擇web,MyBatis,MySQL三個依賴 對於已存在的項目可以在bulid.gradle

MySQL快速入門筆記(win平臺)

str baidu windows服務 所有 出現 mysql 使用 刪除 現在 課程 : 阿裏雲課堂 MySQL數據庫入門學習 https://edu.aliyun.com/course/153 主要是感覺做筆記看的快.. 阿裏雲公益人才培養,了解一下? https:/

JQuery快速入門-操作元素的屬性和樣式

dcl 顯示 實現 節點 ali 文本 屬性。 另一個 增加 我們在學習JavaScript時,詳細介紹了DOM對象。從DOM樹可以得知,對DOM的操作,主要包括:元素的屬性、內容、值、CSS。 一、元素屬性的操作 在 jQuery 中,可以對元素的屬性執行獲取、設置、

【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6)

c項目 教程 建數據庫 因此 F5 ctr 文件頭部 lec 跨站請求偽造 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門之安全

C#操作Sqlite快速入門及相關工具收集

收集 html urn net sel 2.3 dbn .org .sh Sqlite不需要安裝即可使用。Sqlite是不是那個System.Data.SQLite.DLL臨時創建了數據庫引擎?1.新建一個WinForm項目,引用System.Data.SQLite.DLL

npm 與 package.json 快速入門教程

span out variable toc 管理器 gen 生產環境 格式 加載 npm 與 package.json 快速入門教程 2017年08月02日 19:16:20 閱讀數:33887 npm 是前端開發廣泛使用的包管理工具,之前使用 Weex 時看

mysql快速入門

ant 連接mysql apt-get 安裝和使用 name cli varchar esc 增加 最近想使用c語言寫一個聊天的系統,所以看了一看mysql。看到過程中不斷的總結,就寫了一些東西。 說明一下,我使用的系統是ubuntu18.04, linux下mysql的安