什么是关于数据库的集合?

What is a Set with regard to databases?

我刚开始学习 SQL 集合,但一开始并没有给出什么是集合的定义,只提到了 UNIONS 和 INTERSECTS。

示例SQL:

SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;

集合的日常概念是事物或值的集合,其中每个事物或值最多出现一次并且没有顺序。

我们可以问某个thing/value是否在一个特定的集合中,即是它的元素,即是它的成员。相关操作包括两个集合的 UNION,它给出其成员在其中一个或两个集合中的集合。 INTERSECTION 给出了两个集合中的一组值。两个集合的差异是属于一个集合但不属于另一个集合的一组值。 "The" "empty" 集合是没有成员的集合。

在关系上下文中,我们有时将 table 视为一组行。它们必须共享相同数量的列,有时还必须共享同一组列名或列名列表。 (然后只有一个空 table。)其他时候我们将 table 视为这样的一组行加上所需的共享列数、列名集或列名列表。 (然后,由于列的名称 and/or 很重要,两个没有行的 table 可以是不同的 table。)但即使是这样的 table 也被草率地称为设置。

在 SQL 上下文中,table 是行的集合加上一个(非空)列名列表。但这些系列不是套装,而是包。包是值的集合,其中相同的值可以多次作为成员出现。只要我们只处理任何值仅作为成员出现一次的袋子,我们就可以将它们视为集合。 (SQL tables 在其他方面与关系 tables 不同。)有时他们只是草率地被调用集。

SQL 的笨重是它同时具有 UNION (DISTINCT) 和 UNION ALL 的原因。 UNION ALL returns table 其bag成员为argument bags的成员,每一个出现在argument bags中的总次数。但是UNION (DISTINCT) returns table 他们的包是这样的,但是每个成员只有一个外观。它的包就像作为参数包的成员出现的行集。

PS 关于 table 持有集的推理很简单。每个 table 包含使某些填充(命名)空白语句成为真实语句的行。 (空白由列命名,并由行中的相应值填充。)假设一个 table T 与列 T1,T2,... 包含使“...T1...T2.. 。“ 真的。然后对于两个 tables R & S R UNION S 保存使 "...R1...R2... OR ...S1...S2..." 为真和 R JOIN S 保存使 "...R1...R2... AND ...S1...S2..." 为真的行。以此类推其他 table 和逻辑运算符。但是关于包没有这样简单的规则。这种重复行的存在使得 SQL 查询比具有关系 table 的查询更难以推理。 UNION (DISTINCT) 和 SELECT DISTINCT 用于去除重复项。