标准SQL语法中,对SELECT语句执行GROUP BY操作的话,SELECT选择的列必须出现在GROUP BY子句中,也就是说先要明确根据什么分组,然后才能选择分没分组。不过MySQL数据库不完全是这样,只要MySQL数据库不是运行在ANSI模式下(什么是运行模式,简单讲就是指支持的SQL语法,运行模式是在启动mysql服务时以--sql-mode设置,默认应为空,ANSI是一套通行的标准SQL语法体系),就可以简化GROUP BY操作时的选择列。

出现在GROUP BY子句,但没有出现在SELECT的选择列中,这我们可以理解对吧,不过如果是SELECT选择了列,但该列却并没有出现在GROUP BY子句中,这样的SQL能执行吗?MySQL中是可以的,举个例子:

mysql> create table j1 (id int,vl varchar(20));

Query OK, 0 rows affected (0.02 sec)

mysql> insert into j1 values (1,'a');

Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (1,'b');

Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (2,'c');

Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (3,'d');

Query OK, 1 row affected (0.00 sec)

我们要按id分组,查询不同组的数量及其vl值,在mysql中会怎么写呢,看好了:

mysql> select vl,count(0) from j1 group by id;

+------+----------+

| vl   | count(0) |

+------+----------+

| a    |        2 |

| c    |        1 |

| d    |        1 |

+------+----------+

3 rows in set (0.00 sec)

标准SQL中,要查询vl列则vl必须在GROUP BY子句中,而MySQL数据库中,vl可被忽略,这种写法按照官方文档中的说法是为了提高性能,避免不必要的排序和分组。

但是,要注意了,在这种设定下,一定要明确自己想要的结果到底是什么,以及实际执行的SQL语句返回结果,是否符合自己的预期。

MySQL在执行这类查询语句时,它会默认理解为,没写到GROUP BY子句的列,其列值是唯一的,如果GROUP BY省略的列值其实并不唯一,那么最好不要使用这项功能,仍以前面的示例来说明,id为1的记录实际有两条,分别对应vl in('a','b'),但实际查询的结果集则只有a对应的数量,vl=b的记录量被忽略了,这种情况就不一定是我们想要的结果了,在实际应用时需要特别注意。

mysql数据库group by_MySQL数据库对GROUP BY子句的功能扩展(1)相关推荐

  1. mysql 子查询 group by_mysql 子查询 group by的使用

    1 group by表示排序,后面查询出来的是每一组的第一条数据,where后面表示提出条件之类的,如果对排序需要有条件筛选,应该在属性名后接 having +条件 .而不能使用where 2 聚合函 ...

  2. mysql union group by_Mysql UNION和GROUP BY

    我有2个表需要根据日期和2值加在一起. 这给了我所有信息的清单 – 罚款. $query = (SELECT date, debit, credit , note FROM proj3_cash ) ...

  3. mysql full group by_MySql报错only_full_group_by的解决办法

    前段时间我在一个新环境里部署程序时遇到MySql报错only_full_group_by,之前已经遇到过一次同样的问题,当时没有总结经验,导致这次解决时耗费了不少时间,这里把本次的处理过程进行记录总结 ...

  4. mysql group by_MySQL优化GROUP BY方案

    执行GROUP BY子句的最一般的方法:先扫描整个表,然后创建一个新的临时表,表中每个组的所有行应为连续的,最后使用该临时表来找到组并应用聚集函数(如果有聚集函数).在某些情况中,MySQL通过访问索 ...

  5. Mysql常用词汇_mysql 数据库常用单词

    说明:以下单词可能有多种含义,此文档只针对编程做解释.单词不多,熟能生巧,每日认真读读写写,效果不错.如有错误,请谅解并指出,谢谢大家! 黄金超 2017-4-7 连接MySQL数据库: mysql ...

  6. mysql 按日期删除数据库_DAY11 - MySQL入门(数据库的增、删、改、查 基本操作)...

    一. 数据库的介绍 二. MySQL的基本语法 l 注释: 单行注释: #注释内容 单行注释: -- 注释内容(注意,两个"--"之后有一个空格) 多行注释: /*注释内容*/ l ...

  7. mysql select表达式_MySQL数据库SELECT查询表达式解析

    数据的管理在很大一部分是在进行查找工作,而SELECT占据了很大的一部分 SELECT select_expr [,select_expr...] [ FROM table_reference WHE ...

  8. mysql数据库财务_MySQL数据库——从入门到删库跑路(二)

    DQL 查询表中的记录 select .... from ..... 语法 select 需要查询的信息(列名1,列名2,.......列名n) / * from 表名 [where 条件]; 完善下 ...

  9. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

最新文章

  1. 会声会影水墨遮罩如何变大_自媒体长期网赚项目: 自媒体如何打造自己的自媒体知识付费课程(干货)...
  2. [转]NS2仿真过程中解决动画仿真节点未定义问题
  3. K8S报错:controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252
  4. Flume 1.7 源码分析(二)整体架构
  5. EBS中Java并发程序笔记(1)
  6. 茫茫内存,我该如何用 windbg 找到你 ?
  7. 高性能全数字嵌入式仿真测试软件SkyEye支持多达70余种核心
  8. 鸿蒙OS代码正式开源!!!
  9. c++如何解决大数组栈内存不够的问题
  10. django高级应用(分页功能)
  11. 机器学习代码实战——数值计算
  12. J2EE JavaEE 教程系列
  13. 获取当天23时59分59秒
  14. area 估算函数(simpson)
  15. 语言栏不见了怎么办?
  16. 腾讯Bugly,简单实用的崩溃日志收集
  17. 2329: 小新同学爱加密
  18. 免费服务器领取步骤(详细)
  19. NER项目--github--A Unified MRC Framework for Named Entity Recognition
  20. MU计算机里代表什么,计算器上M+、M-、MU、GT等分别代表意思-mu代表啥

热门文章

  1. 突然!OPPO再放大招:瀑布屏了解一下
  2. 小米海外召回有潜在风险的电动滑板车 中国区无此风险
  3. 在线打假!“鲁迅说过的话”检索系统上线 网友太热情系统一度崩溃
  4. 三星Note10 Pro电池曝光:容量高达4500mAh
  5. 拳王虚拟项目公社:虚拟资源平台,是拳王内部虚拟副业项目的课程发布地
  6. rabbitmq-server 安装方法
  7. oracle12c正在检查环境变量,oracle11g安装客户端检查先决条件失败
  8. 我的内核学习笔记7:Intel LPC驱动lpc_ich分析
  9. Oracle数据库报错【ORA-12514 】TNS 监听程序当前无法识别连接描述符中请求服务
  10. cas登录后怎么直接到我们系统_当我们购买服务器后,那么服务器的操作系统该怎么选择呢?...