下面先来看看例子: table表 字段1 字段2 id name 1 a 2 b 3 c 4 c 5 b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。 比如我想用一条语句查询得到name不重复的所有数据,那就必须 使用distinct去掉多余的重复记录。 select distinct name from table 得到的结果是: ---------- name a c 好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧: select distinct name, id from table 结果会是: ---------- id name 1 a 2 b 3 c 4 c 5 b distinct怎么没起作用?作用是起了的,不过他同时作用了两个 字段,也就是必须得id与name都相同的才会被排除 我们再改改查询语句: select id, distinct name from table 很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。 -------------------------------------------------------- 下面方法可行: select *, count(distinct name) from table group by name 结果: id name count(distinct name) 1 a 1 2 b 1 3 c 1 最后一项是多余的,不用管就行了,目的达到 group by 必须放在 order by 和 limit之前,不然会报错
(1)用于删除重复记录时,必须放在所有字段前面;若是聚合统计时,则放在聚合函数内所统计字段前面。 是其后所有字段。 (2)如果跟group by 一起使用,查询的效率会高一些。
是,必须这样做2、distinct的限定范围,是紧随其后的那个字段,还是其后所有字段。
其后所有的字段,和 group by 的那种效果一样。只是处理方式不一样,group by 还能做其他的事。
有没有讲解的特别细致的书籍或资料,谢谢。sql server inside系列 有讲一点儿。lz可以参考看看。
另外就是外国大牛写的一些东西。 lz google一下吧。
有没有讲解的特别细致的书籍或资料,谢谢。
你可以到 MSDN 上看看,那里东西很多
http://msdn.microsoft.com/library/
看一下上面的technet上的语法表达式你的问题就应该很清楚了。SELECT [ ALL | DISTINCT ]
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]
<select_list>
<select_list> ::=
{
*
| { table_name | view_name | table_alias }.*
| {
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
| udt_column_name [ { . | :: } { { property_name | field_name }
| method_name ( argument [ ,...n] ) } ]
| expression
[ [ AS ] column_alias ]
}
| column_alias = expression
} [ ,...n ]
http://item.jd.com/10080177.html你可以先从电子版的去过下
table表
字段1 字段2
id name
1 a
2 b
3 c
4 c
5 b
库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。
比如我想用一条语句查询得到name不重复的所有数据,那就必须
使用distinct去掉多余的重复记录。
select distinct name from table
得到的结果是:
----------
name
a
c
好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:
select distinct name, id from table
结果会是:
----------
id name
1 a
2 b
3 c
4 c
5 b
distinct怎么没起作用?作用是起了的,不过他同时作用了两个
字段,也就是必须得id与name都相同的才会被排除
我们再改改查询语句:
select id, distinct name from table
很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。
--------------------------------------------------------
下面方法可行:
select *, count(distinct name) from table group by name
结果:
id name count(distinct name)
1 a 1
2 b 1
3 c 1
最后一项是多余的,不用管就行了,目的达到
group by 必须放在 order by 和 limit之前,不然会报错
是其后所有字段。
(2)如果跟group by 一起使用,查询的效率会高一些。
distinct行级的,必须放在所有字段开头
2、distinct的限定范围,是紧随其后的那个字段,还是其后所有字段。
因为distinct是行级的,因此是其后所有的字段,虽然group by也有这种效果,但是,group by的主要用途还是分组查询。