MySQL 操作: JSON データ型の操作

MySQL 操作: JSON データ型の操作

前回の記事では、MySQL データ保存手順パラメータの詳細な例を紹介しました。今日は、JSON データ型に対する MySQL 操作の関連内容を見てみましょう。

概要

MySQL はバージョン 5.7.8 以降、JSON 構造化データの保存とクエリをサポートしており、これは MySQL も NoSQL データベースの利点を継続的に学習して追加していることを示しています。しかし、MySQL は結局のところリレーショナル データベースであり、JSON などの非構造化データを処理する際には依然として扱いにくいです。

JSONフィールドを持つテーブルを作成する

まず、json 形式のフィールドを含むテーブルを作成します。

テーブルテーブル名を作成する (
  id INT NOT NULL AUTO_INCREMENT、 
  json_col JSON、
  主キー(id)
);

上記のステートメントでは、データ型を JSON として指定する json_col フィールドに注意してください。

シンプルなJSONデータを挿入する

挿入する
  テーブル名 (json_col) 
価値観
  ('{"都市": "ゴール", "説明": "世界で最高の都市"}');
  

上記の SQL 文では、VALUES の後の部分に注意してください。JSON 形式のデータでは文字列を識別するために二重引用符が必要なので、VALUES の後の内容を一重引用符で囲む必要があります。

複雑なJSONデータを挿入する

テーブルに挿入(列) 
VALUES('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}');

ここでは、json 配列を挿入しました。重要なのは、一重引用符と二重引用符の問題に注意することです。

JSONデータの変更

前の例では、いくつかの JSON データを挿入しましたが、JSON データ内の特定のコンテンツを変更したい場合はどうすればよいでしょうか。たとえば、バリエーション配列に要素を追加する場合は、次のようにします。

myjson を更新します。SET dict=JSON_ARRAY_APPEND(dict,'$.variations','scheveningen') WHERE id = 2;

この SQL ステートメントでは、$ は JSON フィールドを表し、ドットはバリエーション フィールドのインデックス作成に使用され、その後、JSON_ARRAY_APPEND 関数を使用して要素が追加されます。次にクエリを実行します。

myjsonから*を選択

結果は次のとおりです。

+----+------------------------------------------------------------------------------------------------------+
| ID | 辞書 |
+---+------------------------------------------------------------------------------------------------------+
| 2 | {"opening": "シチリア", "variations": ["ペリカン", "ドラゴン", "ナドルフ", "スケベニンゲン"]} |
+----+------------------------------------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

MySQLでJSONデータを取得する方法の詳細については、公式リンクJSONパス構文を参照してください。

インデックスを作成

MySQL の JSON 形式のデータは直接インデックスを作成することはできませんが、検索するデータを別のデータ列に分離し、このフィールドにインデックスを作成することで回避できます。公式の例は次のとおりです。

mysql> テーブル jemp を作成します (
  -> c JSON、
  -> g INTは常に(c->"$.id")として生成されます。
  -> インデックス i (g)
  -> );
クエリは正常、影響を受けた行は 0 行 (0.28 秒)

mysql> jemp (c) 値に挿入
   > ('{"id": "1", "name": "フレッド"}'), ('{"id": "2", "name": "ウィルマ"}'),
   > ('{"id": "3", "name": "バーニー"}'), ('{"id": "4", "name": "ベティ"}');
クエリは正常、4 行が影響を受けました (0.04 秒)
記録: 4 重複: 0 警告: 0

mysql> SELECT c->>"$.name" AS name
   > jemp から g > 2;
+--------+
| 名前 |
+--------+
| バーニー |
| ベティ |
+--------+
セット内の 2 行 (0.00 秒)

mysql> EXPLAIN SELECT c->>"$.name" AS name
   > jemp から g > 2\G
************************** 1. 行 ****************************
      id: 1
 選択タイプ: シンプル
    テーブル: jemp
  パーティション: NULL
     タイプ: 範囲
可能なキー: i
     キー: i
   キーの長さ: 5
     参照: NULL
     行数: 2
   フィルター: 100.00
    追加: where の使用
セットに 1 行、警告 1 件 (0.00 秒)

mysql> 警告を表示\G
************************** 1. 行 ****************************
 レベル: メモ
  コード: 1003
メッセージ: /* select#1 */ select json_unquote(json_extract(`test`.`jemp`.`c`,'$.name'))
AS `name` from `test`.`jemp` where (`test`.`jemp`.`g` > 2)
セット内の 1 行 (0.00 秒)

この例は非常にシンプルです。JSON フィールドの id フィールドを取得し、それをフィールド g に分割します。次に、フィールド g にインデックスが作成され、クエリ条件もフィールド g に設定されます。

文字列をJSON形式に変換する

json 形式の文字列を MySQL の JSON 型に変換します。

SELECT CAST('[1,2,3]'をJSONとして) ;
SELECT CAST('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}' as JSON);

すべてのMySQL JSON関数

