【MySQL】单表查询中的分组查询与限制查询

558 阅读4分钟

本人已参与「新人创作礼」活动,一起开启掘金创作之路。

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

目录

232E69F7.gif 今天阿文介绍的内容:

  • 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;

查询结果为:

image.png

  • 在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;

查询结果为:

image.png

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;

查询结果为:

image.png

提示: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;

查询结果为:

image.png

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;

查询结果为:

image.png

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);

查询结果为:

image.png

提示: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;

查询结果为:

image.png

语法格式如下:

SELECT * FROM 表名 LIMIT 4,3;

该SQL语句表示查询该表从第5行开始之后的3条记录。

例子:

SELECT * FROM fruits LIMIT 4,3;

查询结果为;

image.png

提示:

在MySQL 8.0中可以使用“LIMIT 4 OFFSET 3”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。


总结:

  • 分组查询使用关键字GROUP BY,也是可以实现多字段的分组,与ORDER BY一起使用可以将分组后数据进行排序,HAVING关键字可以将分组后的数据进行筛选过滤。
  • LIMIT关键字可以实现单行或多行数据查询,使用它可以实现分页查询

好了,今天阿文就介绍到这了...

232DADEB.gif