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.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結構的資

mysql json型別操作

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

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

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

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

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

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

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的安

JSON快速入門(Java版)

1.JSON          JSON簡介: 是一種輕量級的資料交換格式。它基於 ECMAScript (歐洲計算機協會制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和

SQL快速入門 ( MySQL快速入門 , MySQL參考 )

SQL 先說點廢話,很久沒發文了,整理了下自己當時入門 SQL 的筆記,無論用於入門,回顧,參考查詢,應該都是有一定價值的,可以按照目錄各取所需。SQL資料庫有很多,MySQL是一種,本文基本都是SQL通用標準,有些標準很不統一的地方就用MySQL的寫法了。希望本文幫你快速瞭解SQL的基本操作和概念。 目錄

scala開發快速入門 | 第二篇 變數及基本資料型別

一、宣告值和變數 Scala中有兩種型別的變數。 一種是val,是不可變的,在宣告時就必須被初始化,而且初始化以後就不能再賦值;另一種是var,是可變的,宣告的時候需要進行初始化,初始化以後還可以再次對其賦值。 Note:在專案的開發中建議使用val 也就是常量

mysql 資料庫快速入門 資料的完整性

目錄 資料的完整性 完整性的分類 實體完整性 實體完整性約束分類 主鍵約束(primary key)   唯一約束(unique) 自動增長列(auto_increment) 域完整性 域完整性約束分類  資料型別:(數值型別、日期型別、字

mysql 資料庫快速入門 DCL:資料控制語言

目錄 DCL(Data Control Language,DCL):資料控制語言 GRANT   定義許可權 語法格式 示例 REVOKE 收回許可權 語法格式 示例 DCL(Data Control Language,DCL):資料控制語言

mysql 資料庫快速入門 DQL資料查詢語言

目錄 DQL:資料查詢語言 關鍵字:SELECT 基礎查詢 條件查詢 模糊查詢 欄位控制查詢 求和查詢 IFNULL處理 欄位別名查詢 排序查詢 升序 降序 混合排序 聚合函式  sum avg max min count

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 資料庫快速入門 結構化查詢語言SQL

目錄 結構化查詢語言SQL 標準支援 SQL的影響 語言特點 語句結構 結構化查詢語言SQL 結構化查詢語言(Structured Query Language)簡稱SQL。 一種特殊目的的程式語言:是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更

mysql 資料庫快速入門 資料庫匯出和備份

生成SQL指令碼  匯出資料 在控制檯使用mysqldump命令可以用來生成指定資料庫的指令碼文字,但要注意,指令碼文字中只包含資料庫的內容,而不會存在建立資料庫的語句!所以在恢復資料時,還需要自已手動建立一個數據庫之後再去恢復資料。 注意,mysqldump命令是在Wi