postgre sql 括字段_SQL高级知识——集合

ae8fabda6e9e8168b0806d5cd432c196.png

关注公众号:SQL数据库开发,了解更多SQL高级知识

集合的定义

集合是由一个和多个元素构成的整体,在SQL Server中的表就代表着事实集合,而其中的查询就是在集合的基础上生成的结果集。SQL Server的集合包括交集(INTERSECT),并集(UNION),差集(EXCEPT)。

交集INTERSECT

可以对两个或多个结果集进行连接,形成“交集”。返回左边结果集和右边结果集中都有的记录,且结果不重复(这也是集合的主要特性)

交集限制条件

  • 子结果集要具有相同的结构。
  • 子结果集的列数必须相同
  • 子结果集对应的数据类型必须可以兼容。
  • 每个子结果集不能包含order by 和 compute子句。

交集示例

我们用以下两个表中的数据作为示例

f06b0bbd1718e6cf3b2770b48fe7afdf.png

取以上两个表的交集,我们可以这样写SQL

SELECT 

结果如下:

b3c16dec15de6bd667b2e34833608f31.png

其中北京和上海是上面两个表共有的结果集。

这和我们的内连接(INNER JOIN)有点类似,以上SQL也可以这样写

SELECT 

结果与上面结果相同。

并集UNION

可以对两个或多个结果集进行连接,形成“并集”。子结果集所有的记录组合在一起形成新的结果集。其中使用UNION可以得到不重复(去重)的结果集,使用UNION ALL可能会得到重复(不去重)的结果集。

并集限制条件

  • 子结果集要具有相同的结构。
  • 子结果集的列数必须相同
  • 子结果集对应的数据类型必须可以兼容。
  • 每个子结果集不能包含order by 和 compute子句。

UNION示例

还是以上面的City1和City2为例,取两个表的并集,我们可以这样写SQL:

SELECT 

结果如下:

4b5a947164ae75aa590fe88f4a97ea5e.png

我们看到,北京和上海去掉了重复的记录,只保留了一次

UNION ALL示例

我们再看看使用UNION ALL会怎么样?

SELECT 

结果如下:

dd007becb8a1a4c7b7176677c1da32f4.png

与上面的UNION相比,UNION ALL仅仅是对两个表作了拼接而已,北京和上海依然在下面重复出现了,而且细心的读着应该发现了,UNION还会对结果进行排序,而UNION ALL不会。

差集EXCEPT

可以对两个或多个结果集进行连接,形成“差集”。返回左边结果集合中已经有的记录,而右边结果集中没有的记录。

差集限制条件

  • 子结果集要具有相同的结构。
  • 子结果集的列数必须相同
  • 子结果集对应的数据类型必须可以兼容。
  • 每个子结果集不能包含order by 和 compute子句。

差集示例

以City1和City2为例,我们想取City1(左表)和City2(右表)的差集,可以这样写SQL:

SELECT 

结果如下:

c99accda896028cc7881e02aaf08bfa3.png

我们看到,因为北京和上海在两个表都存在,差集为了只显示左表中有的,而右表中没有的,就把这两个给过滤掉了。

此外我们常说的关联条件其实也是集合的一种,是通过子表的笛卡尔积按不同的关联条件过滤之后得到的结果集。有兴趣的同学可以阅读一下《Microsoft SQL SERVER 2008技术内幕 T-SQL查询》,这本书中有关于集合论的具体阐述。

批注

集合是我们数据处理过程中的理论基础,可以通过集合的观点去很好的理解不同的查询语句。每一个物理表就是一个集合,当我们要对表进行操作的时候,将它们看成对集合的操作就很好理解了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL 中,可以通过表分区技术来实现大轨迹分割,将单个数据大于2K的字段进行分割,具体步骤如下: 1. 创建分区表:使用 CREATE TABLE 命令创建一个分区表,将大字段分割成多个子字段: ```sql CREATE TABLE large_data ( id SERIAL PRIMARY KEY, data1 TEXT, data2 TEXT, ... datan TEXT ); ``` 其中,data1、data2、...、datan 是将大字段分割成的多个子字段。 2. 创建分区规则:使用 CREATE TABLE 命令创建一个分区规则,指定按照哪个字段进行分区,以及每个分区的范围: ```sql CREATE TABLE large_data_partition ( CONSTRAINT large_data_partition_pkey PRIMARY KEY (id) ) INHERITS (large_data); CREATE OR REPLACE FUNCTION large_data_partition_insert_trigger() RETURNS TRIGGER AS $$ BEGIN IF (NEW.id % 3 = 0) THEN INSERT INTO large_data_partition_1 VALUES (NEW.*); ELSIF (NEW.id % 3 = 1) THEN INSERT INTO large_data_partition_2 VALUES (NEW.*); ELSE INSERT INTO large_data_partition_3 VALUES (NEW.*); END IF; RETURN NULL; END; $$ LANGUAGE plpgsql; CREATE TRIGGER large_data_partition_insert BEFORE INSERT ON large_data FOR EACH ROW EXECUTE FUNCTION large_data_partition_insert_trigger(); ``` 其中,large_data_partition_1、large_data_partition_2 和 large_data_partition_3 是分区表,分别对应 id 除以 3 余数为 0、1 和 2 的记录。 3. 插入数据:向 large_data 表中插入数据即可,根据分区规则,数据会自动分配到对应的分区表中。 ```sql INSERT INTO large_data (data1, data2, ..., datan) VALUES ('...', '...', ..., '...'); ``` 以上就是在 PostgreSQL 中实现大轨迹分割的方法,通过表分区技术将单个数据大于2K的字段进行分割,可以提高查询效率和存储空间利用率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值