mysql distinct&group by 应用

在使用mysql时,有时须要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但每每只用它来返回不重复记录的条数,而不是用它来返回不重记录的全部值。其缘由是 distinct只能返回它的目标字段,而没法返回其它字段,这个问题让我困扰了好久,用distinct不能解决的话,我只有用二重循环查询来解决,而 这样对于一个数据量很是大的站来讲,无疑是会直接影响到效率的。因此我花了不少时间来研究这个问题,网上也查不到解决方案mysql

下面先来看看例子:sql

     table
   id name
   1 a
   2 b
   3 c
   4 c
   5 bapp

库结构大概这样,这只是一个简单的例子,实际状况会复杂得多。函数

好比我想用一条语句查询获得name不重复的全部数据,那就必须使用distinct去掉多余的重复记录。spa

select distinct name from table
获得的结果是:设计

   name
   a
   b
   c开发

好像达到效果了,但是,我想要获得的是id值呢?改一下查询语句吧:it

select distinct name, id from tabletable

结果会是:class

   id name
   1 a
   2 b
   3 c
   4 c
   5 b

distinct怎么没起做用?做用是起了的,不过他同时做用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

咱们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。

很麻烦吧?确实,费尽心思都没能解决这个问题。

 

用count函数一试,成功,我。。。。。。。想哭啊,费了这么多工夫。。。。。。。。原来就这么简单。。。。。。

如今将完整语句放出:

select *, count(distinct name) from table group by name

结果:

   id name count(distinct name)
   1 a 1
   2 b 1
   3 c 1

最后一项是多余的,不用管就好了,目的达到。。。。。

唉,原来mysql这么笨,轻轻一下就把他骗过去了,郁闷也就我吧(对了,还有容容那家伙),如今拿出来但愿你们不要被这问题折腾。

哦,对,再顺便说一句,group by

 

 

 

 

 

mysql group by 用法解析(详细)

group by 用法解析
group by语法能够根据给定数据列的每一个成员对查询结果进行分组统计,最终获得一个分组汇总表。
SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每一个组各返回一个结果。
某个员工信息表结构和数据以下:
  id  name  dept  salary  edlevel  hiredate 
      1 张三 开发部 2000 3 2009-10-11
      2 李四 开发部 2500 3 2009-10-01
      3 王五 设计部 2600 5 2010-10-02
      4 王六 设计部 2300 4 2010-10-03
      5 马七 设计部 2100 4 2010-10-06
      6 赵八 销售部 3000 5 2010-10-05
      7 钱九 销售部 3100 7 2010-10-07
      8 孙十 销售部 3500 7 2010-10-06 
例如,我想列出每一个部门最高薪水的结果,sql语句以下:
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
查询结果以下:
      DEPT  MAXIMUM 
      开发部 2500
      设计部 2600
      销售部 3500
解释一下这个结果:
一、知足“SELECT子句中的列名必须为分组列或列函数”,由于SELECT有GROUP BY DEPT中包含的列DEPT。
二、“列函数对于GROUP BY子句定义的每一个组各返回一个结果”,根据部门分组,对每一个部门返回一个结果,就是每一个部门的最高薪水。
注意:计算的是每一个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
例如,查询每一个部门的总的薪水数
SELECT DEPT, sum( SALARY ) AS total
FROM STAFF
GROUP BY DEPT
查询结果以下:
DEPT  total 
开发部 4500
设计部 7000
销售部 9600
将 WHERE 子句与 GROUP BY 子句一块儿使用
分组查询能够在造成组和计算列函数以前具备消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句以前指定 WHERE 子句。
例如,查询公司2010年入职的各个部门每一个级别里的最高薪水
SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff
WHERE HIREDATE > '2010-01-01'
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL
查询结果以下:
  DEPT  EDLEVEL  MAXIMUM 
      设计部 4 2300
      设计部 5 2600
      销售部 5 3000
      销售部 7 3500
注意:在SELECT语句中指定的每一个列名也在GROUP BY子句中提到。未在这两个地方提到的列名将产生错误。
GROUP BY子句对DEPT和EDLEVEL的每一个惟一组合各返回一行。
在GROUP BY子句以后使用HAVING子句可应用限定条件进行分组,以便系统仅对知足条件的组返回结果。为此,在GROUP BY子句后面包含一个HAVING子句。HAVING子句可包含一个或多个用AND和OR链接的谓词。每一个谓词将组特性(如AVG(SALARY))与下列之一进行比较:例如:寻找雇员数超过2个的部门的最高和最低薪水:SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUMFROM staffGROUP BY DEPTHAVING COUNT( * ) >2ORDER BY DEPT查询结果以下:  DEPT  MAXIMUM  MINIMUM       设计部 2600 2100      销售部 3500 3000例如:寻找雇员平均工资大于3000的部门的最高和最低薪水:SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUMFROM staffGROUP BY DEPTHAVING AVG( SALARY ) >3000ORDER BY DEPT查询结果以下:  DEPT  MAXIMUM  MINIMUM       销售部 3500 3000