1 问题
SQL是一门需要进行编译的语言,因此在实际执行过程中是需要数据库编译模块进行编译的。特别是在查询的时候,对于别名的使用,不管是表还是列,错误的使用会导致查询的失败。
2 详解
查询语句遵循以下的查询顺序,从执行的顺序来看,基本就可以看到select子句中列的别名是无法在group by和having等子句中出现的。
优先级 | 关键词 | 备注 |
1 | FROM | from子句返回初始结果集 |
2 | ON | 排除不满足join的条件的行 |
3 | JOIN | 多表关联 |
4 | WHERE | 子句排除不满足搜索条件的行 |
5 | GROUP BY | 子句将选定的行收集到group by子句中各个唯一值的组中 |
6 | HAVING | 子句排除不满足搜索条件的行 |
7 | SELECT | 列名,此时可以为列名起别名,列名之间用逗号隔开 |
8 | DISTINCT | 可以在select子句中,找出唯一值 |
9 | ORDER BY | 对结果集进行排序 |
10 | LIMIT | 限定查询的行数,一般放在查询语句的最后面 |
简单记为:from->where->group by->having->select->order by
3 总结
在mysql中,group by中可以使用列别名;where中不能使用列别名;order by中可以使用列别名。其余像oracle,hive中别名的使用都是严格遵循sql执行顺序的,groupby后面不能用别名。mysql特殊是因为mysql中对查询做了加强。