group by用法多个字段,SQL中查询多个字段时,GROUP BY 要怎么使用?
group by用法多个字段,SQL中查询多个字段时,GROUP BY 要怎么使用?详细介绍
本文目录一览: group by 后面可以带两个字段吗
可以,需要用逗号隔开
可以,后面可以根据多个字段进行聚合!
可以,用逗号隔开
可以,一个字段就依据一个条件分组,两个字段就依据两个条件分组。。。。。。
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
SQL中查询多个字段时,GROUP BY 要怎么使用?
你这个意思是要分组么,直接用索引不就行了么~~到货地点
正序或倒序
,用order
by也行,如果要一个组内再分组,那就用多个索引就行了~~
group
by是要用在sum(),max(),min()等聚合函数的后面
不能单独使用,如果要排序的话
根据order
by
排序就行了,这个排序在一定意义上也可以理解为分组
mysql 可以group by 两个字段吗
这里有测试和结论:
http://zccst.iteye.com/blog/1157763
在日常查询中,索引或其他数据查找的方法可能不是查询执行中最高昂的部分,例如: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 限制我们检索的组的数量或使用“覆盖索引”时,特别有效,因为顺序索引扫描是一种非常快速的操作。
如果您有少量组,并且没有覆盖索引,索引顺序扫描可能会导致大量 IO。所以这可能不是最优化的计划。
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 在这种情况下不会选择这个计划。
一般来说,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 的临时表可能是唯一的选择。
如果要强制 MySQL 使用为 GROUP BY 执行临时表的计划,可以使用 SQL_SMALL_RESULT 提示。
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 以您希望的方式执行查询。
group by 两个字段
? ? group by 的简单说明:? group by 和聚合函数一起使用才有意义,比如 count、sum、avg等。
? ? 例如:select count(a),b from tableOne group by b,c;
? ? ? ? 最终结果是在group by b 的基础上再次 group by c? 。? ? ??
group by的用法
select 学号、姓名、科目、分数 from...group by 科目 having max分数
如果只是语文的就having后面再加上科目等于语文。
group by 就是用来表示按照什么来分组,经常和having一起用表示选择条件。
可以这样写:我已经测试过了:select student.姓名,avg(sc.成绩),from student,sc。
上面已经给出了对Group By语句的理解。基于这个理解和SQL Server 2000的联机帮助,下面对Group By语句的各种典型使用进行依次列举说明。
Group By 的使用:
这个恐怕是Group By语句最常见的用法了,Group By + [分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同小组。比如有如下数据集,其中水果名称(FruitName)和出产国家(ProductPlace)为联合主键。
【MySQL】分组查询(GROUP BY)
MySQL中使用 GROUP BY 对数据进行分组,GROUP BY从字面意义上理解就是根据'BY'指定的规则对数据进行分组, 所谓分组就是将一个'数据集'划分成若干个'子区域',然后针对若干个'小区域'进行数据处理 。基本语法形式为:
字段值为进行分组时所依据的列名称, “HAVING
” 指定满足表达式限定条件的结果将被显示。
GROUP BY关键字通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG()。即把数据分为多个逻辑组,并对每个组进行集合计算。
WHERE 子句过滤行,在数据分组前过滤;HAVING 子句过滤分组,在数据分组后过滤。WHERE排除的行不包括在分组里,且HAVING支持所有WHERE操作符。
使用GROUP BY可以对多个字段进行分组,根据多字段的值来进行层次分组,分组从左到右。
注意事项:
条件表达式>
group by用法有哪些?
可是为了能够更好的理解“group by”多个列“和”聚合函数“的应用,在思考的过程中,由表1到表2的过程中,增加一个虚构的中间表:虚拟表3。SQL语句执行情况:
1、FROM test:该句执行后,应该结果和表1一样,就是原来的表。
2、FROM test Group BY name:该句执行后,想象生成了虚拟表3,生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行,如对于name值为aa的,那么<1 aa 2>与<2 aa 3>两行合并成1行,所有的id值和number值写到一个单元格里面。
扩展资料:
Group By:基于这个理解和SQL Server 2000的联机帮助,下面对Group By语句的各种典型使用进行依次列举说明。
Group By [Expressions]:这个恐怕是Group By语句最常见的用法了,Group By + [分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。
参考资料来源:百度百科-GROUP BY
SQL中的Group By的查询过程多列分组的查询过程是怎样的?
Group By子句\r\n Group By子句可以将表的行划分为不同的组。分别总结每个组,这样就可以控制想要看见的详细信息的级别。\r\n \r\n 语法:\r\n \r\n [ Group By [ ALL ] Group_By_expression[ ,...n ]\r\n \r\n [ WITH { CUBE | ROLLUP } ] ]\r\n \r\n 参数说明:\r\n \r\n ALL:包含所有组和结果集,甚至包含那些任何行都不满足WHERE子句指定的搜索条件的组和结果集。如果指定了ALL,将对组中不满足搜索条件的汇总列返回空值。不能用CUBE或ROLLUP运算符指定ALL。如果访问远程表的查询中有WHERE子句,则不支持Group By ALL操作。\r\n \r\n Group_By_expression:对其执行分组的表达式。Group_By_expression也称为分组列。Group_By_expression可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。对于不包含CUBE或ROLLUP的Group By子句,Group_By_ expression的项数受查询所涉及的Group By列的大小、聚合列和聚合值的限制。该限制从8060字节的限制开始,对保存中间查询结果所需的中间级工作表有8060字节的限制。如果指定了CUBE或ROLLUP,则最多只能有10个分组表达式。\r\n \r\n CUBE:指定在结果集内不仅包含由Group By提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的Group By汇总行。Group By汇总行在结果中显示为NULL,但可用来表示所有值。使用GroupING函数确定结果集内的空值是否是Group By汇总值。结果集内的汇总行数取决于Group By子句内包含的列数。Group By子句中的每个操作数(列)绑定在分组NULL下,并且分组适用于所有其他操作数(列)。由于CUBE返回每个可能的组和子组组合,因此,不论指定分组列所使用的是什么顺序,行数都相同。\r\n \r\n ROLLUP:指定在结果集内不仅包含由Group By提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。\r\n \r\n 使用Group By子句的注意事项。\r\n \r\n (1)在SELECT子句的字段列表中,除了聚集函数外,其他所出现的字段一定要在Group By子句中有定义才行。例如“Group By A,B”,那么“SELECT SUM(A),C”就有问题,因为C不在Group By中,但是SUM(A)是可以的。\r\n \r\n (2)SELECT子句的字段列表中不一定要有聚集函数,但至少要用到Group By子句列表中的一个项目。例如“Group By A,B,C”,则“SELECT A”是可以的。\r\n \r\n (3)在SQL Server中text、ntext和image数据类型的字段不能作为Group By子句的分组依据。\r\n \r\n (4)Group By子句不能使用字段别名。\r\n 1.按单列进行分组\r\n \r\n Group By子句可以基于指定某一列的值将数据集合划分为多个分组,同一组内所有记录在分组属性上具有相同值。\r\n \r\n 示例:\r\n \r\n 把“student”表按照“性别”这个单列进行分组。在查询分析器中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select 性别\r\n \r\n from student\r\n \r\n Group By 性别\r\n \r\n 但仍然要强调SELECT子句必须与Group By后的子句或者是分组函数列相一致。\r\n \r\n 例如,由于下列查询中“姓名”列既不包含在Group By子句中,也不包含在分组函数中,所以是错误的。错误的SQL语句如下:\r\n \r\n use student select 姓名,性别 from student Group By 性别\r\n \r\n 例如,在“grade”表中,按“学期”分组查询。SQL语句如下:\r\n \r\n use studnet select 学期 from grade Group By 学期\r\n \r\n 2.按多列进行分组\r\n \r\n Group By子句可以基于指定多列的值将数据集合划分为多个分组。\r\n \r\n 示例:\r\n \r\n 在“student”表中,按照“性别”和“年龄”列进行分组。在查询分析中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select 性别,年龄\r\n \r\n from student\r\n \r\n Group By 性别,年龄\r\n \r\n 在“student”表中,首先按照“性别”分组,然后再按照“年龄”分组。\r\n \r\n 再举一个例子,例如,在“grade”表中,按照“学号”和“课程代号”列进行分组。SQL语句如下:\r\n \r\n use student\r\n \r\n select 学号,课程代号 from grade Group By 学号,课程代号\r\n \r\n 按多列进行分组时有NULL组的是如何处理的。当表按多列进行分组时有NULL组,这时NULL被作为一个特定值处理,就像其他任何值一样。也就是说,如果在某个分组列中存在两个NULL,则按它们有相同的值那样处理,并将它们放在相同的组中。\r\n \r\n 示例:\r\n \r\n 在“grade”表中,按“学期”和“课程代号”列进行分组。在查询分析器中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select 学期,课程代号\r\n \r\n from grade\r\n \r\n Group By 学期,课程代号\r\n \r\n 3.与聚集函数一起使用\r\n \r\n Group By子句是经常与聚集函数一起使用。如果SELECT子句中包含聚集函数,则计算每组的汇总值,当用户指定Group By时,选择列表中任一非聚集表达式内的所有列都应包含在Group By列表中,或者Group By表达式必须与选择列表表达式完全匹配。\r\n \r\n 示例:\r\n \r\n 在“student”表中,分别求男女生的平均年龄。在查询分析器中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select 性别,avg(年龄) as 平均年龄\r\n \r\n from student\r\n \r\n Group By 性别\r\n \r\n 例如,在“student”表中,分别求有多少个男生和女生。SQL语句如下:\r\n \r\n use student\r\n \r\n select 性别,count(性别) as 人数 from student Group By 性别\r\n \r\n 说明:关于聚合函数的详细讲解可参阅9.2.1节。\r\n \r\n 4.与HAVING子句一起使用\r\n \r\n HAVING子句对Group By子句选择出来的结果进行再次筛选,最后输出符合HAVING子句中条件的记录。HAVING子句的语法与WHERE子句的语法相类似,惟一不同的是HAVING子句中可以包含聚合函数。\r\n \r\n 语法:\r\n \r\n [HAVING ]\r\n \r\n 参数说明:\r\n \r\n :指定组或聚合应满足的搜索条件。当HAVING与Group By ALL一起使用时,HAVING 子句替代ALL。\r\n \r\n 示例:\r\n \r\n 在“student”表中,按“性别”分组求平均年龄,并且查询其平均年龄大于21的学生信息。在查询分析器中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select avg(年龄), 性别\r\n \r\n from student\r\n \r\n Group By 性别\r\n \r\n having avg(年龄)>21\r\n \r\n 在“grade”表中,按“学期”分组求平均成绩,并且查询“平均成绩”大于93的课程信息。在查询分析器中输入的SQL语句如下:\r\n +1 已赞过
SQL中查询多个字段时,GROUP BY 要怎么使用?
group by是要用在sum(),max(),min()等聚合函数的后面 不能单独使用,如果要排序的话 根据order by 排序就行了,这个排序在一定意义上也可以理解为分组
你这个意思是要分组么,直接用索引不就行了么~~到货地点 正序或倒序 ,用order by也行,如果要一个组内再分组,那就用多个索引就行了~~
你根据到货地点order by排序即可,不需要group by。
SQL语言,是结构化查询语言(Structured Query Language)的简称。
SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。
SQL语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。
它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的结构化查询语言作为数据输入与管理的接口。
SQL语言语句可以嵌套,这使他具有极大的灵活性和强大的功能。