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 設定の詳細なチュートリアル

推薦する

Nginx は高可用性クラスタ構築を実装します (Keepalived+Haproxy+Nginx)

1. コンポーネントと実装機能Keepalived: Haproxy サービスの高可用性を実現し、...

HTML の表のフレームとルール属性の詳細な説明

テーブル タグの frame 属性と rules 属性は境界線の表示を制御できます。フレーム プロパ...

Linux の Makefile とは何ですか? どのように機能しますか?

この便利なツールでプログラムをより効率的に実行およびコンパイルしますMakefile は自動コンパイ...

Apache Log4j2 が核レベルの脆弱性と迅速な修正を報告

Apache Log4j2 が核レベルの脆弱性を報告し、スタックリーダーの友人たちは大騒ぎになりまし...

zabbix 4.04 の詳細なインストール チュートリアル (CentOS 7.6 ベース)

1. インストール前の準備: 1.1 JDKをインストールするopenjdkをアンインストールする...

CSSでイメージマッピングを実装する方法

1. はじめにイメージマップを使用すると、画像の領域をホットスポットとして指定できます。この領域にマ...

CSSはマウスが画像に移動したときにマスク効果を実現します

1.マスクレイヤーのHTMLコードと画像をdivに配置する.img_div に入れました。 <...

Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体

1. Expressライブラリとジェネレータをインストールするcmdを開いて、次のコマンドを入力しま...

dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明

問題の起源docker を使用する場合、残念ながら docker コンテナ内のホストのポート 80 ...

CSS での配置の使用方法の詳細な研究 (要約)

CSS における位置指定の概要position属性は英語で位置を意味し、 CSSでの主な機能は要素...

ニューススタイルのウェブサイトデザイン例25選

bmi ボイジャーピッチフォークアルスター食料品店チャウ真/斜めポスタこれは偽のDIYですクリエイテ...

ローカル画像サーバーのNginx構成の実装

目次1. Nginx の紹介2. 画像サーバーの構築1. Nginx の紹介Nginx はリバース ...

Vue+echart で 2 列チャートを実現

この記事では、vue+echart を使って二重列チャートを実現するための具体的なコードを参考までに...

nginx設定ファイルの解釈の詳細な説明

nginx 設定ファイルは主に 4 つの部分に分かれています。 main{#(グローバル設定) ht...

ウェブ上の模倣と盗作に関する議論

2005年に業界に入ってから数か月後、労働者の日休みの期間中、1か月以上毎日12時まで残業をしました...