Mysql使用中group by分组异常
今天使用group by
对数据进行分组查询,然后发现一个问题
SELECT deptno AS '部门编号', COUNT(empno) AS '人数', FROM emp, WHERE temp.deptno = emp.`deptno` GROUP BY '部门编号'
这样的查询结果是错误的,这样的结果等价于不进行分组,这是为什么呢,我找了好些资料,如果这是发生在标准的SQL里是非常正常的,这是因为在标准的SQL里,是有执行顺序的
- FROM...
- WHERE...
- GROUP BY...
- SELECT...
按照执行顺序,在执行到GROUP BY
的时候,还没有执行到SELECT语句,所以就获取不到AS的别名,因此分组失败!
但是这里是mysql,mysql是支持group by使用别名分组的,但是为什么不行呢,我测试了一下,当别名不使用单引号包围,这样的话是可以成功分组的,但是一旦使用单引号包围的别名就会导致分组失败
也就是说这样使可以分组成功的,但是为了保险起见,顺便遵循标准的SQL语法,group by后面还是尽量不要使用别名!
SELECT deptno AS asdf, COUNT(empno) AS '人数', FROM emp WHERE temp.deptno = emp.`deptno` GROUP BY asdf
顺便一提,当子查询表的字段取的别名加了引号后,在select中查询这个带引号的字段就会报错
-- 正常查询 SELECT dept.`dname`,dept.loc, temp.哈哈 FROM dept, ( SELECT deptno, COUNT(*) AS 哈哈 FROM emp GROUP BY deptno ) temp WHERE temp.deptno = dept.`deptno` -- 随便取啥别名都报错 SELECT dept.`dname`,dept.loc, temp.'随便放啥都报错' FROM dept, ( SELECT deptno, COUNT(*) AS '随便方啥都报错' FROM emp GROUP BY deptno ) temp WHERE temp.deptno = dept.`deptno`
总结:
- 取别名不要加引号,即使是中文别名(所有问题都解决)
- GROUP BY 后待分组字段名尽量不要使用别名,即使用了也一定要用不带引号的别名,否则不报错但是查询结果错误
分类:
Mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】