如果我有一张桌子

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和other distinct

其他回答

如果问题允许,请尝试使用EXISTS,因为它被优化为只要找到结果就结束(并且不缓冲任何响应),因此,如果您只是试图为这样的WHERE子句规范化数据

SELECT FROM SOMETHING S WHERE S.ID IN ( SELECT DISTINCT DCR.SOMETHING_ID FROM DIFF_CARDINALITY_RELATIONSHIP DCR ) -- to keep same cardinality

更快的回答是:

SELECT FROM SOMETHING S WHERE EXISTS ( SELECT 1 FROM DIFF_CARDINALITY_RELATIONSHIP DCR WHERE DCR.SOMETHING_ID = S.ID )

这并不总是可行的,但当可用时,你会看到一个更快的响应。

SELECT DISTINCT总是和GROUP BY一样,或者比GROUP BY更快。在某些系统上(例如Oracle),对于大多数查询,它可能被优化为与DISTINCT相同。在其他的(如SQL Server)上,它可能要快得多。

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

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

(更多的是功能性说明)

有些情况下,你必须使用GROUP BY,例如,如果你想获得每个雇主的员工数量:

SELECT u.employer, COUNT(u.id) AS "total employees" FROM users u GROUP BY u.employer

在这种情况下,DISTINCT u.c uemployer就行不通了。也许有办法,只是我不知道。(如果有人知道如何使用DISTINCT进行这样的查询,请添加注释!)