有时需要查询出某个字段不重复的记录,列函数对于 group by

  • 栏目:数据 时间:2020-05-15 12:01
<返回列表

可按照在 GROUP BY 子句中定义的组对行进行分组。以其最简单的形式,组由称为分组列的列组成。 SELECT 子句中的列名必须为分组列或列函数。列函数对于 GROUP BY 子句定义的每个组各返回一个结果

一、MYSQL-distinct用法

sql 对相对数据进行分组查询语句/*|

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

section | province | area | zone | postcode | cardtype | telco |

| 1879728 | 青海 | 共和 | 0974 | 813000 | 移动187卡 | 移动 || 1879741 | 湖南 | 长沙 | 0731 | 410000 | 移动187卡 | 移动 || 1889927 | 新疆 | 和田 | 0903 | 848000 | 新疆移动全球通卡 | 移动 || 1889930 | 新疆 | 哈密 | 0902 | 839000 | 新疆移动全球通卡 | 移动 || 1893300 | 广东 | 佛山 | 0757 | 528100 | 广东电信cdma卡 | 电信 || 1893319 | 广东 | 广州 | 020 | 510000 | 广东电信cdma卡 | 电信 |

下面先来看看例子:

*/

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

$sql =select * from table where xxx group by left(section, 3);

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

/*

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

left(str,len) 语法返回字符串str的最左面len个字符。mysql教程 select left('foobarbar', 5); - 'fooba'

select distinct name from table
得到的结果是:

该函数是多字节可靠的。

name
a
b
c

group by 分组 通用数据库教程具有基于表的特定列对数据进行分析的能力。 可按照在 group by 子句中定义的组对行进行分组。以其最简单的形式,组由称为分组列的列组成。 select 子句中的列名必须为分组列或列函数。列函数对于 group by 子句定义的每个组各返回一个结果

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

select sex,max(ages) as age from table group by sex;

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条件里?能,照样报错。。。。。。。

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

用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
解释一下这个结果:
1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有GROUP BY DEPT中包含的列DEPT。
2、“列函数对于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 MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT( * ) >2
ORDER BY DEPT
查询结果如下:
DEPT MAXIMUM MINIMUM
设计部 2600 2100
销售部 3500 3000
例如:寻找雇员平均工资大于3000的部门的最高和最低薪水:
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING AVG( SALARY ) >3000
ORDER BY DEPT
查询结果如下:
DEPT MAXIMUM MINIMUM
销售部 3500 3000

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

上一篇:3.在全文检索目录中注册需要全文索引的表(sp 下一篇:没有了

更多阅读

有时需要查询出某个字段不重复的记录,

数据 2020-05-15
可按照在 GROUP BY子句中定义的组对行进行分组。以其最简单的形式,组由称为分组列的列组成...
查看全文

分割再成批插入

数据 2020-05-15
分割再成批插入 原文地址:SQL字符串数组操作 文章出处:DIY部落(http://www.diybl.com/course/7_data...
查看全文

3.在全文检索目录中注册需要全文索引的

数据 2020-05-15
本文章来告诉你如何创建全文索引以及建立后的全文索引的查询操作,有需要了解可以看看。...
查看全文

友情链接: 网站地图

Copyright © 2015-2019 http://www.koi-bumi.com. 韦德体育有限公司 版权所有