mysql对标准sql的goupby进行了扩展
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql对标准sql的goupby进行了扩展,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2116字,纯文字阅读大概需要4分钟。
内容图文
![mysql对标准sql的goupby进行了扩展](/upload/InfoBanner/zyjiaocheng/533/4296b316d8a143c7866c2dc51ed79a3d.jpg)
标准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的记录量被忽略了,这种情况就不一定是我们想要的结果了,在实际应用时需要特别注意。
内容总结
以上是互联网集市为您收集整理的mysql对标准sql的goupby进行了扩展全部内容,希望文章能够帮你解决mysql对标准sql的goupby进行了扩展所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。