[GaussDB] GaussDB数据库SQL系列-复合查询

一、前言
GaussDB是华为自主创新研发的分布式关系型数据库,具有高性能、高安全、高可用、高弹性、高智能特点。

在这篇文章中,我们将探讨在GaussDB数据库中使用复合查询的技术。复合查询是SQL查询的一个高级特性,它允许用户通过结合多个简单查询来执行更复杂的数据检索操作。这种查询通常涉及使用UNION、INTERSECT、EXCEPT等SQL关键字,以及子查询和连接操作。掌握复合查询对于高效利用GaussDB进行复杂数据分析非常重要。我们将通过具体示例演示如何构建和执行这些复合查询,从而提供更深入的数据洞察。

二、复合查询基础
复合查询是SQL中一种强大的工具,用于结合多个独立查询结果以形成一个单一的查询结果。在GaussDB数据库中,您可以通过以下操作符来执行复合查询:

UNION:合并两个或多个查询结果为一个结果集。它会删除重复的行。

INTERSECT:返回两个查询共有的记录。

EXCEPT:从第一个查询结果中减去第二个查询结果中的记录。

三、实际应用示例
1、使用UNION合并查询结果
合并employees和sales表中的不同字段。

SELECT name FROM employees

UNION

SELECT product FROM sales;

2、使用INTERSECT找出共同元素
假设我们有另一个销售数据表sales2,找出两个销售表中共同销售的产品。

sales2:

SELECT product FROM sales
INTERSECT
SELECT product FROM sales2;

INTERSECT替代: 使用INNER JOIN实现与INTERSECT相同的功能。

3、使用EXCEPT排除特定结果

SELECT sales.product

FROM sales

INNER JOIN sales2 ON sales.product = sales2.product;


找出employees表中存在但在sales表中未销售的产品。

SELECT name FROM employees

EXCEPT

SELECT product FROM sales;

EXCEPT替代: 使用LEFT JOIN和WHERE子句检查NULL值,实现与EXCEPT相同的功能。

SELECT sales.product

FROM sales

LEFT JOIN sales2 ON sales.product = sales2.product

WHERE sales2.product IS NULL;

四、高级技巧
1、子查询实例
在WHERE子句中使用子查询:找出销售额超过平均销售额的产品。

SELECT product FROM sales

WHERE amount > (SELECT AVG(amount) FROM sales);

2、JOIN的应用
使用INNER JOIN:结合employees和sales表,找出所有员工及其对应的销售记录。

SELECT e.name, s.product, s.amount

FROM employees e

INNER JOIN sales s ON e.id = s.id;

使用LEFT JOIN:显示所有员工,即使他们没有对应的销售记录。

SELECT e.name, s.product, s.amount

FROM employees e

LEFT JOIN sales s ON e.id = s.id;

五、总结

ETCD:分布式键值存储系统(Editable Text Configuration Daemon)。用于共享配置和服务发现(服务注册和查找)。
CMS:集群管理模块(Cluster Manager)。管理和监控分布式系统中各个功能单元和物理资源的运行情况,确保整个系统的稳定运行。
Data Node:数据节点DN,负责存储业务数据(支持行存、列存、混合存储)、执行数据查询任务以及返回执行结果。
通过探索复合查询,包括使用UNION、INTERSECT、EXCEPT以及高级技巧如子查询和各类JOIN操作,我们可以看到GaussDB在处理复杂数据查询方面的强大能力。这些技术为用户提供了灵活和高效处理大规模和多样化数据的工具。掌握这些高级查询技能对于进行深入的数据分析至关重要,能够显著提升在GaussDB中进行数据处理和分析的效率和准确性。

详情查看:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html

