如果我有一张桌子

CREATE TABLE users (
  id int(10) unsigned NOT NULL auto_increment,
  name varchar(255) NOT NULL,
  profession varchar(255) NOT NULL,
  employer varchar(255) NOT NULL,
  PRIMARY KEY  (id)
)

我想获得所有专业领域的独特价值,什么会更快(或建议):

SELECT DISTINCT u.profession FROM users u

or

SELECT u.profession FROM users u GROUP BY u.profession

?


当前回答

Group by比Distinct代价更大,因为Group by对结果进行排序,而Distinct则避免排序。但如果你想让group by产生与distinct相同的结果,请给order by null ..

SELECT DISTINCT u.profession FROM users u

等于

SELECT u.profession FROM users u GROUP BY u.profession order by null

其他回答

似乎这些查询并不完全相同。至少对MySQL是这样。

比较:

描述从northwind.products中选择不同的产品名称 描述从北风选择的产品名称。产品组按产品名称

第二个查询在Extra中额外给出了“Using filesort”。

如果可以,尽量选择最简单、最简短的答案——DISTINCT似乎更符合你的要求,因为它会给你你需要的答案,而且只有这个答案!

下面是一个简单的方法,它将为每个查询打印2个不同的运行时间。

DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;

SET @t1 = GETDATE();
SELECT DISTINCT u.profession FROM users u; --Query with DISTINCT
SET @t2 = GETDATE();
PRINT 'Elapsed time (ms): ' + CAST(DATEDIFF(millisecond, @t1, @t2) AS varchar);

SET @t1 = GETDATE();
SELECT u.profession FROM users u GROUP BY u.profession; --Query with GROUP BY
SET @t2 = GETDATE();
PRINT 'Elapsed time (ms): ' + CAST(DATEDIFF(millisecond, @t1, @t2) AS varchar);

或尝试设置统计时间(Transact-SQL)

SET STATISTICS TIME ON;
SELECT DISTINCT u.profession FROM users u; --Query with DISTINCT
SELECT u.profession FROM users u GROUP BY u.profession; --Query with GROUP BY
SET STATISTICS TIME OFF;

它简单地显示了解析、编译和执行每条语句所需的毫秒数,如下所示:

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 2 ms.

在MySQL中,“Group By”使用了一个额外的步骤:文件排序。我意识到DISTINCT比GROUP BY快,这是一个惊喜。

在mySQL中,我发现GROUP BY将NULL视为不同的,而distinct不是。 采取完全相同的DISTINCT查询,删除了DISTINCT,并将所选字段添加为GROUP BY,并且由于其中一个字段为NULL,我得到了更多的行。

所以. .我倾向于相信mySQL中有更多的DISTINCT。