Sql GROUP BY和DISTINCT之间有什么区别?
我有以下数据的表格Sql GROUP BY和DISTINCT之间有什么区别?,sql,teradata,Sql,Teradata,我有以下数据的表格 empid empname deptid address -------------------------------- aa76 John 6 34567 aa75 rob 4 23456 aa71 smith 3 12345 aa74 dave 2 12345 a77 blake 2 12345 aa73 andrew 3
empid empname deptid address
--------------------------------
aa76 John 6 34567
aa75 rob 4 23456
aa71 smith 3 12345
aa74 dave 2 12345
a77 blake 2 12345
aa73 andrew 3 12345
aa90 sam 1 12345
aa72 will 6 34567
aa70 rahul 5 34567
我使用了以下查询:
select deptid, EMPID ,EMPNAME ,ADDRESS
from mytable
group by 1,2,3,4
结果如下:
deptid empid empname address
------------------------------
1 aa90 sam 12345
2 aa74 dave 12345
2 aa77 blake 12345
3 aa71 smith 12345
3 aa73 andrew 12345
4 aa75 rob 23456
5 aa70 rahul 34567
6 aa76 John 34567
6 aa72 will 34567
对于查询:
select distinct (deptid),EMPID,EMPNAME,ADDRESS
from mytable
结果集为:
deptid empid empname address
----------------------------
1 aa90 sam 12345
2 aa74 dave 12345
2 aa77 blake 12345
3 aa71 smith 12345
3 aa73 andrew 12345
4 aa75 rob 23456
5 aa70 rahul 34567
6 aa72 will 34567
6 aa76 John 34567
在第二个查询中,虽然我给出了DEPTID的DISTINCT
,但我怎么会得到重复的DEPTID
您能解释一下吗?
DISTINCT
将不同的记录作为一个整体引用,而不是记录中的不同字段。消除了重复行。对唯一记录进行分组,并允许您执行聚合功能。虽然“按所有列分组”和“不同”将在Teradata中为您提供相同的结果,但它们在幕后有不同的算法,使用“按组分组”通常比使用“不同”获得更好的性能。我相信有计划以相同的方式实现这两个功能,但在我使用的版本(v2r6)中它们仍然不同,而且我还没有在Teradata 12上进行过尝试。Distinct在使用多列时无法正常工作。虽然在单个列上给出了不同的值,但它给出了指定列的唯一组合
因此,Group by提供唯一的记录,也可以进行聚合。
DISTINCT
仅对整行有效。不要被误导,以为选择DISTINCT(A),B
会做一些不同的事情。这相当于按Group By选择不同的A、B,这两个选项的作用相同。与Distinct Group By相比,它具有良好的性能,因为它处理的行数更少,占用的假脱机内存也更少。我不知道如何解释这一差异,但我给你举了一些例子,其中包含一些查询。通过这一点,你可以更好地理解Group By
和Distinct
之间的差异
问题:在客户表中,每个独特状态下有多少人
select distinct(state), count(*) from customers;
RESULT
Washington 17
----------------------------------------------------------
select State, count(*) from customers GROUP BY STATE;
RESULT
**Arizona 6
Colorado 2
Hawaii 1
Idaho 1
North Carolina 1
Oregon 2
Sourth Carolina 1
Washington 2
Wisconsin 1**
只需制作您自己的表格并检查结果我想您需要首先解释您期望的结果是什么?在所有列上都有不同的工作。因此,第二个查询为您提供了两行唯一的数据,即使deptid是相同的。将GROUP BY用于count或sum等聚合函数。在SELECT子句中按位置引用列称为序号。IE:
按1,2,3,4分组
-不建议在选择列更改的情况下进行分组。可能重复:作为旁注;在Teradata 13.10(以及更早的版本)上,使用DISTINCT可能会导致排序操作,这比GROUP BY慢。因此,从性能的角度来看,在可能的情况下,人们应该更喜欢分组而不是区分。我想这在14.10版本中是固定的。这是我被弄糊涂了。。我希望distinct返回distinct列。。。我现在明白了。请看优化器如何处理GROUP BY vs DISTINCT之间的解释:在Teradata 13中,优化器似乎提高了DISTINCT的性能,如上面的链接所示。这肯定不是Teradata中的结果(也不应该出现在其他DBMS中),这将导致语法错误。您使用了哪种数据库管理系统?MySQL?