<think>好的,我需要帮助用户了解如何在GaussDB数据库中创建表、设置主键以及添加表和字段的注释。用户之前已经询问过建表SQL的基本介绍,现在他们可能希望更详细地了解主键和注释的具体实现方法。 首先,我需要确认用户提到的GaussDB的具体版本,因为不同的版本可能在语法上有细微的差别。但根据之前的回答,GaussDB兼容PostgreSQL和Oracle语法模式,所以可能需要提到这两种风格的注释语法。 接下来,建表的基本语法用户已经知道,但需要补充主键的不同定义方式,比如列级和表级约束。然后,注释部分,用户可能想知道如何使用COMMENT语句来添加表和字段的注释。需要分别说明如何注释表和字段,以及不同数据库模式下的差异,比如Oracle模式可能需要使用双引号或特定的语法。 还要考虑用户可能的实际应用场景,比如在团队协作中注释的重要性,或者维护表结构时的可读性。可能需要给出具体的示例,让用户能够直接复制修改使用。同时,注意事项部分需要提醒用户关于分布键和分区键的选择,以及注释的维护建议。 需要检查是否有遗漏的部分,比如是否覆盖了所有用户可能的疑问点,例如主键的复合主键情况,注释的删除或修改方法,以及不同存储模式(行存和列存)对注释的影响。虽然用户可能没有明确提到这些,但作为全面的回答,可以简要提及。 最后,确保语言简洁明了,结构清晰,分点说明,方便用户阅读和理解。避免使用过于技术化的术语,但必要时需准确使用术语。同时,注意格式美观,使用代码块来展示SQL示例,并强调关键部分。</think>以下是关于 **GaussDB 数据库建表、主键定义以及表和字段注释**的详细说明和示例: --- ### **1. 建表与主键定义** GaussDB 支持 **列级主键** 和 **表级主键** 两种定义方式,语法兼容 PostgreSQL/Oracle 风格。 #### **(1) 基础建表语法** ```sql CREATE TABLE [IF NOT EXISTS] 表名 ( 列名1 数据类型 [列级约束], 列名2 数据类型 [列级约束], ... [表级约束] ) [DISTRIBUTE BY 分布策略(列名)] -- 必选(分布式特性) [PARTITION BY 分区策略]; -- 可选 ``` #### **(2) 主键定义方式** - **列级主键**:直接在列定义时指定 ```sql CREATE TABLE employee ( emp_id INT PRIMARY KEY, -- 列级主键 emp_name VARCHAR(50) NOT NULL ) DISTRIBUTE BY HASH(emp_id); ``` - **表级主键**:单独声明(支持复合主键) ```sql CREATE TABLE orders ( order_id INT, product_id INT, quantity INT, PRIMARY KEY (order_id, product_id) -- 复合主键 ) DISTRIBUTE BY HASH(order_id); ``` --- ### **2. 表和字段注释** GaussDB 使用 `COMMENT` 语句为表和字段添加注释,语法与 PostgreSQL 类似。 #### **(1) 表注释** ```sql COMMENT ON TABLE 表名 IS '表的描述信息'; ``` #### **(2) 字段注释** ```sql COMMENT ON COLUMN 表名.列名 IS '字段的描述信息'; ``` #### **(3) 示例** ```sql -- 创建表 CREATE TABLE customer ( cust_id INT PRIMARY KEY, cust_name VARCHAR(100) NOT NULL, birth_date DATE ) DISTRIBUTE BY HASH(cust_id); -- 添加表注释 COMMENT ON TABLE customer IS '客户基本信息表'; -- 添加字段注释 COMMENT ON COLUMN customer.cust_id IS '客户唯一ID'; COMMENT ON COLUMN customer.cust_name IS '客户姓名'; COMMENT ON COLUMN customer.birth_date IS '出生日期'; ``` --- ### **3. Oracle 模式下的注释语法** 若 GaussDB 部署为 **Oracle 兼容模式**,需使用双引号或特定语法: ```sql COMMENT ON TABLE 表名 IS '表的描述信息'; COMMENT ON COLUMN 表名.列名 IS '字段描述信息'; -- 示例 COMMENT ON COLUMN employee.emp_id IS '员工编号'; ``` --- ### **4. 完整示例(含注释)** ```sql -- 创建分区表(含主键和注释) CREATE TABLE sales_records ( record_id BIGINT PRIMARY KEY, -- 主键 product_code VARCHAR(20) NOT NULL, sale_time TIMESTAMP, amount NUMERIC(10,2) ) DISTRIBUTE BY HASH(record_id) PARTITION BY RANGE (sale_time) ( PARTITION p2023 VALUES LESS THAN ('2024-01-01'), PARTITION p2024 VALUES LESS THAN ('2025-01-01') ); -- 表注释 COMMENT ON TABLE sales_records IS '销售记录表(按年分区)'; -- 字段注释 COMMENT ON COLUMN sales_records.record_id IS '销售记录唯一ID'; COMMENT ON COLUMN sales_records.product_code IS '商品编码'; COMMENT ON COLUMN sales_records.sale_time IS '销售时间'; COMMENT ON COLUMN sales_records.amount IS '销售金额(单位:元)'; ``` --- ### **5. 注意事项** 1. **主键与分布键**: - 主键默认包含唯一性约束,但分布键(`DISTRIBUTE BY`)需显式指定,二者可以不同。 - 若主键同时作为分布键,可减少跨节点查询(推荐高频查询字段)。 2. **注释管理**: - 修改注释需重新执行 `COMMENT` 语句覆盖原内容。 - 注释信息可通过系统表 `pg_description` 查询。 3. **兼容性差异**: - Oracle 模式下字段别名可能需要双引号包裹(如 `COMMENT ON COLUMN table."column"`)。 --- 通过以上语法,您可以在 GaussDB 中高效定义表结构、主键约束,并通过注释增强表设计的可读性。实际使用时需根据业务场景选择分布键和分区策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值