mysql中json欄位查詢詳解

MySQL提供了一種新特性——JSON類型。相比於傳統的關係型資料庫設計,使用JSON更加靈活、方便,是Web和移動應用程序的理想數據存儲格式。本文將從多個方面對mysqljson欄位查詢做詳細的闡述。

一、mysqljson欄位查詢基礎

JSON類型是MySQL 5.7版本中引入的,主要是為了解決傳統關係型資料庫難以存儲半結構化數據的問題。JSON欄位類型支持讀取和修改JSON文檔中的數據,如果JSON格式不正確,MySQL會自動檢測並返回錯誤。

JSON類型的欄位可以使用標準的MySQL查詢語句進行處理,包括SELECT、UPDATE、DELETE、JOIN和WHERE子句等等。JSON類型數據中的每一個鍵值對都可以作為查詢條件。

下面舉個例子,假設有個表名為users,其中有個名為info_json的JSON欄位。我們需要根據JSON欄位中的age屬性查詢:

SELECT * FROM users WHERE info_json->'$.age'=25;

通過 -> 操作符可以獲取json對象中某個key的值,’$’表示查詢整個json

如果想根據JSON中的數組查詢,則可以使用 JSON_SEARCH() 函數:

SELECT JSON_SEARCH(info_json, 'one', 'green') FROM users;

JSON_SEARCH() 函數會返回數組中滿足條件的鍵的路徑。

二、mysqljson欄位的查詢操作

1、插入JSON對象

在mysql中,可以使用 JSON_OBJECT() 函數創建json對象,並將其插入到表中:

INSERT INTO users (info_json) VALUES (
    JSON_OBJECT(
        'name', 'Tom', 
        'age', 20, 
        'hometown', JSON_OBJECT('province', 'Guangdong', 'city', 'Shenzhen')
    )
);

還可以通過 JSON_ARRAY()函數直接插入JSON數組值:

INSERT INTO employees (info_json) VALUES (JSON_ARRAY('John', 'Doe', '20/01/1980'));

2、查詢JSON對象里的屬性

查詢JSON對象里的屬性可以使用 -> 操作符。例如,我們想要查詢info_json中name屬性的值,可以使用以下命令:

SELECT info_json->'$.name' FROM users WHERE id=10;

如果屬性是嵌套在另一個屬性中,則可以使用 ->> 操作符:

SELECT info_json->'$.hometown->>$.city' FROM users WHERE id=10;

它會將屬性的值作為結果返回。

3、查詢JSON數組裡的元素

查詢JSON數組裡的元素可以使用 JSON_EXTRACT() 函數。例如,我們要查詢 employees 表中第二個元素:

SELECT JSON_EXTRACT(info_json, '$[1]') FROM employees;

它將會返回 JSON 數組中的第二個元素

4、使用WHERE子句過濾JSON屬性或數組元素

可以使用WHERE子句過濾JSON屬性或數組元素,比如:

SELECT info_json->"$.type" as type, info_json->"$.value" as value 
FROM mytable 
WHERE info_json->"$.type" = "email"

MySQL 還提供了一些內置函數可以方便使用 JSON 數據類型:

  • JSON_CONTAINS(): 判斷是否包含指定的 JSON 數據
  • JSON_MERGE(): 合併多個 JSON 數據
  • JSON_OBJECTAGG(): 聚合組成 JSON 對象

三、mysqljson欄位的高級應用

1、JSON搜索引擎

MySQL還有一項高級功能——JSON搜索引擎(JSON Search Engine)

為了加快搜索速度,MySQL使用了基於搜索樹的快速查找方式。這種方式可以根據給定的約束條件查找符合條件的JSON對象,然後保留JSON對象中的符合條件的搜索結果。

這種搜索引擎使用了一種結合了B樹和B+樹的演算法來存儲索引文件。這種演算法既可以使用二分查找獲取數據,又可以使用B樹來獲取數據。

SELECT * FROM user_info 
  WHERE MATCH(userInfoCmt)
  AGAINST('+java +php' IN BOOLEAN MODE);

2、JSON數據轉換為MySQL的行

有時候,我們希望JSON數據可以轉換成MySQL的行,這樣就可以使用標準的SQL查詢。MySQL提供了一個叫做generated的列類型,使得這樣的轉化變得簡單。

CREATE TABLE mytable (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
                       json_col JSON NOT NULL,
                       generated_col VARCHAR(255)
                       GENERATED ALWAYS AS (JSON_EXTRACT(json_col, '$.name')) VIRTUAL);

因此,在查詢mytable時,就可以使用SELECT來查詢數據,並且可以像標準列一樣使用下面的WHERE子句:

SELECT * FROM mytable WHERE generated_col = 'test_value';

3、使用JSON數組可重複的key

JSON數組是一種靈活的數據類型,可以包含重複的鍵。當需要在JSON數組中存儲一組鍵值對時,可以使用下面的語法:

[
   {"key1": value1, key2: value2},
   {"key1": anotherValue1, key2: anotherValue2}
]

這種表示方法有時候可以在爬蟲中非常有用,因為可以使用JSON_STORAGE_FREE_FORM或者VIRTUAL列來處理JSON中的重複鍵:

CREATE TABLE my_table ( 
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data JSON NOT NULL,
  PRIMARY KEY(id)
);

SELECT data->"$.[*].key" AS key,
       data->"$.[*].value" AS value
FROM my_table
WHERE JSON_CONTAINS(JSON_KEYS(data), 'key');

四、總結

本文對mysqljson欄位查詢進行了詳細的闡述,包括基礎操作、高級使用,以及使用JSON搜索引擎、使用JSON數組可重複的key等。JSON類型是mysql資料庫一個強大的新特性,在存儲非結構化數據方面表現十分優異,我們希望這篇文章對你有所幫助。

原創文章,作者:DIHN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143328.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
DIHN的頭像DIHN
上一篇 2024-10-14 18:47
下一篇 2024-10-14 18:47

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • JSON的MD5

    在Web開發過程中,JSON(JavaScript Object Notation)是最常用的數據格式之一。MD5(Message-Digest Algorithm 5)是一種常用…

    編程 2025-04-29
  • 使用Java將JSON寫入HDFS

    本篇文章將從以下幾個方面詳細闡述Java將JSON寫入HDFS的方法: 一、HDFS簡介 首先,先來了解一下Hadoop分散式文件系統(HDFS)。HDFS是一個可擴展性高的分散式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • 如何使用Newtonsoft datatable轉Json

    Newtonsoft DataTable 是一個基於.NET的JSON框架,也是一個用於序列化和反序列化JSON的強大工具。 在本文中,我們將學習如何使用Newtonsoft Da…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL資料庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28
  • Navicat導出欄位識別為文本而不是數值

    解決方法:使用特定的代碼將導出的欄位識別為文本,而不是數值,下面將從多個方面進行詳細闡述。 一、ASCII碼轉換 在導出的文件中,將數值欄位使用ASCII碼轉換,即可讓這些欄位被識…

    編程 2025-04-28
  • JPRC – 輕鬆創建可讀性強的 JSON API

    本文將介紹一個全新的 JSON API 框架 JPRC,通過該框架,您可以輕鬆創建可讀性強的 JSON API,提高您的項目開發效率和代碼可維護性。接下來將從以下幾個方面對 JPR…

    編程 2025-04-27

發表回復

登錄後才能評論