MySQLでJSONフィールドを操作する方法

MySQLでJSONフィールドを操作する方法

MySQL 5.7.8 では json フィールドが導入されました。このタイプのフィールドは使用頻度は低くなりますが、実際の運用では一部の企業ではまだ使用されています。これを例にして、json フィールドの操作方法を紹介します。

例から始めましょう:

mysql> テーブル test1(id int、info json) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.02 秒)

mysql> test1 に値を挿入します (1,'{"name":"yeyz","age":26}'),(2,'{"name":"zhangsan","age":30}'),(3,'{"name":"lisi","age":35}');
クエリは正常、3 行が影響を受けました (0.02 秒)
記録: 3 重複: 0 警告: 0

mysql> test1 から * を選択します。
+------+---------------------------------+
| ID | 情報 |
+------+---------------------------------+
| 1 | {"年齢": 26, "名前": "yeyz"} |
| 2 | {"年齢": 30, "名前": "zhangsan"} |
| 3 | {"年齢": 35, "名前": "lisi"} |
+------+---------------------------------+
セット内の 3 行 (0.00 秒)

まず、id が int フィールド、info が json フィールドであるテーブル test1 を作成し、上に示すように 3 つのデータを挿入しました。

mysql> test1 から * を選択します。 where json_extract(info,"$.age")>=30;
+------+---------------------------------+
| ID | 情報 |
+------+---------------------------------+
| 2 | {"年齢": 30, "名前": "zhangsan"} |
| 3 | {"年齢": 35, "名前": "lisi"} |
+------+---------------------------------+
セット内の 2 行 (0.00 秒)

json_extract メソッドを使用して、json 形式のコンテンツを取得できます。で:

1. $ 記号は json のルート ディレクトリを表します。

2. json の age フィールドを削除するのと同じ効果を持つ $.age を使用します。

3. もちろん、関数の先頭にはフィールド名情報を書き込む必要があります。

json でよく使われる関数を見てみましょう。

a. json_valid は、それが json フィールドであるかどうかを判断します。そうであれば 1 を返し、そうでない場合は 0 を返します。

mysql> json_valid(2) を選択します。
+---------------+
| json_valid(2) |
+---------------+
| 0 |
+---------------+
セット内の1行(0.01秒)
mysql> json_valid('{"num":2}') を選択します。
+-------------------------+
| json_valid('{"num":2}') |
+-------------------------+
| 1 |
+-------------------------+
セット内の 1 行 (0.00 秒)

mysql> json_valid('2') を選択します。
+-----------------+
| json_valid('2') |
+-----------------+
| 1 |
+-----------------+
セット内の 1 行 (0.00 秒)
mysql> json_valid('name') を選択します。
+--------------------+
| json_valid('名前') |
+--------------------+
| 0 |
+--------------------+
セット内の 1 行 (0.00 秒)

ここで注目すべきは、文字列2が渡された場合、返される結果は1になるということである。

b. json_keys は、json フィールドの最上位キー値を返します。

mysql> json_keys('{"name":"yeyz","score":100}') を選択します。
+------------------------------------------+
| json_keys('{"name":"yeyz","score":100}') |
+------------------------------------------+
| ["名前", "スコア"] |
+------------------------------------------+
セット内の1行(0.01秒)
mysql> json_keys('{"name":"yeyz","score":{"math":100,"English":95}}') を選択します。
+----------------------------------------------------------------+
| json_keys('{"name":"yeyz","score":{"math":100,"English":95}}') |
+----------------------------------------------------------------+
| ["名前", "スコア"] |
+----------------------------------------------------------------+
セット内の 1 行 (0.00 秒)
# 複数のレイヤーがある場合は、最後に $ メソッドを使用して、いずれかのレイヤーのディレクトリを取得できます。mysql> select json_keys('{"name":"yeyz","score":{"math":100,"English":95}}','$.score');
+--------------------------------------------------------------------------+
| json_keys('{"name":"yeyz","score":{"math":100,"English":95}}','$.score') |
+--------------------------------------------------------------------------+
| ["数学", "英語"] |
+--------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

c. json_length 関数は最上位レイヤーのキーの数を返します。中間の特定のレイヤーを取得する場合は、次のように $ メソッドを使用できます。

