在我们使用SQL进行查询的时候经常会用到GroupBy进行分组查询操作
分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。
当对一个列进行分组,因为只会显示该列的一条不重复数据,对于其他列依然是存在多条。
Mysql的严格模式Mysql处于严格模式(SQL_MODE被设置为 ONLY_FULL_GROUP_BY)
如果SQL写成select * from t group by name,就会报错,原因就是因为除了name之前,其他列的数据都不是唯一的,在严格模式会报错。
解决方法 ANY_VALUE()不过,在严格模式(ONLY_FULL_GROUP_BY)下,依然是想获取聚合列:
SELECt name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
原理就是从分组中,随意获取一个数据,前提也就是你不关心组数据中的不同情况。
主键分组方法二:如果GROUP BY是主键或者 unique NOT NULL 时是可以查询非聚合的列的,原因是此时分组的key是主键,则每一个分组只有一条数据,因此是可以进行查询非聚合的列的。
关闭严格模式方法三:关闭严格模式
查看当前sql_model:
查看当前sql_model
SELECt @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;OVER() OVER()
- over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数over(partition by deptno)按照部门分区over(partition by deptno order by salary)分组加排序
用于配合OVER()使用,存在多个可以去使用
OVER()是可以单独使用,包括这些前置函数都是可以的
ROW_NUMBER()将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号
select * from(select name,class,s,row_number()over(partition by class order by s desc) mm from t2) where mm=1;查询结果
因为ROW_NUMBER()会对每一个查询到的数据都给给与个数字标识,我们查询的是给与数字标识为1的
RANK_NUMBER()select * from(select name,class,s,rank()over(partition by class order by s desc) mm from t2) where mm=1;查询结果
对每一个查询到的数据都给给与个数字标识,对于排序相同的会给出相同的,数字标识
select name,class,s,rank()over(partition by class order by s desc) mm from t2查询结果
rank()和dense_rank()可以将所有的都查找出来:
如上可以看到采用rank可以将并列第一名的都查找出来;
rank()和dense_rank()区别:
rank()是跳跃排序,有两个第二名时接下来就是第四名;
select name,class,s,dense_rank()over(partition by class order by s desc) mm from t2
下面还存在很多类似的函数,感兴趣可以了解。我看不下去了卷不动了



