MySQL Handling of GROUP BY--官方文档
In standard SQL, a query that includes a GROUP BY
clause cannot refer to nonaggregated columns in the select list that are not named in the GROUP BY
clause. For example, this query is illegal in standard SQL because the name
column in the select list does not appear in the GROUP BY
:
SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;
For the query to be legal, the name
column must be omitted from the select list or named in the GROUP BY
clause.
MySQL extends the use of GROUP BY
so that the select list can refer to nonaggregated columns not named in the GROUP BY
clause. This means that the preceding query is legal in MySQL. You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY
are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY
clause. Sorting of the result set occurs after values have been chosen, and ORDER BY
does not affect which values within each group the server chooses.
A similar MySQL extension applies to the HAVING
clause. In standard SQL, a query that includes a GROUP BY
clause cannot refer to nonaggregated columns in the HAVING
clause that are not named in the GROUP BY
clause. A MySQL extension permits references to such columns to simplify calculations. This extension assumes that the nongrouped columns will have the same group-wise values. Otherwise, the result is indeterminate.
To disable the MySQL GROUP BY
extension, enable the ONLY_FULL_GROUP_BY
SQL mode. This enables standard SQL behavior: Columns not named in the GROUP BY
clause cannot be used in the select list or HAVING
clause unless enclosed in an aggregate function.
ONLY_FULL_GROUP_BY
also affects use of aliases in the HAVING
clauses. For example, the following query returnsname
values that occur only once in table orders
:
SELECT name, COUNT(name) FROM orders
GROUP BY name
HAVING COUNT(name) = 1;
MySQL extends this behavior to permit the use of an alias in the HAVING
clause for the aggregated column:
SELECT name, COUNT(name) AS c FROM orders
GROUP BY name
HAVING c = 1;
Enabling ONLY_FULL_GROUP_BY
disables this MySQL extension and a non-grouping field 'c' is used in HAVING clause
error occurs because the column c
in the HAVING
clause is not enclosed in an aggregate function (instead, it is an aggregate function).
The select list extension also applies to ORDER BY
. That is, you can refer to nonaggregated columns in the ORDER BY
clause that do not appear in the GROUP BY
clause. (However, as mentioned previously, ORDER BY
does not affect which values are chosen from nonaggregated columns; it only sorts them after they have been chosen.) This extension does not apply if the ONLY_FULL_GROUP_BY
SQL mode is enabled.
In some cases, you can use MIN()
and MAX()
to obtain a specific column value even if it is not unique. If the sort
column contains integers no larger than 6 digits, the following query gives the value of column
from the row containing the smallest sort
value:
SUBSTR(MIN(CONCAT(LPAD(sort,6,'0'),column)),7)
See Section 3.6.4, “The Rows Holding the Group-wise Maximum of a Certain Column”.
If you are trying to follow standard SQL, you cannot use expressions in GROUP BY
clauses. As a workaround, use an alias for the expression:
SELECT id, FLOOR(value/100) AS val
FROMtbl_name
GROUP BY id, val;
MySQL permits expressions in GROUP BY
clauses, so the alias is unnecessary:
SELECT id, FLOOR(value/100)
FROMtbl_name
GROUP BY id, FLOOR(value/100);
http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html
MySQL Handling of GROUP BY--官方文档的更多相关文章
- MySQL 标识符到底区分大小写么——官方文档告诉你
最近在阿里云服务器上部署一个自己写的小 demo 时遇到一点问题,查看 Tomcat 日志后定位到问题出现在与数据库服务器交互的地方,执行 SQL 语句时会返回 指定列.指定名 不存在的错误.多方查证 ...
- Mysql优化(出自官方文档) - 第五篇
目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...
- Mysql优化(出自官方文档) - 第八篇(索引优化系列)
目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...
- Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇)
目录 Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇) 1 Optimizing Data Size 2 Optimizing MySQL Data Types 3 Optimizing ...
- Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)
Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 目录 Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 1 Internal Locking Methods Row-Leve ...
- Mysql优化(出自官方文档) - 第六篇
Mysql优化(出自官方文档) - 第六篇 目录 Mysql优化(出自官方文档) - 第六篇 Optimizing Subqueries, Derived Tables, View Reference ...
- Mysql优化(出自官方文档) - 第四篇
Mysql优化(出自官方文档) - 第四篇 目录 Mysql优化(出自官方文档) - 第四篇 1 Condition Filtering 2 Constant-Folding Optimization ...
- Mysql优化(出自官方文档) - 第一篇(SQL优化系列)
Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...
- 看MySQL官方文档的示例SQL有感
[背景] 周末比较闲,我这个人又没有什么爱好,当然了读书除外:前一些天我一个同事说:“你一个dba想去写一本“django”书,合适吗?” 我想也是,一个人不能忘了本,所以MySQL还是要好好的搞一搞 ...
- Mysql优化(出自官方文档) - 第三篇
目录 Mysql优化(出自官方文档) - 第三篇 1 Multi-Range Read Optimization(MRR) 2 Block Nested-Loop(BNL) and Batched K ...
随机推荐
- Memcache,Redis
Memcache Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. ...
- 【C语言】printf函数详解
C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...
- Java 内存区域和GC机制--备用
Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 ...
- 运输层协议----UDP
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...
- oracle中的一些函数笔记
replace函数 replace(最长的字符串,被替换的字符串,替换字符串) 数学函数 round(n,[m]) 保留m位总共n位长度的数,采用四舍五入的方式. trunc(n,[m])截取数字,不 ...
- java中的信号量Semaphore
Semaphore(信号量)充当了操作系统概念下的“信号量”.它提供了“临界区中可用资源信号量”的相同功能.以一个停车场运作为例.为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的.这时如果 ...
- 10.在Global全局文件中的Application_BeginRequest示例
只要有人访问本网站,都要执行全局文件的Application_BeginRequest事件.因此我们可以防盗链. 示例要求:凡不是网站本机登录的都给客户端提示,用图片显示. 分析:由于网页在加载时不是 ...
- java 集合接口及类
- page-object使用(2)---elements
elements就是html元素下所有的标签.用page-object你可以找到并定位html页面下绝大多数的元素,这个文章列出了可定位的这些元素,生成的方法,和依据什么关键字来找到这些元素. BUT ...
- Selenium WebDriver + Grid2 + RSpec之旅(一)----准备篇
Selenium WebDriver + Grid2 + RSpec之旅(一) ----准备篇 前言 在Web 2.0 应用中,在浏览器种类盛行的时代,我们在测试过程中不仅要模 ...