mysql> json_length('{"name":"yeyz","score":{"math":100,"English":95},"age":26}'); を選択します。
+---------------------------------------------------------------------------+
| json_length('{"name":"yeyz","score":{"math":100,"English":95},"age":26}') |
+---------------------------------------------------------------------------+
| 3 |
+---------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

mysql> json_length('{"name":"yeyz","score":{"math":100,"English":95},"age":26}','$.score') を選択します。
+------------------------------------------------------------------------------------------------------+
| json_length('{"name":"yeyz","score":{"math":100,"English":95},"age":26}','$.score') |
+------------------------------------------------------------------------------------------------------+
| 2 |
+------------------------------------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

d. json_depth 関数、json ファイルの深さ、テスト例は次のとおりです。

mysql> json_depth('{"aaa":1}'),json_depth('{}'); を選択します。
+-------------------------+------------------+
| json_depth('{"aaa":1}') | json_depth('{}') |
+-------------------------+------------------+
| 2 | 1 |
+-------------------------+------------------+
セット内の 1 行 (0.00 秒)

mysql> json_depth('{"name":"yeyz","score":{"math":100,"English":95},"age":26}'); を選択します。
+--------------------------------------------------------------------------+
| json_depth('{"name":"yeyz","score":{"math":100,"English":95},"age":26}') |
+--------------------------------------------------------------------------+
| 3 |
+--------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

ここで注意すべきは、{'aa':1}形式のJSONの深さは2である。

e. json_contains_path 関数は、json に 1 つ以上のメンバーがあるかどうかを取得します。

mysql> @j='{"a":1,"b":2,"c":{"d":4}}' を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
#oneは、メンバーが1つ含まれている限り、1を返すことを意味します。
mysql> json_contains_path(@j,'one','$.a','$.e') を選択します。
+------------------------------------------+
| json_contains_path(@j,'one','$.a','$.e') |
+------------------------------------------+
| 1 |
+------------------------------------------+
セット内の 1 行 (0.00 秒)
#all はすべてのメンバーが含まれることを意味し、その場合にのみ 1 が返されます。
mysql> json_contains_path(@j,'all','$.a','$.e') を選択します。
+------------------------------------------+
| json_contains_path(@j,'all','$.a','$.e') |
+------------------------------------------+
| 0 |
+------------------------------------------+
セット内の1行(0.01秒)

mysql> json_contains_path(@j,'one','$.c.d') を選択します。
+--------------------------------------+
| json_contains_path(@j,'one','$.c.d') |
+--------------------------------------+
| 1 |
+--------------------------------------+
セット内の 1 行 (0.00 秒)

mysql> json_contains_path(@j,'one','$.a.d') を選択します。
+--------------------------------------+
| json_contains_path(@j,'one','$.a.d') |
+--------------------------------------+
| 0 |
+--------------------------------------+
セット内の 1 行 (0.00 秒)

f. json_type 関数は json 内のメンバーのタイプを決定し、json_extract と組み合わせて使用​​する必要があります。

mysql> test1 から * を選択します。
+------+---------------------------------+
| ID | 情報 |
+------+---------------------------------+
| 1 | {"年齢": 26, "名前": "yeyz"} |
| 2 | {"年齢": 30, "名前": "zhangsan"} |
| 3 | {"年齢": 35, "名前": "lisi"} |
+------+---------------------------------+
セット内の 3 行 (0.00 秒)
#名前のタイプを判断しますmysql> select json_type(json_extract(info,"$.name")) from test1;
+----------------------------------------+
| json_type(json_extract(info,"$.name")) |
+----------------------------------------+
| 文字列 |
| 文字列 |
| 文字列 |
+----------------------------------------+
セット内の 3 行 (0.00 秒)
# 年齢のタイプを決定しますmysql> select json_type(json_extract(info,"$.age")) from test1;
+---------------------------------------+
| json_type(json_extract(info,"$.age")) |
+---------------------------------------+
| 整数 |
| 整数 |
| 整数 |
+---------------------------------------+
セット内の 3 行 (0.00 秒)
#名前と年齢の組み合わせの型を判断すると、配列であることがわかります
mysql> test1 から json_type(json_extract(info,"$.name","$.age")) を選択します。
+------------------------------------------------+
| json_type(json_extract(info,"$.name","$.age")) |
+------------------------------------------------+
| 配列 |
| 配列 |
| 配列 |
+------------------------------------------------+
セット内の 3 行 (0.00 秒)

