zoukankan      html  css  js  c++  java
  • MySQL 在 Order By 和 Group By 中使用别名

    先抛出结论:

    1)mysql 可以在 order by 和 group by 中使用别名

    2)group by 和 order by 中使用别名时,赋值语句不会重复执行,只是将赋值语句的赋值顺序提前触发了

    3)执行顺序为 group by -> order by -> select 中的赋值语句

    1.1 基础数据准备

    个人 mysql 版本:5.7.19(验证使用的版本)

    公司 mysql 版本:8.x (没有完全验证)

    Create table If Not Exists Employee (id int, salary int);
    Truncate table Employee;
    insert into Employee (id, salary) values ('1', '100');
    insert into Employee (id, salary) values ('2', '200');
    insert into Employee (id, salary) values ('3', '300');
    

    1.2 MySQL 执行顺序

    这是网上找的 mysql 执行顺序,mysql 版本与正确性未知。

    from
    join
    on
    where
    group by -- 这里开始可以使用 select 中的别名
    avg, sum...
    having
    select
    distinct
    order by
    limit
    

    1.3 Order By 和 Group By 中使用别名

    mysqlordery bygroup by 中使用别名,相当于把别名的语句放在ordery bygroup by 中。

    比如:

    select ifnull(salary, '500') as salary_alias
    from Employee
    order by salary_alias;
    

    等价于

    select ifnull(salary, '500')
    from Employee
    order by ifnull(salary, '500');
    

    于是有了一个问题:既然别名的语句放到了 order by 中,是否语句会被重复执行?

    答案是:否。

    比如:

    set @i = 0;
    select @i := @i + 1 as i_alias
    from employee
    order by  @i := @i +1; -- 等价于 order by i_alias
    

    结果为:

    1
    2
    3
    

    确实没有重复执行。

    如果将 order by 的内容改一下,使之与别名的语句不相同,如:

    set @i = 0;
    select @i := @i + 1 as i
    from employee
    order by  @i := 1 + @i;
    

    结果为:

    2
    4
    6
    

    因为 @i := 1 + @i 不等价于 @i := @i + 1

    1.4 执行顺序验证

    设置两个变量 @i 和 @s,其中 @i 根据 @s 变化进行赋值,而 @s 在 @i 赋值之后赋值。

    即正常的赋值顺序为:@i -> @s

    set @i = 0;
    set @s = '';
    select @i := if(@s != salary, @i + 1, @i) as i, @s, @s := salary as s, @s
    from employee;
    

    结果为

    i	@s	s	@s(1)
    1		100	100
    2	100	200	200
    3	200	300	300
    

    如果加上别名排序

    set @i = 0;
    set @s = '';
    select @i := if(@s != salary, @i + 1, @i) as i, @s, @s := salary as s, @s
    from employee
    order by s desc;
    

    结果为

    i	@s	s	@s(1)
    0	300	300	300
    1	300	200	200
    2	200	100	100
    

    可以看到 @s 的赋值发生在了 @i 之前。

    如果加上 group by

    set @i = 0;
    set @s = '';
    select @i := if(@s != salary, @i + 1, @i) as i, @s, @s := salary as s, @s
    from employee
    group by i, s
    order by s desc;
    

    结果为

    i	@s	s	@s(1)
    3	200	300	300
    2	100	200	200
    1		100	100
    

    赋值顺序又正常了,可以确定:执行顺序为先 group by 后 order by。

  • 相关阅读:
    RDD弹性分布式数据集的基本操作
    spark-shell的Scala的一些方法详解
    浅谈架构
    关于MapReduce二次排序的一点解答
    mysql 和 hive 和分布式zookeeper和HBASE分布式安装教程
    2018暑假总结
    暑假总结07
    2018暑假总结06
    2018暑假总结05
    2018暑假总结04
  • 原文地址:https://www.cnblogs.com/clis/p/15564486.html
Copyright © 2011-2022 走看看