转:http://www.seomumu.com/mysql-php?start=56
对于group by在mysql中的使用和Oracle的差异性很大,准确的说不光和Oracle和别的数据库差异性一样,这些有点不太遵循标准SQL。我们知道常规的 sql,对于group by来说一定要结合聚合函数,而且选择的字段除了聚合函数外,还必须在group by中出现,否则报错,但是在mysql中扩展了这样的功能
首先对于不加聚合函数的sql来说,它的功能结合了limit来得出结果,仔细想想的时候有点Oracle分析函数的味道,limit的时候得到的并不是 最大最小的值,而是某一下group by结果集中第一行,也就是刚才说的相当与先group by, 然后在每个group by下面进行limit 1。
其次,刚才还说了常规的group by结合聚合函数的时候,选择的字段除了聚合函数外,必须在group by中存在,但是在mysql中不是这样了,它具有隐含字段的功能,例如:
(root:im-mysql:16:34:45)[test]> select a,b,c,count(*) from test1 group by a,b;
+------+------+------+----------+
| a
| b | c | count(*) |
+------+------+------+----------+
| 1 | 1 | 1 | 3 |
| 1 | 2 | 5 | 3 |
+------+------+------+----------+
对于没有选择的字段,上面是c,c的值还是和上面说到的一样,是根据得到的结果集然后根据每个group by 进行limit 1得到的结果。
转:http://www.seomumu.com/mysql-php?start=56对于group by在mysql中的使用和Oracle的差异性很大,准确的说不光和Oracle和别的数据库差异性一样,这些有点不太遵循标准SQL。我们知道常规的 sql,对于group by来说一定要结合聚合函数,而且选择的字段除了聚合函数外,还必须在group by中出现,否则报错,但是在mysql中扩展了
limit 限制条数
select 罗列记录
先根据where 约束条件 将数据从表
中
加
载到内存,所以where的条件作用在数据之前,然后根据
字段
进行分组,在内存
中
形成一张虚拟的表包含
字段
,
如果此时有
聚合
函数
则先执行
聚合
函数
,并将
聚合
函数
字段
也
加
到虚拟的表
中
,接着进行having记录筛选,筛选完成后对数据进行去重,排序,限制等操作后进行显示。
补充知识:
mysql
where条件and的执行顺序从左到
`name` varchar(255) DEFAULT NULL,
`tel` varchar(255) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
INSERT INTO `my_taobao`.`test...
一:在不使用
聚合
函数
的时候,
group
by 子句
中
必须包含所有的列,否则会报错,如下
select name,MON from [测试、]
group
by name
在使用
group
by分组后展示其他
字段
需要
加
any_value(
字段
名)
例如: select time from student
group
by time 还想获取其他
字段
信息
如下: select time,any_value(id),any_value(name),any_value(sex),any_value(grade) from student
group
by time,即可实现对其他
字段
信息的获取.
相信小伙伴写sql语句时,如果用到了
group
by分组后,那么其他未分组的
字段
一定会用
聚合
函数
,不然的话sql就会报错,下面就来看下为什么要这么使用
一、
聚合
函数
是什么?
聚合
函数
:对一组值执行计算并返回单一的值。除 COUNT 以外,
聚合
函数
忽略空值,如果COUNT
函数
的应用对象是一个确定列名,并且该列存在空值,此时COUNT仍会忽略空值。
意思就是说,使用
聚合
函数
时,给它传入多个值,而它把这些值通过计算给你返回唯一的一个。
二、为什么使用了
group
by后用需要用
聚合
函数
因为
group
b
首先引入语句来源,表结构和数据如下:
需求是:查出员工(personname)在不同店铺(store)的总薪酬(salary),相同店铺输出store,不同店铺输出multi_store。
正确查询语句如下:
SELECT personname,(case when count(
distinct
Store)>1 then 'multi_store' else MAX ( s...
- 没见过
group
by没和
聚合
函数
一起使用的
- 不会报错,新版
mysql
默认配置可以这样,如果要像老版之前。可以修改下配置。但是这样查出来的数据没有准确性。因为查询的未分组的列结果是随机的,仔细看解释
- 对,默认隐含分组了,结果看到不对
- 看我发的图,默认给合并了,你做个试验,看结果数据对不...
SELECT SUM(TABLE.A)FROM TABLE
上述SQL不需要使用
Group
by 进行分组,因为其
中
没有非
聚合
字段
,所以不用
Group
by 也可以。
如果是SELECT SUM(TABLE.A),MAX(B),...
今天被问到了一个问题
在
MYSQL
中
使用
GROUP
BY分组时,我们可以select 多个非
聚合
字段
,但是有些
字段
可能不在
GROUP
BY
中
,这样的SQL查询在SQL SERVER、ORACLE
中
是不合理的,且会报错,但
mysql
是可以通过,
MYSQL
的这种特异性,有时查询出来的结果并不是我们需要的。
下面我们来做一个实验
数据表如下:
id name tel
1 a ...
在
MySQL
中
,可以使用
DISTINCT
关键字来去除重复的记录。如果要对多个
字段
进行去重,可以在
DISTINCT
后面列出多个
字段
名,用逗号隔开。例如:
SELECT
DISTINCT
field1, field2, field3 FROM table_name;
这样就可以对表
中
的field1、field2和field3这三个
字段
进行去重操作。如果只想对其
中
的某些
字段
进行去重,可以只列出需要去重的
字段
名即可。