检索数据库中存储的数据是数据收集过程的一部分。许多组织已经将数据存储在数据库中,数据是在内部生成的,这消除了通过第三方机构,网络刮擦等进一步搜索数据的需求。
是分析师的责任,连接到组织数据库中存储的可用数据并在其上执行首选分析。
有时在数据库中存储的这些数据时,我们必须从两个或多个表中进行查询。我们希望将两个表的结果汇总到一个表格中。
不是从两个表通过SQL Join执行的两个表加入我们的数据集,而是垂直加入它们,使用SQL Set Operators使它们成为可能。
注意:我在这里使用两个表来简化概念,但是,您不仅限于要使用的表数。只需确保您不会过度使用它,以便保持理智。
可以实现此结果的SQL术语。
集合运算符是用于结合两个或多个查询结果的操作员。
这些包括:
联盟,联盟全部,相交,减,除
此处显示的所有代码示例将使用mysql
编写 设置运算符语法
SELECT select_query
set_operator
SELECT another_select_query
创建我们的桌子
创建了我们的表,将一些数据插入其中。
将记录插入我们的桌子
INSERT INTO `students1`(`id`, `first_name`, `last_name`,
`department`, `level`, `residence`)
VALUES (1,"John","Mark","Economics",300,"Hostel"),
(2,"Ikenna","Matthew","Psychology",100,"Hostel"),
(3,"Jones","Jessica","Chemistry",400,"Off_Campus"),
(4,"Sarah","Mary","Sociology",200,"Off_Campus"),
(5,"King", "James", "Social Work", 300, "Hostel")
INSERT INTO `students2`(`id`, `first_name`, `last_name`, `department`, `level`, `residence`)
VALUES (1,"John","Mark","Economics",300,"Hostel"),
(2,"Ikenna","Matthew","Psychology",100,"Hostel"),
(3,"James","Bill","Agric",200,"Hostel"),
(4,"Sarah","Mary","Sociology",200,"Off_Campus"),
(5,"Queen", "Sharon","English", 100, "Off_Campus")
设置运算符
联盟
此集合运算符用于结合两个选择语句的结果。
执行工会操作后获得的结果将消除重复的行。
SELECT id, first_name, last_name, department, level,residence
FROM students1
UNION
SELECT id, first_name, last_name, department, level,residence
FROM students2
由于联合操作员消除了重复的值,因此将消除第一个表中已经存在的第二个表中的所有值。
联盟全部
此操作员结合了两个查询的所有记录。
执行所有操作后获得的结果将不会从获得的结果中取消。
SELECT id, first_name, last_name, department, level,residence
FROM students1
UNION ALL
SELECT id, first_name, last_name, department, level,residence
FROM students2
联合与联盟全部:您应该选择哪个?
联合和工会之间的区别差异是在两个表中都发现重复记录(行)时发生的事情。
使用联合操作员,删除/删除了重复记录。也就是说,如果第二个表中已经存在第二个表中的记录(行(行),则返回第一个表的行,但是第二个表中的行不会返回,因为已经存在了它的确切记录从第一张表。
联合操作员说,我已经扫描了您的桌子,并且在第一张表中似乎也出现在第二个表中的记录。现在将通过不返回第二个表中的相同记录来帮助您返回不同的记录。
与工会所有操作员一起,所有记录都会返回所有记录,而不论它们是否出现在第二个表中。
工会所有操作员都说,我不在乎是否有重复,这是您两张桌子中的所有记录。联盟中的所有内容都表示所有记录。
联合通常比联合所有人都慢,因为还有一个额外的操作可以删除重复值,这通常是一个昂贵的查询步骤。
联合所有人都不执行明显的查询,因此通常更快。
因此,您无意在结果中拥有唯一的记录,或者如果您确定表中的记录已经是唯一的,请全部使用Union。但是,如果您觉得自己的桌子将包含重复的值,请使用Union。
相交
返回从表和删除重复的记录。
请注意:它消除了重复。
SELECT id, first_name, last_name, department, level,residence
FROM students1
INTERSECT
SELECT id, first_name, last_name, department, level,residence
FROM students2
减/除外
返回第一个查询结果中存在但不存在第二个查询结果中的行。
SELECT id, first_name, last_name, department, level,residence
FROM students1
EXCEPT
SELECT id, first_name, last_name, department, level,residence
FROM students2
除外,负和执行相同的查询操作。但是,负是Oracle关系数据库关键字。除其他关系数据库(例如MySQL和PostgreSQL。
注意的要点
1从两个表中选择列时,返回的列数需要在查询之间匹配。如果从第一个查询中选择了三列,则需要从第二个查询中选择三列。
2列的顺序必须相同。
SELECT id, first_name, last_name, department, level,residence
FROM students1
UNION
SELECT id, last_name, department, first_name, level,residence
FROM students2
ORDER BY department
执行上述查询不会产生错误,但是结果会导致障碍。
3每列的数据类型需要与两个表兼容。如果第一个表中名为first_name的列的数据类型是字符串,则在第二个表中命名为first_name的列的数据类型也应为字符串。
4如果您想订购查询结果,则必须在上次查询的末尾写下订单
SELECT id, first_name, last_name, department, level,residence
FROM students1
UNION
SELECT id, first_name, last_name, department, level,residence
FROM students2
ORDER BY department
如果将订单放在第一个查询中,它将生成错误。您可以自己尝试。
5对于最终结果集,分配给列的别名名是从第一个查询中的列的名称中获取的。因此,在第二个查询中的混叠列名不会有用。
SELECT id AS studentID, first_name, last_name, department, level, residence AS location FROM students1
UNION
SELECT id as id_of_student, first_name, last_name, department,level, residence AS address FROM students2
在这里,我们使用两个表进行了查询操作。重要的是要注意,我们还可以在设置操作中添加更多表。只需确保您不会添加更多的桌子,从而难以跟踪操作。
结论
尽管SQL中的一个未充分利用概念,但是当我们想将多个表与相同结构组合到单个表中时,设置运算符可能很有用。
在本教程中,我们学会了:
什么是设置运算符
使用集合操作员的原因
设置运算符的类型
关于设置运算符的要点
我确实希望您发现本教程可用于帮助您了解SQL Set Operators
有任何疑问或反馈吗?请在下面评论。