名前説明
JSON_APPEND() JSONドキュメントにデータを追加する
JSON_ARRAY() JSON配列を作成する
JSON_ARRAY_APPEND() JSONドキュメントにデータを追加する
JSON_ARRAY_INSERT() JSON 配列に挿入 -> パスを評価した後、JSON 列から値を返します。JSON_EXTRACT() と同等です。
JSON_CONTAINS() JSONドキュメントにパスに特定のオブジェクトが含まれているかどうか
JSON_CONTAINS_PATH() JSONドキュメントにパスにデータが含まれているかどうか
JSON_DEPTH() JSONドキュメントの最大深度
JSON_EXTRACT() JSON ドキュメントからデータを返します ->> パスを評価し、結果を引用符で囲まない後に JSON 列から値を返します。JSON_UNQUOTE(JSON_EXTRACT()) と同等です。
JSON_INSERT() JSONドキュメントにデータを挿入する
JSON_KEYS() JSONドキュメントからのキーの配列
JSON_LENGTH() JSONドキュメント内の要素数
JSON_MERGE()重複キーを保持しながら JSON ドキュメントをマージします。JSON_MERGE_PRESERVE() の非推奨の同義語です。
JSON_MERGE_PRESERVE()重複キーを保持しながらJSONドキュメントをマージする
JSON_OBJECT() JSONオブジェクトを作成する
JSON_QUOTE() JSONドキュメントを引用
JSON_REMOVE() JSONドキュメントからデータを削除する
JSON_REPLACE() JSONドキュメント内の値を置き換える
JSON_SEARCH() JSONドキュメント内の値へのパス
JSON_SET() JSONドキュメントにデータを挿入する
JSON_TYPE() JSON値の型
JSON_UNQUOTE() JSON 値の引用を解除
JSON_VALID() JSON値が有効かどうか

要約する

以上が、MySQL における JSON データ型の操作の詳細説明に関するこの記事の内容です。皆様のお役に立てれば幸いです。興味のある方は、引き続きこのサイトを参照してください。MySQL データ ストレージ プロセス パラメータの詳細な例、Redis と MySQL の違いの簡単な説明、いくつかの重要な MySQL 変数など。不足がある場合は、メッセージを残して指摘してください。編集者は適時に返信して修正し、大多数のプログラミング愛好家と労働者に優れた記事と読書体験を提供するよう努めます。以下に、MySQL 操作に関連する参考書籍をいくつか示します。

MySQL データベース アプリケーション 初心者からマスターまで (第 2 版) PDF スキャン版

https://www.jb51.net/books/361239.html

MySQL5 決定版ガイド (第 3 版) 中国語版 PDF スキャン版

https://www.jb51.net/books/367031.html

気に入っていただければ幸いです。さらに興味深いコンテンツについては、https://www.jb51.net/ をご覧ください。

以下もご興味があるかもしれません:
  • PostgreSQL と MySQL のデータ型の互換性の比較
  • MySQL データ型の最適化の原則
  • MySQL のデータ型とスキーマの最適化の詳細な説明
  • MyBatis JdbcType と Oracle および MySql データ型の対応の説明
  • MySQL データ型 DECIMAL の詳細な分析
  • MySQL のデータ型とフィールド属性の原理と使用法の詳細な説明
  • mysql8.0.19 の基本データ型の詳細な説明
  • MySQL入門(パート2)データベースのデータ型の詳細な説明
  • MySQL データ型 DECIMAL(N,M) における N と M の意味の詳細な説明
  • MySQL データ型の完全分析

<<:  VMWare14.0.0のUbuntu仮想マシンで共有フォルダを設定する

>>:  React-Native環境のセットアップと基本的な紹介

推薦する

優秀なウェブ開発者が開発スキルを向上させるために知っておくべき10のこと

「開発とは、単にコードを書くだけではない」というのは、3EV の Dan Frost 氏の言葉です。...

MySQL スロークエリ関連パラメータの原理の分析

MySQL スロー クエリ (正式名称はスロー クエリ ログ) は、MySQL によって提供されるロ...

データ構造 - ツリー (III): 多方向検索ツリー B ツリー、B+ ツリー

多方向探索ツリー完全二分木の高さ: O(log2N)、ここで2は対数完全なM方向探索木の高さ: O(...

MySQL 8.0.12 インストール グラフィック チュートリアル

MySQL8.0.12 インストールチュートリアルをみんなで共有します。 1. インストール1.イン...

テキストの両側に水平線を描くための CSS のサンプルコード

この記事では、テキスト中央の両側に水平線を引く効果を実現する CSS のサンプルコードを紹介し、皆さ...

HTML で JavaScript の全選択/全選択解除操作を実行するサンプル コード

コードをコピーコードは次のとおりです。 <html> <ヘッド> <m...

Vue ルーターにパラメータを渡すときにページを更新するとパラメータが失われる問題に対処する方法

目次概要方法1: params経由でパラメータを渡す方法2: クエリを通じてパラメータを渡す方法3:...

Dockerコンテナシェルスクリプトの実行ステータスを監視する方法

シナリオ会社のプロジェクトはDockerでデプロイされています。原因不明ですが、コンテナが時々停止し...

Nginx rtmp モジュールのコンパイル ARM バージョンの問題

目次1. 準備: 2. ソースコードのコンパイル1. 設定する2. コンパイルエラー3. ターゲット...

Vue カスタム オプション時間カレンダー コンポーネント

この記事の例では、参考のためにvueカスタムオプションタイムカレンダーコンポーネントの具体的なコード...

異なるデータベースで DROP TABLE を書く方法

異なるデータベースで DROP TABLE を書く方法1.MySQL 存在する場合はテーブルを削除 ...

Web ページ制作におけるテーブル属性 CellPad、CellSpace、Border の説明と使用

cellspacing は表内のセル間の距離です。セルパディングは、表のセル内の空白スペースです。一...

Centos7 Zabbix3.4 メールアラーム設定(メール内容がxx.bin添付ファイルになる問題の解決)

目次1. 監視Linuxホストを追加する2. メールボックスを設定する1. 監視Linuxホストを追...

一般的な Linux ツール vi/vim の完全版

なぜvimを学ぶのかLinuxには多数の設定ファイルがあるため、Linuxには多くのテキスト処理ツー...

CSS の画像パスの問題に関する議論 (同じパッケージ/異なるパッケージ)

CSS ファイルでは、背景を使用する、つまり背景画像を追加する必要がある場合があります。これは通常、...