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;

时间: 2024-11-09 20:24:20

mysql select 字段别名是否可以用在 select中或者where中的相关文章

总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法

1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G   #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show databases' -uroot -p123456 mysqlshow -uroot -p123456 # 不常用,记住上面那个就行了 3.创建数据库语法 create database 数据库名; 例如: create database `HA-test`; 4. 切换数据库 use HA-te

MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据

[0]README 0.1)本文部分文字描述转自"MySQL 必知必会",旨在review"MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据" 的基础知识: [1]创建计算字段 1)problem+solution 1.1)problem:存储在表中的数据都不是应用程序所需要的.我们需要直接从数据库中检索出转换,计算或格式化过的数据: 1.2)solution:这就是计算字段发挥作用所在了, 计算字段是运行时在 select语句内创建的: 2)字段定

Mysql字符串字段判断是否包含某个字符串的方法

方法一:like SELECT * FROM 表名 WHERE 字段名 like "%字符%";方法二:find_in_set() 利用mysql 字符串函数 find_in_set(); SELECT * FROM users WHERE find_in_set('字符', 字段名);mysql有很多字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必须以","分割开. 注:当str2为NO1:“3,6,1

Mysql字符串字段判断是否包含某个字符串的3种方法

方法一: SELECT * FROM users WHERE emails like "%[email protected]%"; 方法二: 利用MySQL 字符串函数 find_in_set(); SELECT * FROM users WHERE find_in_set('[email protected]', emails); 这样是可以的,怎么理解呢? mysql有很多字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必

MyBatis应用开发(11)映射之结果映射字段别名和HashMap

1.1.1. 字段别名的特殊功能 通过SQL语句的字段别名功能,可以将记录映射到resultType指定的Java Bean类型的属性的属性上. <!-- 通过定义select语句的字段别名为XXX.YYY的形式,可以将字段值赋值给PersonWrapper类的属性person的属性 --> <select id="findPersonWrapper" parameterType="java.lang.String" resultType=&quo

MySQL时间字段究竟使用INT还是DateTime

今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非

mysql时间字段转换为毫秒格式

下面是转载的关于MySQL毫秒.微秒精度时间处理的两段篇章,留给自己和供大家参考~~ 一.MySQL 获得毫秒.微秒及对毫秒.微秒的处理 MySQL 较新的版本中(MySQL 6.0.5),也还没有产生微秒的函数,now() 只能精确到秒. MySQL 中也没有存储带有毫秒.微秒的日期时间类型. 但,奇怪的是 MySQL 已经有抽取(extract)微秒的函数.例如: select microsecond('12:00:00.123456'); -- 123456 select microsec

MySQL 常用字段类型,介绍及其建表使用方法经验分享

由于工作的公司没有专业的DBA又经常需要建立各种各种的表来满足自己的业务逻辑,所以经常查看MySQL 手册或者谷歌查看相关资料,所以本人就根据我的工作经验和相关资料来介绍一下MySQL各种字段类型及其使用.(由于本人还算是菜鸟哪里写的不对请多多指正,有兴趣的可以探讨一下) MySQL字段类型 int型包括(tinyint, smallint, mediumint, int, bigint) tinyint是1个字节表达范围就是2的8次方(-128-128) 或者(0-255) 很多人不明白为什么

mysql通过字段注释查找字段名称

原文:mysql通过字段注释查找字段名称 有时候表的字段太多,只是大致记得表的注释,想通过字段注释查找字段名称,可以用如下语句: SELECT COLUMN_NAME,column_comment FROM INFORMATION_SCHEMA.Columns WHERE table_name='tj_record' AND table_schema='tianjin_20140811' AND column_comment LIKE  '%数据是否有效%' 其中table_schema为数据库