mysql中having和group by命令使用详解

利用 Mysql 中的的聚合函数 count(*) 可以实现这个功能,例如需要查询 user 表中 name 出现次数最多的记录,可以先按照 group by name 分组,用 count 算出分组里的条数,再按照 count 排序,SQL语句如下:

select name,count(*) from user group by name order by count(*) DESC limit 1;

不加limit限制将返回按照name重复次数排列的数据。

在使用聚合函数之前,我们可以通过 where 对查询加限制条件,那么如果在 group by 之后我们要对分组里面的数据再加限制条件怎么办呢?答案是利用 having。

having 子句可以让我们筛选成组后的各组数据。

where 子句在聚合前先筛选记录,也就是说作用在 GROUP BY 子句和 HAVING 子句前。而 having 子句是在聚合后对组记录进行筛选。

having 子句出现的数据必须在 group by 之后,order by 之后。

对 name 按照出现次数排序之后,我们还想只查出名字里面含有 lin 的数据,可以这样写:

select name ,count(*)  from user group by name having name like '%lin%' order by couny(*) DESC;

mysql中group by having 用法需要注意的事项:

GROUP BY:

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by后面。

比如 select name,sum(point) from table_name

这样sql语句会报错,必须写成:

select name,sum(point) from table_name GROUP BY name

HAVING

把 HAVING 加入 SQL 的原因是,WHERE 无法应用于合计函数,而如果没有 HAVING,就无法测试结果条件。

select name,sum(point)
from table_name GROUP BY name
HAVING sum(point)>1000

例子

mysql表结构

mysql> desc t;
+——-+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————–+——+—–+———+——-+
| id | int(11) | YES | | 0 | |
| name | varchar(100) | YES | | NULL | |
| aa | varchar(45) | YES | | NULL | |
+——-+————–+——+—–+———+——-+
3 rows in set (0.01 sec)

插入数据

mysql> select * from t;
+——+——+——-+
| id | name | aa |
+——+——+——-+
| 1 | aaaa | bbbb |
| 1 | 1111 | 2222 |
| 1 | 2222 | 33333 |
| 1 | 2222 | 44444 |
| 2 | 2222 | 44444 |
| 2 | 2222 | 1111 |
| 3 | 2222 | 1111 |
| 1 | 2222 | 44444 |
| 1 | 2222 | 44444 |
| 1 | 2222 | 44444 |
| 3 | 2222 | aaaa |
+——+——+——-+
11 rows in set (0.00 sec)
group by 查询语句

mysql> select id,count(1) ,aa from t group by id;
+——+———-+——-+
| id | count(1) | aa |
+——+———-+——-+
| 1 | 7 | bbbb |
| 2 | 2 | 44444 |
| 3 | 2 | 1111 |
+——+———-+——-+
3 rows in set (0.00 sec)

在本试验中,一共select id,count(1),aa,结果group by按照规则,除了聚合函数(count(1))外,其他两列(id,aa)都应该包含在group by中,可是试验只是包含了id。
对试验结果的说明
1、包含在group by后面的id列的count(1)统计数据为正确的
2、按照正常思维,aa的数据不能展示出来,可是mysql选择了展示表中aa数据的第一条
3、上述2也是个人猜测,暂时未查到官方相关说明

mysql group by having 用法

group by就是按照不同的字段进行分组,数值可以实现汇总
例如数据库中有A表,包括学生,学科,成绩三个字段
数据库结构为

学生 学科 成绩
张三 语文 80
张三 数学 100
李四 语文 70
李四 数学 80
李四 英语 80
那么
select 学生,sum(成绩) from A group by 学生;
得到如下结果
学生 成绩
张三 180
李四 230
==============================================================
如果考虑having
语句写成:
select 学生,sum(成绩) from A group by 学生 having 成绩=80;
得到结果就是这样的
学生 成绩
张三 80
李四 160
用having比 JOIN ON 相对好理解一些,简单一些。
mysql中group by having 用法需要注意的事项:
GROUP BY:
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by后面。
比如:

select name,sum(point) from table_name
这样sql语句会报错,必须写成:

select name,sum(point) from table_name GROUP BY name
HAVING
把 HAVING 加入 SQL 的原因是,WHERE 无法应用于合计函数,而如果没有 HAVING,就无法测试结果条件。

select name,sum(point)
from table_name GROUP BY name
HAVING sum(point)>1000
having通常和group by联合使用.

时间: 2025-01-07 19:03:24

mysql中having和group by命令使用详解的相关文章

