group by,distinct,Union之间用于为多列选择不同值的区别是什么?

时间:2009-08-13 12:28:54

标签: sql group-by union distinct

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。在那种情况下会发生什么?

4 个答案:

答案 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引擎如何优化每个语句的图表。理解这将有助于您编写更好的查询。