g. * の役割、すべての値については、以下の例を参照してください。

{
 "a":1,
 "b":2,
 「ハ」:
   {
    "d":4
   }
 「e」:
   {
   「d」:
     {
     「ddd」:
     「5」
     }
   }
}
mysql> @j='{"a":1,"b":2,"c":{"d":4},"e":{"d":{"ddd":"5"}}}' を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
#すべてのメンバーmysql> select json_extract(@j,'$.*');
+---------------------------------------+
| json_extract(@j,'$.*') |
+---------------------------------------+
| [1, 2, {"d": 4}, {"d": {"ddd": "5"}}] |
+---------------------------------------+
セット内の 1 行 (0.00 秒)
すべてのメンバーのうち #d メンバーmysql> select json_extract(@j,'$.*.d');
+--------------------------+
| json_extract(@j,'$.*.d') |
+--------------------------+
| [4, {"ddd": "5"}] |
+--------------------------+
セット内の 1 行 (0.00 秒)

以上がMySQLにおけるJSONフィールドの操作方法の詳しい内容です。MySQL JSONフィールドの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL並列レプリケーションの簡単な説明
  • MySQL で削除されたレコードが有効にならない理由のトラブルシューティング
  • MySQL CHARとVARCHARの保存と読み取りの違い
  • MySQL 学習チュートリアル クラスター化インデックス
  • MySQLの大規模テーブル最適化ソリューションについての簡単な説明
  • MySQL 8.0 の降順インデックス
  • MySQLのストレージエンジンの詳細な説明
  • MySQL 最適化のケーススタディ
  • MySQL マスタースレーブレプリケーションでエラーをスキップする方法
  • MySQL 並列レプリケーションの簡単な分析

<<:  Vue3は独自のページングコンポーネントをカプセル化します

>>:  springcloud alibaba nacos linux 設定の詳細なチュートリアル

推薦する

Dockerイメージのローカル移行の実装

最近 Docker を勉強しているのですが、よく問題に遭遇します。Docker イメージをダウンロー...

MySQL テーブル全体の暗号化ソリューション keyring_file の詳細な説明

例示するMySql Community Edition は、5.7.11 以降、テーブルベースのデー...

Java で ffmpeg を呼び出してビデオ形式を flv に変換する方法の詳細な説明

Java で ffmpeg を呼び出してビデオ形式を flv に変換する方法の詳細な説明注:以下のプ...

Vue マウスホイールスクロール切り替えルーティング効果を実装する方法

ルート ルーティング コンポーネント (アプリの下のルート ルーティング コンポーネント。子コンポー...

ウェブページからテキスト透かしを削除する2つの簡単な方法

<br /> 特定の Web サイトを閲覧して、優れた Web ページを見つけた場合、そ...

CSS3で実装されたダイナミックな星空の背景

結果:実装コードhtml <link href='https://fonts.goog...

SQL における distinct と row_number() over() の違いと使い方

1 はじめにデータベース内のデータを操作するための SQL 文を記述するときに、いくつかの不快な問題...

MySQLの関連ロックについての簡単な理解

この記事は主にInnoDBのロックに関する知識を素早く理解してもらうことを目的としています。 Roc...

MySQL で重複行を見つけて削除する方法

目次1. 重複行を見つける方法2. 重複行を削除する方法3. 複数の列で重複を見つける方法4. クエ...

CSS3 FlexBox の伸縮自在なレイアウトを 10 分で理解する

基本的な紹介特徴Flexbox は、よりシンプルで効率的なレイアウト方法を提供する CSS 表示タイ...

Linux で LVGL エミュレータをコンパイルする際のエラーの解決方法

目次1. エラー現象2. エラー分析3. エラー解決1. エラー現象仮想マシンでLVGLエミュレータ...

MySQL データベースにおける高同時実行性の問題を解決する方法

序文スタートアップ企業が最初はモノリシック アプリケーションを主要なアーキテクチャとして使用し、通常...

MySQL データベース設計 3 つのパラダイム例分析

3つのパラダイム1NF: フィールドは分離不可能です。 2NF: 主キーがあり、非主キー フィールド...

Linux で MySQL のスケジュールバックアップを実装する方法

実際のプロジェクトでは、緊急事態を防ぐためにデータベースを頻繁にバックアップする必要があります。しば...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...