搜尋
首頁資料庫mysql教程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刪除
    MySQL中的存儲過程是什麼?MySQL中的存儲過程是什麼?May 01, 2025 am 12:27 AM

    存儲過程是MySQL中的預編譯SQL語句集合,用於提高性能和簡化複雜操作。 1.提高性能:首次編譯後,後續調用無需重新編譯。 2.提高安全性:通過權限控制限制數據表訪問。 3.簡化複雜操作:將多條SQL語句組合,簡化應用層邏輯。

    查詢緩存如何在MySQL中工作?查詢緩存如何在MySQL中工作?May 01, 2025 am 12:26 AM

    MySQL查詢緩存的工作原理是通過存儲SELECT查詢的結果,當相同查詢再次執行時,直接返回緩存結果。 1)查詢緩存提高數據庫讀取性能,通過哈希值查找緩存結果。 2)配置簡單,在MySQL配置文件中設置query_cache_type和query_cache_size。 3)使用SQL_NO_CACHE關鍵字可以禁用特定查詢的緩存。 4)在高頻更新環境中,查詢緩存可能導致性能瓶頸,需通過監控和調整參數優化使用。

    與其他關係數據庫相比,使用MySQL的優點是什麼?與其他關係數據庫相比,使用MySQL的優點是什麼?May 01, 2025 am 12:18 AM

    MySQL被廣泛應用於各種項目中的原因包括:1.高性能與可擴展性,支持多種存儲引擎;2.易於使用和維護,配置簡單且工具豐富;3.豐富的生態系統,吸引大量社區和第三方工具支持;4.跨平台支持,適用於多種操作系統。

    您如何處理MySQL中的數據庫升級?您如何處理MySQL中的數據庫升級?Apr 30, 2025 am 12:28 AM

    MySQL數據庫升級的步驟包括:1.備份數據庫,2.停止當前MySQL服務,3.安裝新版本MySQL,4.啟動新版本MySQL服務,5.恢復數據庫。升級過程需注意兼容性問題,並可使用高級工具如PerconaToolkit進行測試和優化。

    您可以使用MySQL的不同備份策略是什麼?您可以使用MySQL的不同備份策略是什麼?Apr 30, 2025 am 12:28 AM

    MySQL備份策略包括邏輯備份、物理備份、增量備份、基於復制的備份和雲備份。 1.邏輯備份使用mysqldump導出數據庫結構和數據,適合小型數據庫和版本遷移。 2.物理備份通過複製數據文件,速度快且全面,但需數據庫一致性。 3.增量備份利用二進制日誌記錄變化,適用於大型數據庫。 4.基於復制的備份通過從服務器備份,減少對生產系統的影響。 5.雲備份如AmazonRDS提供自動化解決方案,但成本和控制需考慮。選擇策略時應考慮數據庫大小、停機容忍度、恢復時間和恢復點目標。

    什麼是mySQL聚類?什麼是mySQL聚類?Apr 30, 2025 am 12:28 AM

    MySQLclusteringenhancesdatabaserobustnessandscalabilitybydistributingdataacrossmultiplenodes.ItusestheNDBenginefordatareplicationandfaulttolerance,ensuringhighavailability.Setupinvolvesconfiguringmanagement,data,andSQLnodes,withcarefulmonitoringandpe

    如何優化數據庫架構設計以在MySQL中的性能?如何優化數據庫架構設計以在MySQL中的性能?Apr 30, 2025 am 12:27 AM

    在MySQL中優化數據庫模式設計可通過以下步驟提升性能:1.索引優化:在常用查詢列上創建索引,平衡查詢和插入更新的開銷。 2.表結構優化:通過規範化或反規範化減少數據冗餘,提高訪問效率。 3.數據類型選擇:使用合適的數據類型,如INT替代VARCHAR,減少存儲空間。 4.分區和分錶:對於大數據量,使用分區和分錶分散數據,提升查詢和維護效率。

    您如何優化MySQL性能?您如何優化MySQL性能?Apr 30, 2025 am 12:26 AM

    tooptimizemysqlperformance,lofterTheSeSteps:1)inasemproperIndexingTospeedUpqueries,2)使用ExplaintplaintoAnalyzeandoptimizequeryPerformance,3)ActiveServerConfigurationStersLikeTlikeTlikeTlikeIkeLikeIkeIkeLikeIkeLikeIkeLikeIkeLikeNodb_buffer_pool_sizizeandmax_connections,4)

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    MantisBT

    MantisBT

    Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

    mPDF

    mPDF

    mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript開發工具

    VSCode Windows 64位元 下載

    VSCode Windows 64位元 下載

    微軟推出的免費、功能強大的一款IDE編輯器