本人已参与「新人创作礼」活动,一起开启掘金创作之路。
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
目录
今天阿文介绍的内容:
- GROUP BY关键字
- LIMIT关键字
1.分组查询
在MySQL中使用GROUP BY关键字对数据按照某个或多个字段进行分组查询
语法格式如下:
[GROUP BY 字段] [HAVING <条件表达式>]
1.1创建分组
语法格式如下:
SELECT 字段1,COUNT(*) AS Total FROM 表名 GROUP BY 字段1;
该条SQL语句表示,以字段1进行分组,COUNT(*)统计每一组的数量Total(起别名)。
例子:
SELECT s_id, COUNT(*) AS Total FROM fruits GROUP BY s_id;
查询结果为:
- 在MySQL中,可以在GROUP BY子句中使用
GROUP_CONCAT()函数,将每个分组中各个字段的值显示出来。
语法格式如下:
SELECT 字段1,GROUP_CONCAT(字段2) AS Names FROM 表名 GROUP BY 字段1;
该条SQL语句表示,以字段1进行分组,GROUP_CONCAT(字段2)表示在每个分组中包含字段2中的值,列名为Names(起别名)。
例子:
SELECT s_id, GROUP_CONCAT(f_name) AS TotalName FROM fruits GROUP BY s_id;
查询结果为:
1.2HAVING过滤分组
在分组查询记录时,我们需要将一些数据过滤掉,MySQL提供了HAVING关键字来对数据进行过滤。
语法格式如下:
SELECT 字段1,GROUP_CONCAT(字段2) AS Names FROM 表名 GROUP BY 字段1 HAVING COUNT(字段2) > 1;
该条SQL语句表示,以字段1进行分组,GROUP_CONCAT(字段2)表示在每个分组中包含字段2中的值,列名为Names(起别名)。并对数据进行筛选,筛选出Names中数量大于1的数据。
例子:
SELECT s_id, GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id HAVING COUNT(f_name) > 1;
查询结果为:
提示:HAVING与WHERE的区别
HAVING在数据分组之后进行过滤来选择分组,而WHERE在分组之前来选择记录。另外,WHERE排除的记录不再包括在分组中。
1.3WITH ROLLUP
在查询出数据后,我们需要对数据进行一个汇总统计,MySQL提供WITH ROLLUP关键字,计算查询出的所有记录的总和。
语法格式如下:
SELECT 字段1,COUNT(*) AS Total FROM 表名 GROUP BY 字段1 WITH ROLLUP;
该条SQL语句表示,以字段1进行分组,COUNT(*)统计每一组的数量Total(起别名)。在数据最后会多出一行记录总和是数据。
例子:
SELECT s_id, COUNT(*) FROM fruits GROUP BY s_id WITH ROLLUP;
查询结果为:
1.4多字段分组
在MySQL中,GROUP BY可以对多个字段分组,GROUP BY关键字后面跟需要分组的字段,MySQL根据多字段的值来进行层次分组,分组层次从左到右,即先按第1个字段分组,然后在第1个字段值相同的记录中再根据第2个字段的值进行分组,以此类推。
语法格式如下:
SELECT * FROM 表名 GROUP BY 字段1,字段2,...;
例子:
SELECT s_id, f_id FROM fruits GROUP BY s_id, f_id;
查询结果为:
1.5GROUP BY和ORDER BY一起使用
在MySQL中进行分组的顺序,可以通过关键字ORDER BY进行修改。
SELECT 字段1,GROUP_CONCAT(字段2) AS Names FROM 表名 GROUP BY 字段1 HAVING COUNT(字段2) > 1 ORDER BY COUNT(字段2);
该条SQL语句表示,以字段1进行分组,GROUP_CONCAT(字段2)表示在每个分组中包含字段2中的值,列名为Names(起别名)。并对数据进行筛选,筛选出Names中数量大于1的数据,并按数量大小进行排序。
例子:
SELECT s_id, GROUP_CONCAT(f_name) AS Names FROM fruits GROUP BY s_id HAVING Names > 1 ORDER BY COUNT(f_name);
查询结果为:
提示:ROLLUP与ORDER BY
当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。
2.LIMIT限制查询结果的数量
在MySQL中使用SELECT查询,所查询出的是所有的数据,当我们只需要查询第一行或前几行时,可以使用LIMIT关键字进行查询。
LIMIT [位置偏移量,] 行数
位置偏移量:表示从哪一行开始显示,默认为0,即从第一行开始查询。
行数:表示返回的记录条数。
语法格式如下:
SELECT * FROM 表名 LIMIT 4;
该SQL语句表示查询该表前4行记录。
例子:
SELECT * FROM fruits LIMIT 4;
查询结果为:
语法格式如下:
SELECT * FROM 表名 LIMIT 4,3;
该SQL语句表示查询该表从第5行开始之后的3条记录。
例子:
SELECT * FROM fruits LIMIT 4,3;
查询结果为;
提示:
在MySQL 8.0中可以使用“LIMIT 4 OFFSET 3”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。
总结:
- 分组查询使用关键字GROUP BY,也是可以实现多字段的分组,与ORDER BY一起使用可以将分组后数据进行排序,HAVING关键字可以将分组后的数据进行筛选过滤。
- LIMIT关键字可以实现单行或多行数据查询,使用它可以实现
分页查询
好了,今天阿文就介绍到这了...