目錄
對json資料進行查詢及修改
幾個相關函數
範例
查詢
來看看修改
刪除
插入
Mysql處理json資料
首頁 資料庫 mysql教程 Mysql怎麼對json資料進行查詢及修改

Mysql怎麼對json資料進行查詢及修改

Jun 02, 2023 pm 08:19 PM
mysql json

    對json資料進行查詢及修改

    • #使用欄位->'$.json屬性' 進行查詢條件

    • 使用json_extract 函數查詢,json_extract(字段, "$.json屬性")

    • 根據json數組查詢,用JSON_CONTAINS(字段, JSON_OBJECT( 'json屬性', "內容")) : [{}]查詢這種形式的json數組

    • #MySQL5.7以上支援JSON的操作,以及增加了JSON儲存類型

    • 一般資料庫儲存JSON類型的資料會用JSON類型或TEXT類型

    幾個相關函數

    Mysql怎麼對json資料進行查詢及修改

    範例

    Mysql怎麼對json資料進行查詢及修改

    我這裡沒有建立json的欄位格式,而是使用了text儲存json 。

    請注意:若要使用JSON類型,則列儲存的資料必須是符合JSON格式,否則會導致錯誤。 2)JSON資料型態是沒有預設值的。

    插入json格式的資料到這一列:

    {"age": "28", "pwd": "lisi", "name": "李四"}
    登入後複製

    查詢

    1、

    select * from `offcn_off_main` where json_extract(json_field,"$.name") = '李四'
    登入後複製

    2、

    select * from `offcn_off_main` where json_field->'$.name' = '李四'
    登入後複製

    使用explain可以查看到無法使用索引。

    所以需要修改:

    mysql原生並不支援json列中的屬性索引,但是我們可以透過mysql的虛擬列間接的為json中的某些屬性建立索引,原理就是為json中的屬性建立虛擬列,然後透過給虛擬列建立索引,從而間接的給屬性建立了索引。

    在MySQL 5.7中,支援兩種Generated Column,即Virtual Generated Column和Stored Generated Column,前者只將Generated Column保存在資料字典中(表的元資料),並不會將這一列數據持久化到磁碟上;後者會將Generated Column持久化到磁碟上,而不是每次讀取的時候計算所得。很明顯,後者存放了可以透過已有數據計算而得的數據,需要更多的磁碟空間,與Virtual Column相比並沒有優勢----(其實我覺得還是有優勢畢竟會少一些查詢計算)

    因此,MySQL 5.7中,不指定Generated Column的類型,預設是Virtual Column。

    如果需要Stored Generated Golumn的話,可能在Virtual Generated Column上建立索引更加合適,一般情況下,都使用Virtual Generated Column,這也是MySQL預設的方式。

    格式如下:

    fieldname <type> [ GENERATED ALWAYS ] AS ( <expression> ) [ VIRTUAL|STORED ] [ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ]
    登入後複製

    所以我在這裡:

    ALTER TABLE &#39;off_main&#39; `names_virtual` VARCHAR(20) GENERATED ALWAYS AS (`json_field` ->> &#39;$.name&#39;) not null;
    登入後複製

    請注意:可以使用"»"運算子來引用JSON欄位中的鍵(KEY)。在本例中,虛擬欄位names_virtual已被定義為不可為空。在實際的工作中,一定要集合具體的情況來定。因為JSON本身就是一種弱結構的資料對象。也就是說的它的結構不是固定不變的。

    為虛擬欄位增加索引:

    CREATE INDEX `names` ON `off_main`(`names_virtual`);
    登入後複製

    注意如果虛擬欄位並不是建立表格是新增的,而是後面加的,增加索引時如果有的行中虛擬欄位為null,但是又設定了它不能為null,那麼索引無法創建成功,提示column can not be null.

    增加索引後explain看下即可看到用到了索引,並且虛擬字段的值會隨著json欄位的屬性修改而自動變更。

    來看看修改

    update off_main set json_field = json_set(json_field,&#39;$.phone&#39;, &#39;132&#39;) WHERE id = 45 
    //同时修改多个
    UPDATE offcn_off_main set json_field = json_set(json_field,&#39;$.name&#39;,456,&#39;$.age&#39;,&#39;bbb&#39;) WHERE id = 45
    登入後複製

    json_set() 方法存在的則會覆寫,不存在的會新增。

    刪除

    UPDATE offcn_off_main set json_field = json_remove(json_field,&#39;$.pwd&#39;,&#39;$.phone&#39;) WHERE id = 45
    登入後複製

    插入

    UPDATE offcn_off_main set json_field = json_insert(json_field,&#39;$.pwd&#39;,&#39;111&#39;) WHERE id = 45
    登入後複製

    insert與update不同之處在於insert不存在的會增加,存在的不會覆蓋

    Mysql處理json資料

    1.如果資料量小的話,將json資料直接複製到mysql的json欄位中,如果資料過大可以透過java等後台形式對json資料解析,然後寫入資料庫。

    查詢操作 

    select *,json->&#39;$.features[0].geometry.rings&#39; as rings from JSON;
    登入後複製

    從一張表讀取一部分資料存入另一張表中(一條資料)

    insert into DT_village(name, border) SELECT
      json->&#39;$.features[0].attributes.CJQYMC&#39;,json->&#39;$.features[0].geometry.rings&#39;
    from JSON;
    登入後複製

    讀取json資料並寫入資料庫(此時使用的是定義函數的形式來執行方法,可以定義便量)

    #清空数据库
    TRUNCATE table DT_village;
     
    #定义存储过程
    delimiter //
    DROP PROCEDURE IF EXISTS insert_test_val;
    ##num_limit 要插入数据的数量,rand_limit 最大随机的数值
    CREATE PROCEDURE insert_test_val()
      BEGIN
     
        DECLARE i int default 0;
        DECLARE a,b varchar(5000);
     
        WHILE i<10 do
          set a=CONCAT(&#39;$.features[&#39;,i,&#39;].attributes.CJQYMC&#39;);
          set b=CONCAT(&#39;$.features[&#39;,i,&#39;].geometry.rings&#39;);
          insert into DT_village(name, border) select
                  #json->&#39;$.features[0].attributes.CJQYMC&#39;,json->&#39;$.features[0].geometry.rings&#39;
                                                     # (json->a),(json->b)
       json_extract(json,a),json_extract(json,b)
          from JSON;
          set i = i + 1;
     
        END WHILE;
     
      END
    //
     
    #调用存储过程
    call insert_test_val();
    登入後複製

    呼叫遊標的方式來取得jsosn資料中的一行,並執行插入操作

    delimiter //
    drop procedure if exists StatisticStore;
    CREATE PROCEDURE StatisticStore()
      BEGIN
        #创建接收游标数据的变量
        declare j json;#存储json数据
        DECLARE i int default 0; #创建总数变量,记录执行次数,控制循环
        DECLARE a,b,c varchar(5000);#定义json数组中的某个数据的键值
     
        #创建结束标志变量
        declare done int default false;
        #创建游标
        declare cur cursor for select json from JSON where name = &#39;1&#39;;
        #指定游标循环结束时的返回值
        declare continue HANDLER for not found set done = true;
        #设置初始值
        set a=CONCAT(&#39;$.features[&#39;,i,&#39;].attributes.XZQDM&#39;);
        set b=CONCAT(&#39;$.features[&#39;,i,&#39;].attributes.XZQMC&#39;);
        set c=CONCAT(&#39;$.features[&#39;,i,&#39;]&#39;);
        #打开游标
        open cur;
        #开始循环游标里的数据
        read_loop:loop
          #根据游标当前指向的一条数据
          fetch cur into j;
          #判断游标的循环是否结束
          if done then
            leave read_loop;#跳出游标循环
          end if;
          #这里可以做任意你想做的操作
          WHILE i<11 do
            insert into dt_border(xzq_code,name,border) select
                                                               json_extract(j,a),json_extract(j,b),json_extract(j,c)
            from JSON;
            set i = i + 1;
          END WHILE;
          #结束游标循环
        end loop;
        #关闭游标
        close cur;
     
        #输出结果
        select j,i;
      END;
    #调用存储过程
    call StatisticStore();
    登入後複製

    以上是Mysql怎麼對json資料進行查詢及修改的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    AI Hentai Generator

    AI Hentai Generator

    免費產生 AI 無盡。

    熱門文章

    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳圖形設置
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您聽不到任何人,如何修復音頻
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25:如何解鎖Myrise中的所有內容
    4 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    MySQL:初學者的數據管理易用性 MySQL:初學者的數據管理易用性 Apr 09, 2025 am 12:07 AM

    MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

    忘記數據庫密碼,能在Navicat中找回嗎? 忘記數據庫密碼,能在Navicat中找回嗎? Apr 08, 2025 pm 09:51 PM

    Navicat本身不存儲數據庫密碼,只能找回加密後的密碼。解決辦法:1. 檢查密碼管理器;2. 檢查Navicat的“記住密碼”功能;3. 重置數據庫密碼;4. 聯繫數據庫管理員。

    navicat premium怎麼創建 navicat premium怎麼創建 Apr 09, 2025 am 07:09 AM

    使用 Navicat Premium 創建數據庫:連接到數據庫服務器並輸入連接參數。右鍵單擊服務器並選擇“創建數據庫”。輸入新數據庫的名稱和指定字符集和排序規則。連接到新數據庫並在“對象瀏覽器”中創建表。右鍵單擊表並選擇“插入數據”來插入數據。

    Navicat for MariaDB如何查看數據庫密碼? Navicat for MariaDB如何查看數據庫密碼? Apr 08, 2025 pm 09:18 PM

    Navicat for MariaDB 無法直接查看數據庫密碼,因為密碼以加密形式存儲。為確保數據庫安全,有三個方法可重置密碼:通過 Navicat 重置密碼,設置複雜密碼。查看配置文件(不推薦,風險高)。使用系統命令行工具(不推薦,需要對命令行工具精通)。

    navicat如何執行sql navicat如何執行sql Apr 08, 2025 pm 11:42 PM

    在 Navicat 中執行 SQL 的步驟:連接到數據庫。創建 SQL 編輯器窗口。編寫 SQL 查詢或腳本。單擊“運行”按鈕執行查詢或腳本。查看結果(如果執行查詢的話)。

    navicat怎麼新建連接mysql navicat怎麼新建連接mysql Apr 09, 2025 am 07:21 AM

    可在 Navicat 中通過以下步驟新建 MySQL 連接:打開應用程序並選擇“新建連接”(Ctrl N)。選擇“MySQL”作為連接類型。輸入主機名/IP 地址、端口、用戶名和密碼。 (可選)配置高級選項。保存連接並輸入連接名稱。

    mysql:簡單的概念,用於輕鬆學習 mysql:簡單的概念,用於輕鬆學習 Apr 10, 2025 am 09:29 AM

    MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

    Navicat 無法連接 MySQL/MariaDB/PostgreSQL 等數據庫的解決方法 Navicat 無法連接 MySQL/MariaDB/PostgreSQL 等數據庫的解決方法 Apr 08, 2025 pm 11:00 PM

    Navicat 無法連接數據庫的常見原因及其解決方法:1. 檢查服務器運行狀態;2. 核對連接信息;3. 調整防火牆設置;4. 配置遠程訪問;5. 排除網絡問題;6. 檢查權限;7. 保障版本兼容性;8. 排除其他可能性。

    See all articles