MySQL 中修改密码及访问限制设置详解

mysql|访问|详解 MySQL中修改密码及访问限制设置详解 MySQL是一个真正的多用户.多线程SQL数据库服务器.MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成.由于其源码的开放性及稳定性,且与网站流行编?挥镅?PHP的完美结合,现在很多站点都利用其当作后端数据库,使其获得了广泛应用.处于安全方面的考虑,需要为每一用户赋于对不同数据库的访问限制,以满足不同用户的要求.下面就分别讨论,供大家参考. 一.MySQL修改密码方法总结 首

MySQL中修改密码及访问限制设置详解

mysql|访问|详解 MySQL是一个真正的多用户.多线程SQL数据库服务器.MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成.由于其源码的开放性及稳定性,且与网站流行编徎语言PHP的完美结合,现在很多站点都利用其当作后端数据库,使其获得了广泛应用.处于安全方面的考虑,需要为每一用户赋于对不同数据库的访问限制,以满足不同用户的要求.下面就分别讨论,供大家参考. 一.MySQL修改密码方法总结首先要说明一点的是:一般情况下,修改MySQL

mysql中int(1)和int(11)区别详解

mysql字段定义中INT(x)中的x仅仅指的是显示宽度.该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示.所以x的定义与存储空间没有任何关系都是4个字节. 作为SQL标准的扩展,MySQL也支持整数类型TINYINT.MEDIUMINT和BIGINT.下面的表显示了需要的每个整数类型的存储和范围. 类型 字节 最小值 最大值     (带符号的/无符号的) (带符号的/无符号的) TINYINT 1

MySQL中CHAR和VARCHAR类型演变和详解_Mysql

一.演变: MySQL数据库的varchar类型在5.0.3以下的版本中的最大长度限制为255,其数据范围可以是0~255. 在MySQL5.0.3及以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字节,也就是说,在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以在高版本中使用可变长的varchar来存放,这样就能有效的减少数据库文件的大小. 如果在varchar中写入大于设定的长度,默认情况下会

MySql中Where语句IN的排序方法详解

mysql在批量查询时,通过in查询的结果和in中的值的顺序并不一致,对此mysql也有针对in的排序方式.具体查询如下: 第一种方式,order by field,按字段查询,示例: select * from table where id in (5,3,6,1) order by field(id,5,3,6,1): 排序过程:把选出的记录的 id 在 FIELD 列表中进行查找,并返回位置,以位置作为排序依据. 注意:这样的用法,会导致 Using filesort,是效率很低的排序方式

mysql中mysqldumper安装、使用和参数详解

mysqldumper这个备份工具比较好的点很明显,就是可以并发备份,比mysqldump要快些,另一个就是备份的表是单独的文件,恢复单表时会很方便(表结构和数据文件也是分开一个文件的). 一.下载安装 下载最新的mysqldumper mysqldumper 下载地址:https://launchpadlibrarian.net/185032423/mydumper-0.6.2.tar.gz [root@mysql.dmc.com ]$tar -zxvf mydumper-0.6.2.tar.

MySQL缓存的查询和清除命令使用详解_Mysql

Mysql 查询缓存 查询缓存的作用就是当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询.这样就大大提高了性能,节省时间. 1.配置查询缓存 修改配置文件,修改[mysqld]下的query_cache_size和query_cache_type(如果没有则添加).其中query_cache_size表示缓存的大小,而query_cache_type有3个值,表示缓存那种类  型的select结果集,query_cache_type各个值如下: 0

MYsql中NULL与空字符串空区别详解

对于SQL的新手,NULL值的概念常常会造成混淆,他们常认为NULL与MySQL空字符串是相同的事.情况并非如此.例如,下述语句是完全不同的:MySQL> INSERT INTO my_table (phone) VALUES (NULL);  代码如下 复制代码 mysql> INSERT INTO my_table (phone) VALUES ('');   这两条语句均会将值插入phone(电话)列,但第1条语句插入的是NULL值,第2条语句插入的是空字符串.第1种情况的含义可被解释为

Linux中Awk常用文本处理命令用法详解

I. NR,FNR记录当前行 [root@LinuxEA awk]# cat nr1 1 a 2 b 3 c 4 d 5 e [root@LinuxEA awk]# awk '{print FNR}' nr1 1 2 3 4 5 6 [root@LinuxEA awk]# awk '{print NR}' nr1 1 2 3 4 5 6 [root@LinuxEA awk]# awk '{print "行. = " NR " 数据 = " RNR,$0}' nr1