e0709055c4c2a804979137bdde7c1199f6dc4bd3
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 |