前几天我学了一些关于SQL的简单知识:
SELECT c FROM myTbl GROUP BY C
结果与:
SELECT DISTINCT C FROM myTbl
我好奇的是,SQL引擎处理命令的方式有什么不同,还是它们真的是一样的东西?
我个人更喜欢独特的语法,但我相信这更多是出于习惯而不是其他原因。
编辑:这不是一个关于聚合的问题。理解了GROUP BY与聚合函数的使用。
前几天我学了一些关于SQL的简单知识:
SELECT c FROM myTbl GROUP BY C
结果与:
SELECT DISTINCT C FROM myTbl
我好奇的是,SQL引擎处理命令的方式有什么不同,还是它们真的是一样的东西?
我个人更喜欢独特的语法,但我相信这更多是出于习惯而不是其他原因。
编辑:这不是一个关于聚合的问题。理解了GROUP BY与聚合函数的使用。
当前回答
有时它们可能会给你同样的结果,但它们是在不同的意义/情况下使用的。主要的区别在于语法。
请仔细注意下面的例子。DISTINCT用于过滤掉重复的值集。(6, cs, 9.1)和(1,cs, 5.5)是两个不同的集合。DISTINCT会显示这两行,而GROUP BY Branch只显示一组。
SELECT * FROM student;
+------+--------+------+
| Id | Branch | CGPA |
+------+--------+------+
| 3 | civil | 7.2 |
| 2 | mech | 6.3 |
| 6 | cs | 9.1 |
| 4 | eee | 8.2 |
| 1 | cs | 5.5 |
+------+--------+------+
5 rows in set (0.001 sec)
SELECT DISTINCT * FROM student;
+------+--------+------+
| Id | Branch | CGPA |
+------+--------+------+
| 3 | civil | 7.2 |
| 2 | mech | 6.3 |
| 6 | cs | 9.1 |
| 4 | eee | 8.2 |
| 1 | cs | 5.5 |
+------+--------+------+
5 rows in set (0.001 sec)
SELECT * FROM student GROUP BY Branch;
+------+--------+------+
| Id | Branch | CGPA |
+------+--------+------+
| 3 | civil | 7.2 |
| 6 | cs | 9.1 |
| 4 | eee | 8.2 |
| 2 | mech | 6.3 |
+------+--------+------+
4 rows in set (0.001 sec)
如果不使用一些额外的子句或条件,有时GROUP by子句可以实现的结果无法通过DISTINCT实现。如上述情况。
要得到与DISTINCT相同的结果,您必须在GROUP BY子句中传递所有列名,如下所示。看看句法上的区别。在这种情况下,您必须了解所有列名才能使用GROUP BY子句。
SELECT * FROM student GROUP BY Id, Branch, CGPA;
+------+--------+------+
| Id | Branch | CGPA |
+------+--------+------+
| 1 | cs | 5.5 |
| 2 | mech | 6.3 |
| 3 | civil | 7.2 |
| 4 | eee | 8.2 |
| 6 | cs | 9.1 |
+------+--------+------+
此外,我还注意到GROUP BY默认情况下以升序显示结果,而DISTINCT则不会。但我不太确定。这可能是不同的供应商。
来源:https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by
其他回答
功能效率是完全不同的。 如果你想只选择“返回值”,除了重复的一个,使用distinct比group by更好。因为“group by”包括(排序+删除),“distinct”包括(删除)
当你指的是DISTINCT时,请不要使用GROUP BY,即使它们的工作方式是一样的。我假设您正在尝试从查询中减少毫秒数,我必须指出,开发人员的时间比计算机的时间要昂贵几个数量级。
没有区别(至少在SQL Server中)。两个查询使用相同的执行计划。
http://sqlmag.com/database-performance-tuning/distinct-vs-group
如果有子查询,可能会有区别:
http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/
没有区别(oracle风格):
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212
在这个特定的查询中没有区别。但是,当然,如果您添加任何聚合列,那么就必须使用group by。
它们具有不同的语义,即使它们恰好在特定数据上具有相同的结果。