标准SQL语法中,对SELECT语句执行GROUP BY操作的话,SELECT选择的列必须出现在GROUP BY子句中,也就是说先要明确根据什么分组,然后才能选择分没分组。不过MySQL数据库不完全是这样,只要MySQL数据库不是运行在ANSI模式下(什么是运行模式,简单讲就是指支持

标准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的记录量被忽略了,这种情况就不一定是我们想要的结果了,在实际应用时需要特别注意。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql对标准sql的扩展_mysql对标准sql的goup by进行了扩展相关推荐

  1. mysql不具有的特征是_MySQL中的SQL特征(转)

    MySQL中的SQL特征: 为了与MySQL服务器进行通信,必须熟练掌握SQL.例如,在使用诸如mysql客户机这样的程序时,其功能首先是作为一种发送SQL 语句给服务器执行的工具.而且,如果编写使用 ...

  2. mysql中sql插入时间_mysql中使用sql语句插入日期时间类型的写法

    [例子如下: select * from ( select rownumber() over() as rownumber, id from associate ) as temp where row ...

  3. mysql sql 语句事务_MySQL: 3、SQL语言 ②约束、事务

    一.SQL 约束 1.约束的作用: 对表中的数据进行进一步的限制,从而保证数据的正确性.有效性.完整性.违反约束的不正确数据将无法插入到表中 2.常见的约束: 3.主键约束: -- 特点: 不可重复. ...

  4. mysql oracle sql区别吗_mysql数据库的SQL语句和oracle的有什么区别?详细点

    匿名用户 1级 2017-08-20 回答 区别如下: 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Or ...

  5. centos写mysql光标移到上一行_mysql:一条SQL更新语句(update)是如何执行的

    一条更新语句的执行流程又是怎样的呢? 之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢? 我们还是从一个表的一条更新语 ...

  6. mysql 查询一个月的时间_mysql日期查询sql语句总结(查询一天,查询一周,查询一个月的数据)...

    我的日期 首先我们获取到的日期格式是这样的:2009-2-12或者2009-3-3或者2009-10-12,我们在组合sql语句的时候可以这样:(分了三个例子) 代码如下 @1select * fro ...

  7. mysql怎么添加查询时间限制_mysql如何限制sql查询时间,

    mysql如何限制sql查询时间MySQL如何限制结构化查询语言查询时间,关系型数据库限制结构化查询语言查询时间的方法:1.查询今天,代码为[选择*表名where to_days(时间字段名)=to ...

  8. mysql日期sql语句大全_mysql日期查找sql语句大全

    经常会遇到这样的情况,本月阅读排行榜,本周排行榜等等.那么这样的sql怎么写呢,小班收集了一些这样的时间函数给大家参考,希望大家在自己网站项目中可以用的到 在mysql中对时间日期操作的函数有很多,有 ...

  9. mysql 修改字段长度 合并语句_mysql中利用sql语句修改字段名称,字段长度等操作...

    1.修改字段的长度 语法: ALTER TABLE 表名 MODIFY COLUMN 字段名  数据类型(修改后的长度) 例子: 将字段的长度由10改为20 ALTER TABLE attence M ...

最新文章

  1. [Luogu 1196] NOI2002 银河英雄传说
  2. 中国大学单身 (民间)排行榜!你上榜了没
  3. 能在微软的网站找到IeWebcontrols的安装文件吗
  4. MonoRail学习笔记十一:页面控件的填充和验证
  5. 数据库加一列,cursor:pointer
  6. C# 海康DVR客户端开发系列(3)—— 连接DVR和图像预览
  7. skywalking调研相关资料整理
  8. bbs.php168,PHP168 下载安装教程
  9. 科研_今天,我们怎么做科研?
  10. 安装,激活(不更新升级)Navicat premium12.0.24(12.0.18)
  11. 电脑蓝牙打电话-总结(篇外、虚拟声卡选型)
  12. Android蓝牙完全学习手册
  13. 自定义UI控件:弹出键盘添加“完了”按钮
  14. 用Python爬取京东手机评论
  15. [论文] Feature Squeezing:Detecting Adversarial Examples in Deep Neural Networks
  16. 5月27日股市趋势追踪策略分析
  17. 个人公众号如何运营?可以从哪些方向突破?
  18. 鸿蒙系统一直重启怎么办,我的电脑能开机随后就是进不了系统一直黑在那边,时间长了就自动重启...
  19. 2021-08-05,虾皮API,seller_info - 获得shopee店铺详情
  20. OpenCV基础(7)OpenCV中的颜色空间

热门文章

  1. 华为ensp模拟器配置无线网络
  2. 【OA办公】OA流程审批大揭秘,带你看遍所有基础流程
  3. 360路由器远程连接服务器,“怎样用动态域名实现路由器的远程配置”的解决方案...
  4. 在线图片转成html,在线将JPEG 转换成HTML。 免费将.jpeg 转换成.html。
  5. 热烈庆祝龙智高级咨询顾问叶燕秀获得“Atlassian认证专家”称号
  6. Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e
  7. 冲压模具设计及制造概述,值得了解学习
  8. 高等代数_第5章:矩阵的相抵与相似
  9. 敏感性、特异性(sensitivity and specificity)| 假阳性、假阴性 | FDR | 第一类错误、第二类错误 | ROC | AUC...
  10. 配色软件 ColorKey Xp