group by
1.后面添加的若干属性,共同组成了一个分组的依据,
2.count(*),或者max(age)这类函数,都将计算分组内的数据
3.where字句和having子句
where将对分组前的所有数据进行筛选。如果想要记录50岁的女的数量,应该在where中加条件,而不是having中。
having将对分组后的一组数据搞事情,而且group by age后,一组50岁的数据只显示一条,也就是一群50岁的人,有男有女,但是最后只显示一种sex(假设显示了女),这时候如果having后面是对这色系别进行过滤,having sex=male的话,将过滤掉50岁的所有记录。带来错误。
4.也就是说group by后面的其它属性可能不是你想要的。比如说group by时候select max(age),sex。这时候sex得到的值,可能并不是年龄最大的选手的性别。
select *,count(*)
from user
group by sex,age
查找每个人消费最高的一天的花费和日期:选出每个user消费最多的金额
表结构: user(userid, name, age) ,consume(id, userid, money, timer)
select user.name,consume.money,consume.consume_time
from user
inner join (
select consume.useid,max(money) money
from consume
group by consume.useid
) a
inner join consume
on user.useid=consume.useid and
user.useid=a.useid and
consume.money=a.money
group by name;
每个用户消费最多的两天:给每张消费表,另外添加一个消费金额排名,最后排名过滤
select user.name, ccc.money,ccc.consume_time
from user
, (select c1.useid,c1.consume_time,c1.money,
(select count(id)
from consume c2
where c1.useid=c2.useid
and c1.money<=c2.money
) cnt
from consume c1
)ccc
where user.useid=ccc.useid
and ccc.cnt <=2;
;