Mysql5与Mysql8版本

本文讨论了MySQL5和8版本在字段排序和分组操作上的区别,指出MySQL5需要自定义参数排序,而MySQL8引入了更简便的函数,如groupby后的字段处理。作者提供了分组后取TopN的实例,比较了两种方法的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写SQL时候遇到了一些苦恼的问题,在使用MySQL5版本时候想对字段进行排序,可是5版本的MySQL不支持自动排序,自己也是在网上查了好多方法,得出的结论是5版本的MySQL得自己定义参数进行排序,看的眼麻,心想还不如python或者Java直接排序得了。然后又看了MySQL8版本,好在8版本有开创函数,可以很简便的实现分组排序。其次,MySQL5版本中group by之后的字段可以去select后的部分,而MySQL8版本中group by之后的字段必须包括select之后的全部字段,这个就很烦,有时候我只想分一个组就好了,可MySQL8版本必须全部包含。

总的来说,想分组简便可以用MySQL5版本,想排序简便可以用MySQL8版本。

实例:

分组后取TopN

  • 需求:获取每一个部门薪水最高的2名员工信息
  • 分析:按照部门分组,每一部门的员工放在一组,然后基于这个组中的数据,按照工资降序排列。然后再根据排序后的结果集,获取排序为1的数据行即为结果
  • 实现SQL: 如下:
  • select dept_no,emp_name,emp_salary,row_num from (
    	select 
    		case when @dept_no_g != x.dept_no then @row_num_g :=1 else @row_num_g :=@row_num_g + 1 end as row_num,
    		 x.emp_name,
    		 @dept_no_g := x.dept_no as dept_no,
    		 x.emp_salary,
    		 x.emp_hire_date
    	from emp as x,(select @dept_no_g :='') as t1,(select @row_num_g :=0) as t2 
    	order by dept_no,emp_salary desc 
    ) res where row_num < 3
    
  • 窗口函数实现:如下
  • select id,emp_name,dept_no,emp_salary,emp_hire_date,row_num from (
    	SELECT id,emp_name,dept_no,emp_salary,emp_hire_date,row_number() OVER w AS row_num 
    	FROM emp WINDOW  w AS (PARTITION BY  dept_no ORDER BY emp_salary DESC) order by dept_no 
    ) as res where row_num <3
    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangjiwei0207

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值