现在的位置: 首页 > 综合 > 正文

mysql对标准sql的goup by进行了扩展

2018年01月24日 ⁄ 综合 ⁄ 共 1190字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.