This question 解释了获得多列独特组合的方法。但是为了这个目的,我想知道DISTINCT,UNION,GROUP BY关键字方法的方法之间的区别。使用它们时会得到不同的结果。 我的疑问是这样的 查询1.
select
column1,
column2,
column3
from table
group by 1,2,3
查询2.
select distinct
column1,
column2,
column3
from table
查询3.
SELECT DISTINCT(ans) FROM (
SELECT column1 AS ans FROM sametable
UNION
SELECT column2 AS ans FROM sametable
UNION
SELECT column3 AS ans FROM sametable
) AS Temp
我为上面的查询获得了不同的行数(编辑:前两个给出相同数量的行,但最后一个给出了不同的行)。任何机构都可以解释上述查询的作用吗?特别是第三个?
编辑:请注意,我在同一张桌子上做UNION。在那种情况下会发生什么?
答案 0 :(得分:10)
从我认为最简单的DISTINCT开始,就是这样。它返回不同的行组合。想想这个数据集:
COL1 COL2 COL3
A B C
D E F
G H I
A B C <- duplicate of row 1
这将返回3行,因为数据集中的第4行与第一行完全匹配。 结果:
COL1 COL2 COL3
A B C
D E F
G H I
GROUP BY经常用于摘要和其他计算 选择COL1,SUM(COL2) 从表 group by column1;
对于此数据集:
COL1 COL2
A 5
A 6
B 2
C 3
C 4
C 5
将返回
COL1 SUM(COL2)
A 11
B 2
C 12
UNION只从不同的查询中获取结果并将它们显示为1个结果集:
Table1
COL1
A
Table2
COLX
B
Table3
WHATEVER_COLUMN_NAME
Giddyup
select COL1 from Table1
UNION
select COLX from Table2
UNION
select WHATEVER_COLUMN_NAME from Table3;
结果集:
A
B
Giddyup
执行联合时,列数据类型必须匹配。您不能使用char列UNION一个数字列(除非您明确执行数据转换)
答案 1 :(得分:1)
让我们假设这是您的数据库数据:
column1 | column2 | column3
1 | 2 | 1
1 | 2 | 2
1 | 2 | 1
3 | 1 | 2
1 | 2 | 2
1 | 2 | 2
1 | 2 | 2
在第一个示例中,您将获得db中的所有列组合(因为GROUP BY 1,2,3
不执行任何操作),包括重复项,因此它将返回:
1 | 2 | 1
1 | 2 | 2
1 | 2 | 1
3 | 1 | 2
1 | 2 | 2
1 | 2 | 2
1 | 2 | 2
第二个示例为列元组采用唯一值,因此您将以
结束1 | 2 | 1
1 | 2 | 2
3 | 1 | 2
上次查询从三列中获取所有值,然后从该集合中删除重复项。因此,您将从任何表中获取所有值。最后这将返回
1
2
3
这是否清楚了?
答案 2 :(得分:1)
让我们使用一组样本数据
orderid customer orderdate
1 B July 29
2 A Aug 1
3 A Aug 4
4 C Aug 5
5 B Aug 6
6 A Aug 11
Distinct基本上返回给定记录的单个实例,而不会重复结果集中的整个列集。例如:“从订单中选择不同的客户”将返回“A”,“B”,“C”默认为所选列的alpha顺序。
分组依据是在查询中的给定字段集中进行聚合。例如:
从订单组中选择客户,计数(*)为NumberOfOrders 1
Would result with...
A 3
B 2
C 1
您还可以在查询中应用distinct(仅一次),但在给定的组中应用..
选择客户,计数(*)作为NumberOfOrders,计数(明确{order of orderdate})作为客户的订单组中的CustomerMonths
Would result with
A 3 1 (all orders were in August)
B 2 2 (had orders in July and August)
C 1 1 (only one order in August)
联合是必须是完全相同的结果格式,列名和字段序列的查询。假设您有一个订单表,其结构与存档的数据版本完全相同。您只保留当前最新年份的当前数据,所有历史数据都被推送到存档。如果您想在一个查询中获取给定客户的所有订单活动,您可能希望进行联合
从CurrentOrders中选择customerid,orderdate,amount,其中customerid = ??按2降序排列 联盟 从ArchivedOrders中选择customerid,orderdate,amount,其中customerid = ??
第一个选择的ORDER by子句将驱动所有后续记录被拉入结果的结果。就像SQL说去表一,得到所有资格,然后排序。然后,转到表2,获取所有符合条件的内容并从表1中拉入现有的排序列表。最终结果是所有记录。
HTH
答案 3 :(得分:0)
如果包含“实际执行计划”(MS SQL Management Studio中的控件+ M),它将为您提供SQL引擎如何优化每个语句的图表。理解这将有助于您编写更好的查询。