ITPub博客

首页 > Linux操作系统 > Linux操作系统 > MySQL数据库对GROUP BY子句的功能扩展(1)

MySQL数据库对GROUP BY子句的功能扩展(1)

原创 Linux操作系统 作者:junsansi 时间:2011-04-20 10:11:30 0 删除 编辑

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7607759/viewspace-692946/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-21

  • 博文量
    640
  • 访问量
    4136551