group by怎么读(mysql group by怎么用)

本文目录
- mysql group by怎么用
- GROUP BY 用法
- GROUP BY,WHERE,HAVING之间的区别和用法
- mysql的group by怎么使用
- group by语句中where和having的区别
- SQL语句中的 Distinct 和 Group by 有什么不同,用那个好
- SQL中group by怎么与insert和update一起使用,具体什么意义,最好用例子说一下,
- SQL里面group by 语句和WHERE的区别,高手进
mysql group by怎么用
例子 aa表 a b
123 10
123 12
1234 11
1234 14
首先 group 是用来分组的 不是过滤重复项的。重复项删除语句 DISTINCT用这个 。 select DISTINCT(a) from aa
结果就是 a
123
1234
group by用来分组的
select a, sum(b) from aa group by a
sum意思是总和。结果就是
a b
123 22
1234 25
语句的目的是以a为目标 需要知道 相同名字的物品 在b列一共有多少数量总和
select a,count(b) from aa group by a
count 意思行数总和 结果就是
a b
123 2
1234 2
语句目的是 相同名字的物品 一共有几行
GROUP BY 用法
先把最多的记录的房间取出来,再行转列
Access时,参照
http://zhidao.baidu.com/question/158219080.html
以SQL Server为例,Oracle时用静态就行了
use Tempdb
go
--》 --》
if not object_id(N’Tempdb..#’) is null
drop table #
Go
Create table #([楼层] nvarchar(2),[房号] int)
Insert #
select N’一楼’,101 union all
select N’一楼’,102 union all
select N’一楼’,105 union all
select N’二楼’,201 union all
select N’二楼’,202 union all
select N’二楼’,205
Go
DECLARE @s NVARCHAR(2000),@i NVARCHAR(2)
SET @s=’’
Select TOP 1 @i=COUNT(*) from # GROUP BY 楼层 ORDER BY COUNT(*) desc
WHILE @i》0
SELECT @s=N’,max(case when con=’+@i+N’ then [房号] end) as 房间’+@i+@s,@i=@i-1
EXEC(’SELECT [楼层]’+@s+’ FROM (SELECT con=(SELECT COUNT(1) FROM # WHERE 楼层=a.楼层 AND [房号]《=a.[房号]),* FROM # a)a group by [楼层]’)
(6 个资料列受到影响)
楼层 房间1 房间2 房间3
---- ----------- ----------- -----------
一楼 101 102 105
二楼 201 202 205
(2 个资料列受到影响)
oracle:
SELECT [楼层],max(case when con=1 then [房号] end) as 房间1,max(case when con=2 then [房号] end) as 房间2,max(case when con=3 then [房号] end) as 房间3 FROM (SELECT con=(SELECT COUNT(1) FROM # WHERE 楼层=a.楼层 AND [房号]《=a.[房号]),* FROM # a)a group by [楼层]
GROUP BY,WHERE,HAVING之间的区别和用法
having子句与where有相似之处但也有区别,都是设定条件的语句。
在查询过程中聚合语(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。
简单说来: where子句: select sum(num) as rmb from order where id》10 //只有先查询出id大于10的记录才能进行聚合语句 having子句: select reportsto as manager, count(*) as reports from employees group by reportsto having count(*) 》 4
以northwind库为例.having条件表达示为聚合语句。肯定的说having子句查询过程执行优先级别低于聚合语句。再换句说话说把上面的having换成where则会出错。统计分组数据时用到聚合语句。 对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。 having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。
聚合函数,这是必需先讲的一种特殊的函数: 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 SELECT SUM(population) FROM tablename 这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有 国家的总人口数。 通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
tob_id_4294当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值. 也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值. HAVING子句可以让我们筛选成组后的各组数据. HAVING子句在聚合后对组记录进行筛选 而WHERE子句在聚合前先筛选记录,也就是说作用在GROUP BY 子句和HAVING子句前 。
mysql的group by怎么使用
在日常查询中,索引或其他数据查找的方法可能不是查询执行中最高昂的部分,例如:MySQL GROUP BY 可能负责查询执行时间 90% 还多。MySQL 执行 GROUP BY 时的主要复杂性是计算 GROUP BY 语句中的聚合函数。UDF 聚合函数是一个接一个地获得构成单个组的所有值。这样,它可以在移动到另一个组之前计算单个组的聚合函数值。当然,问题在于,在大多数情况下,源数据值不会被分组。来自各种组的值在处理期间彼此跟随。因此,我们需要一个特殊的步骤。
处理 MySQL GROUP BY让我们看看之前看过的同一张table: mysql》 show create table tbl G *************************** 1. row *************************** Table: tbl Create Table: CREATE TABLE `tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT ’0’, `g` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `k` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=2340933 DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
并且以不同方式执行相同的 GROUP BY 语句:
1、MySQL中 的 Index Ordered GROUP BY
mysql》 select k, count(*) c from tbl group by k order by k limit 5;
+---+---+
| k | c |
+---+---+
| 2 | 3 |
| 4 | 1 |
| 5 | 2 |
| 8 | 1 |
| 9 | 1 |
+---+---+
5 rows in set (0.00 sec)
mysql》 explain select k, count(*) c from tbl group by k order by k limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: index
possible_keys: k
key: k
key_len: 4
ref: NULL
rows: 5
filtered: 100.00
Extra: Using index
1 row in set, 1 warning (0.00 sec)
- 在这种情况下,我们在 GROUP BY 的列上有一个索引。这样,我们可以逐组扫描数据并动态执行 GROUP BY(低成本)。当我们使用 LIMIT 限制我们检索的组的数量或使用“覆盖索引”时,特别有效,因为顺序索引扫描是一种非常快速的操作。
- 2、MySQL 中的外部排序 GROUP BY
mysql》 explain select SQL_BIG_RESULT g, count(*) c from tbl group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 998490
filtered: 100.00
Extra: Using filesort
1 row in set, 1 warning (0.00 sec)
mysql》 select SQL_BIG_RESULT g, count(*) c from tbl group by g limit 5;
+---+---+
| g | c |
+---+---+
| 0 | 1 |
| 1 | 2 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
+---+---+
5 rows in set (0.88 sec)
- 如果我们没有允许我们按组顺序扫描数据的索引,我们可以通过外部排序(在 MySQL 中也称为“filesort”)来获取数据。你可能会注意到我在这里使用 SQL_BIG_RESULT 提示来获得这个计划。没有它,MySQL 在这种情况下不会选择这个计划。
- 3、MySQL中 的临时表 GROUP BY
mysql》 explain select g, sum(g) s from tbl group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 998490
filtered: 100.00
Extra: Using temporary
1 row in set, 1 warning (0.00 sec)
mysql》 select g, sum(g) s from tbl group by g order by null limit 5;
+---+------+
| g | s |
+---+------+
| 0 | 0 |
| 1 | 2 |
| 4 | 4 |
| 5 | 5 |
| 6 | 12 |
+---+------+
5 rows in set (7.75 sec)
- 在这种情况下,MySQL 也会进行全表扫描。但它不是运行额外的排序传递,而是创建一个临时表。此临时表每组包含一行,并且对于每个传入行,将更新相应组的值。很多更新!虽然这在内存中可能是合理的,但如果结果表太大以至于更新将导致大量磁盘 IO,则会变得非常昂贵。在这种情况下,外部分拣计划通常更好。请注意,虽然 MySQL 默认选择此计划用于此用例,但如果我们不提供任何提示,它几乎比我们使用 SQL_BIG_RESULT 提示的计划慢 10 倍 。您可能会注意到我在此查询中添加了“ ORDER BY NULL ”。这是为了向您展示“清理”临时表的唯一计划。没有它,我们得到这个计划: mysql》 explain select g, sum(g) s from tbl group by g limit 5 G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tbl partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 998490 filtered: 100.00 Extra: Using temporary; Using filesort 1 row in set, 1 warning (0.00 sec)
- 在其中,我们获得了 temporary 和 filesort “两最糟糕的”提示。MySQL 5.7 总是返回按组顺序排序的 GROUP BY 结果,即使查询不需要它(这可能需要昂贵的额外排序传递)。ORDER BY NULL 表示应用程序不需要这个。您应该注意,在某些情况下 - 例如使用聚合函数访问不同表中的列的 JOIN 查询 - 使用 GROUP BY 的临时表可能是唯一的选择。
- 4、MySQL 中的索引基于跳过扫描的 GROUP BY前三个 GROUP BY 执行方法适用于所有聚合函数。然而,其中一些人有第四种方法。
mysql》 explain select k,max(id) from tbl group by k G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: range
possible_keys: k
key: k
key_len: 4
ref: NULL
rows: 2
filtered: 100.00
Extra: Using index for group-by
1 row in set, 1 warning (0.00 sec)
mysql》 select k,max(id) from tbl group by k;
+---+---------+
| k | max(id) |
+---+---------+
| 0 | 2340920 |
| 1 | 2340916 |
| 2 | 2340932 |
| 3 | 2340928 |
| 4 | 2340924 |
+---+---------+
5 rows in set (0.00 sec)
- 此方法仅适用于非常特殊的聚合函数:MIN() 和 MAX()。这些并不需要遍历组中的所有行来计算值。他们可以直接跳转到组中的最小或最大组值(如果有这样的索引)。如果索引仅建立在 (K) 列上,如何找到每个组的 MAX(ID) 值?这是一个 InnoDB 表。记住 InnoDB 表有效地将 PRIMARY KEY 附加到所有索引。(K) 变为 (K,ID),允许我们对此查询使用 Skip-Scan 优化。仅当每个组有大量行时才会启用此优化。否则,MySQL 更倾向于使用更传统的方法来执行此查询(如方法#1中详述的索引有序 GROUP BY)。虽然我们使用 MIN() / MAX() 聚合函数,但其他优化也适用于它们。例如,如果您有一个没有 GROUP BY 的聚合函数(实际上所有表都有一个组),MySQL 在统计分析阶段从索引中获取这些值,并避免在执行阶段完全读取表: mysql》 explain select max(k) from tbl G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: NULL partitions: NULL type: NULL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL filtered: NULL Extra: Select tables optimized away 1 row in set, 1 warning (0.00 sec)
- 我们已经研究了 MySQL 执行 GROUP BY 的四种方式。为简单起见,我在整个表上使用了 GROUP BY,没有应用过滤。当您有 WHERE 子句时,相同的概念适用: mysql》 explain select g, sum(g) s from tbl where k》4 group by g order by NULL limit 5 G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tbl partitions: NULL type: range possible_keys: k key: k key_len: 4 ref: NULL rows: 1 filtered: 100.00 Extra: Using index condition; Using temporary 1 row in set, 1 warning (0.00 sec)
- 对于这种情况,我们使用K列上的范围进行数据过滤/查找,并在有临时表时执行 GROUP BY。在某些情况下,方法不会发生冲突。但是,在其他情况下,我们必须选择使用 GROUP BY 的一个索引或其他索引进行过滤:
mysql》 alter table tbl add key(g);
Query OK, 0 rows affected (4.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql》 explain select g, sum(g) s from tbl where k》1 group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: index
possible_keys: k,g
key: g
key_len: 4
ref: NULL
rows: 16
filtered: 50.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
mysql》 explain select g, sum(g) s from tbl where k》4 group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: range
possible_keys: k,g
key: k
key_len: 4
ref: NULL
rows: 1
filtered: 100.00
Extra: Using index condition; Using temporary; Using filesort
1 row in set, 1 warning (0.00 sec)
- 根据此查询中使用的特定常量,我们可以看到我们对 GROUP BY 使用索引顺序扫描(并从索引中“放弃”以解析 WHERE 子句),或者使用索引来解析 WHERE 子句(但使用临时表来解析 GROUP BY)。根据我的经验,这就是 MySQL GROUP BY 并不总是做出正确选择的地方。您可能需要使用 FORCE INDEX 以您希望的方式执行查询。
如果您有少量组,并且没有覆盖索引,索引顺序扫描可能会导致大量 IO。所以这可能不是最优化的计划。
一般来说,MySQL 只有在我们拥有大量组时才更喜欢使用这个计划,因为在这种情况下,排序比拥有临时表更有效(我们将在下面讨论)。
如果要强制 MySQL 使用为 GROUP BY 执行临时表的计划,可以使用 SQL_SMALL_RESULT 提示。
过滤和分组
group by语句中where和having的区别
having子句与where有相似之处但也有区别,都是设定条件的语句。
在查询过程中聚合语(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。
简单说来: where子句: select sum(num) as rmb from order where id》10 //只有先查询出id大于10的记录才能进行聚合语句 having子句: select reportsto as manager, count(*) as reports from employees group by reportsto having count(*) 》 4
以northwind库为例.having条件表达示为聚合语句。肯定的说having子句查询过程执行优先级别低于聚合语句。再换句说话说把上面的having换成where则会出错。统计分组数据时用到聚合语句。 对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。 having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。
聚合函数,这是必需先讲的一种特殊的函数: 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 SELECT SUM(population) FROM tablename 这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有 国家的总人口数。 通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
tob_id_4294当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值. 也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值. HAVING子句可以让我们筛选成组后的各组数据. HAVING子句在聚合后对组记录进行筛选 而WHERE子句在聚合前先筛选记录,也就是说作用在GROUP BY 子句和HAVING子句前 。
SQL语句中的 Distinct 和 Group by 有什么不同,用那个好
我不给你转摘枯燥难读的文章,给你用例子说明:
不过,首先我要说:它俩的作用完全不同,如果你只把group by当做去掉重复记录的工具,就太小看它了,
善于使用它,将会为你的工作带来极大的便利,而且能够制作出非常科学高效的报表!
group by主要是用来分组的,怎么个分组呢?
以下用两个例子说明两个使用方面,1是合理的返回合计值(防止笛卡尔积现象),2是用分组来找出重复的记录
====================================================================
★★★例子1:假如有这么一个表:tab_1,它有两个字段:xm、gzlb、je(姓名、工资类别、金额),具体数据如下:
xm```````gzlb`````````je
-----------------------------------------
张三`````养老金`````1000
张三`````护理费`````200
张三`````其他```````50
.............
李四`````养老金`````800
李四`````其他```````50
.............
王五`````养老金`````900
王五`````其他```````35
可以看出每个人的工资都是按类别存放的,如果要返回合计的数据,如:
张三``````1250
李四``````850
王五``````935
该怎么写SQL呢?初学者往往会这么写:select xm, sum(je) from tab_1;但结果会是什么样呢?结果将是:
张三``````1250
张三``````850
张三``````935
李四``````1250
李四``````850
李四``````935
王五``````1250
王五``````850
王五``````935
这是将全部字段都进行了所有的排列组合,即:笛卡尔积!要防止这个情况的发生,我们就可以用到group by(分组)了!
select xm, sum(je)
from tab_1
group by xm;
上面的SQL指定了用xm字段分组,这样一来就返回出正确的结果了:
张三``````1250
李四``````850
王五``````935
====================================================================
★★★例子2:假设又有这么一个表:tab_2,有这些字段:bh, xm, dah,……(编号、姓名、档案号、……),
比如有这样的情况:向该表录入数据的人员非常不认真,重复录入了不少数据,如:
bh``````xm```````dah
------------------------
1```````张三`````10001
2```````李四`````10002
3```````王五`````10003
………………
84``````张三`````10001
85``````赵六`````10004
………………
126`````王五`````10003
可以看出张三、王五各重复了一次,假设这个表有几万条数据,那么要查出究竟有多少重复的,该怎么查呢?
select bh, xm, dah
from tab_2
group by xm, sfzh
having count(*) 》= 2;
返回值为:
bh``````xm```````dah
------------------------
1```````张三`````10001
84``````张三`````10001
3```````王五`````10003
126`````王五`````10003
解释一下刚才的SQL:是从tab_2表中检索编号、姓名、档案号,怎么检索呢?是用姓名、档案号做为分组,分组的条件是记录数大于等于2的。
这个比喻很形象:having count()语句相对于group by语句,就相当于where语句相对于select语句
====================================================================
所以,group by 这个分组语句是非常有用的一个好东西,还是那句话:善于使用它将会为你的工作带来极大的便利,而且能够制作出非常科学高效的报表!
SQL中group by怎么与insert和update一起使用,具体什么意义,最好用例子说一下,
group by 是分组汇总功能。有时也可以用来取不重复行。
和insert及update一起使用,可以汇总数据,取max或是min等,还有就是去掉重复行。
SQL里面group by 语句和WHERE的区别,高手进
你老师的写法是一个嵌套查询语句。
==================================
我晕……楼上哪里看出嵌套了……
好吧,楼主主要是两个问题,
一个是什么情况该用Group by,
还有一个是having 和where有什么区别。
那个题目可以这样读的吧:
统计“每”一门课程,显示平均分在75分以上的课程号和平均分。
如果不按每门课程统计,就变成对所有课程的分数求平均值了。显然和需求不符。
Group By 是集计分支,只要有统计数据的地方,就极可能用到Group by。
常用的集计函数有这几种:Count, Avg, Max, Min, Sum也就是说,如果要求某一数据的数量、平均值、最大值、最小值、总计,常常都是要和Group By连用的。
所以看见这种题目,就用Group by吧。
二,HAVING和WHERE的区别在于,HAVING是统计完以后进行过滤,而WHERE是在统计前进行过滤。
你的这个题目里,avg(score)是统计以后才得出的数据,所以只能用HAVING。

更多文章:
repercussions(都是余波,repercussions和aftermath有什么区别啊)
2026年10月11日 09:00
dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)
2026年10月11日 08:50
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00




