PostgreSQL.md
... ...
@@ -741,6 +741,67 @@ COMMIT;
741 741
| **日志分析** | 使用工具(如 pgBadger)分析 PostgreSQL 日志,识别高频错误。 |
742 742
743 743
744
+### 2.6 PostgreSQL JSON数据类型
745
+
746
+PostgreSQL 提供了强大的 JSON 支持,能够灵活地存储和处理 JSON 数据,同时结合了关系型数据库的可靠性和 JSON 数据的灵活性。
747
+
748
+[[JSON 数据类型](https://www.rockdata.net/zh-cn/tutorial/type-json/)]
749
+
750
+**1. JSON 数据类型**
751
+
752
+PostgreSQL提供了两种主要的JSON数据类型:
753
+
754
+- **`JSON`**:以文本格式存储JSON数据,保留输入时的所有细节(如空格和重复键)。适合需要保留原始文档格式的情况。
755
+- **`JSONB`**:将JSON数据解析并以二进制格式存储,不保留格式信息(如空格)和重复键。尽管在插入时可能稍慢,但读取和查询性能通常优于`JSON`类型,因此推荐用于大多数场景。
756
+
757
+**2. 查询JSON数据**
758
+
759
+PostgreSQL为JSON数据提供了丰富的操作符和函数,使得查询变得简单而强大。以下是一些常用的查询方法:
760
+
761
+
762
+
763
+- **提取数据**:
764
+
765
+ - `->`:从JSON对象中获取指定键的值(返回JSON类型)。
766
+
767
+ - `->>`:类似`->`,但返回的是文本类型。
768
+
769
+ - `#>` 和 `#>>`:用于根据提供的路径数组提取嵌套的JSON数据。
770
+
771
+ 由于`->`运算符返回 JSON 对象,因此您可以将其与运算符`->>`串接起来以检索特定节点。例如,以下语句返回所有已售出的产品:
772
+
773
+ ```sql
774
+ SELECT info -> 'items' ->> 'product' as product
775
+ FROM orders
776
+ ORDER BY product;
777
+ ```
778
+
779
+- **检查包含关系**:
780
+
781
+ - `@>`:检查左侧的JSON是否包含右侧的JSON。
782
+ - `<@`:与`@>`相反,检查左侧的JSON是否被右侧的JSON所包含。
783
+
784
+- **键存在性检查**:
785
+
786
+ - `?`:检查JSON对象中是否存在某个键。
787
+
788
+ - `?|` 和 `?&`:分别用于检查一组键中是否有任意一个或全部存在于JSON对象中。
789
+
790
+
791
+
792
+**3. 创建索引提高性能**
793
+
794
+为了优化JSON数据的查询性能,特别是对于复杂查询条件,PostgreSQL允许为JSONB字段创建GIN(Generalized Inverted Indexes)索引。GIN索引特别适用于处理复杂的查询,例如查找包含特定键值对的记录。
795
+
796
+- 创建GIN索引的例子:
797
+
798
+ ```sql
799
+ CREATE INDEX idx_jsonb_data ON your_table USING GIN (jsonb_column);
800
+ ```
801
+
802
+使用GIN索引可以显著加快涉及`@>`、`?`等操作符的查询速度,这对于需要频繁进行这类查询的应用来说是非常重要的。
803
+
804
+
744 805
745 806
# 第三节. PostgreSQL 基础教程
746 807