zoukankan      html  css  js  c++  java
  • mysql select 字段别名是否可以用在 select中或者where中

    select column1+10 as c1,c1+10 as c2 from table1;
    想实现上面的效果,结果在mysql里面报错了,提示找不到c1这个列;

    -- 不同的 数据库不一样

    一般不支持在select中继续使用别名 或者where语句中使用

    如果是在要用 可以尝试是否支持:

    select column1+10 as c1,(select c1)+10 as c2 from table1;

    但是在orderby groupby 可以使用

    ---一些解释参考

    https://stackoverflow.com/questions/16715504/mysql-define-a-variable-within-select-and-use-it-within-the-same-select/16715618#16715618

    https://stackoverflow.com/questions/6081436/how-to-use-alias-as-field-in-mysql

    mysql中的SQL语句执行是有一定顺序的,如下:
    1. from
    2. on
    3. join
    4. where
    5. group by
    6. with
    7. having
    8. select
    9. distinct
    10. order by
    11. limit
    一条SQL会经过这11步的,中间的每一步都会生成一张虚拟表,后面的步骤都是在上一张虚拟表中进行筛选与查询的,下面假设,经过了7步也就是经过了having这一步,生成的虚拟表假设为:

    id  column1 column2 alias(having后的别名)
    1      10       10      aaa
    2      20       20      bbb
    

    现在到了SELECT这一步的时候,你的查询字段为 column1+10 as c1, 那么sql解析器在这个虚拟表中可以找到column1这个字段,那么计算和设置别名成功, 现在你要c1+10,它发现这个虚拟表中不存在这个字段,那么就会报错,如果你想这样做:alias as xxx, 那么也不会报错,因为having筛选过后,这个别名字段已经在虚拟表中了,所以其实道理很简单,select的执行顺序是排在第8步的,而select是针对以上几步生成的虚拟表进行操作的,所以你所要使用的字段,如果虚拟表中不存在,那么则会报错,如果楼主的那句SQL硬要执行的话,也只能改成select column1+10 as c1,column1+10+10 as c2 from table1;

  • 相关阅读:
    leetcode-----16. 最接近的三数之和
    leetcode-----15. 三数之和
    leetcode-----14. 最长公共前缀
    leetcode-----13. 罗马数字转整数
    leetcode-----12. 整数转罗马数字
    leetcode-----11. 盛最多水的容器
    leetcode-----10. 正则表达式匹配
    leetcode-----9. 回文数
    leetcode-----8. 字符串转换整数 (atoi)
    leetcode-----7. 整数反转
  • 原文地址:https://www.cnblogs.com/clphp/p/7815160.html
Copyright © 2011-2022 走看看