vav*_*ava 269 mysql sql database group-by distinct
如果我有一张桌子
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)
)
Run Code Online (Sandbox Code Playgroud)
我希望获得所有独特的profession字段值,更快(或推荐):
SELECT DISTINCT u.profession FROM users u
Run Code Online (Sandbox Code Playgroud)
要么
SELECT u.profession FROM users u GROUP BY u.profession
Run Code Online (Sandbox Code Playgroud)
?
Squ*_*Cog 248
它们本质上是相互对应的(实际上这是一些数据库DISTINCT在引擎盖下实现的方式).
如果其中一个更快,它就会变得更快DISTINCT.这是因为,虽然两者是相同的,但查询优化器必须抓住这样一个事实:你GROUP BY没有利用任何组成员,只有他们的密钥.DISTINCT使这个显而易见,所以你可以使用稍微笨拙的优化器.
如有疑问,请测试!
Qua*_*noi 98
如果您有索引profession,则这两个是同义词.
如果你不这样做,那就用吧DISTINCT.
GROUP BY在MySQL各种结果.你甚至可以这样做:
SELECT u.profession FROM users u GROUP BY u.profession DESC
Run Code Online (Sandbox Code Playgroud)
让你的职业按DESC顺序排序.
DISTINCT创建一个临时表并使用它来存储重复项.GROUP BY做同样的事情,但事后对不同的结果进行排序.
所以
SELECT DISTINCT u.profession FROM users u
Run Code Online (Sandbox Code Playgroud)
如果您没有索引,则更快profession.
dan*_*ndi 16
上面的所有答案都是正确的,对于单列上的DISTINCT与单列上的GROUP BY的情况.每个数据库引擎都有自己的实现和优化,如果你关心的差别很小(在大多数情况下),那么你必须针对特定的服务器和特定版本进行测试!随着实施可能会改变......
但是,如果您在查询中选择了多个列,那么DISTINCT本质上是不同的!因为在这种情况下,它将比较所有行的所有列,而不是仅比较一列.
所以如果你有类似的东西:
// This will NOT return unique by [id], but unique by (id,name)
SELECT DISTINCT id, name FROM some_query_with_joins
// This will select unique by [id].
SELECT id, name FROM some_query_with_joins GROUP BY id
Run Code Online (Sandbox Code Playgroud)
认为DISTINCT关键字按行指定的第一列来区分行是一个常见的错误,但DISTINCT是这种方式的通用关键字.
因此,人们必须小心,不要将上述答案视为所有情况的正确答案......您可能会感到困惑并得到错误的结果,而您想要的只是优化!
小智 7
在某些情况下,在明亮的情况下,明显不同于组(不了解其他dbs).
测试示例:
postgres=# select count(*) from (select distinct i from g) a;
count
10001
(1 row)
Time: 1563,109 ms
postgres=# select count(*) from (select i from g group by i) a;
count
10001
(1 row)
Time: 594,481 ms
Run Code Online (Sandbox Code Playgroud)
http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I
所以要小心...... :)
Group by比Distinct贵,因为Group by对结果进行排序而明显避免它.但是如果你想通过yield得到与group相同的结果,则按null命令.
SELECT DISTINCT u.profession FROM users u
Run Code Online (Sandbox Code Playgroud)
等于
SELECT u.profession FROM users u GROUP BY u.profession order by null
Run Code Online (Sandbox Code Playgroud)
似乎查询不完全相同.至少对于MySQL.
相比:
第二个查询在Extra中另外提供了"Using filesort".
| 归档时间: |
|
| 查看次数: |
174731 次 |
| 最近记录: |