Mysql使用中group by分组异常

今天使用group by对数据进行分组查询,然后发现一个问题

SELECT 
	deptno AS '部门编号', 
	COUNT(empno) AS '人数',
FROM emp,
WHERE temp.deptno = emp.`deptno`
GROUP BY '部门编号'

这样的查询结果是错误的,这样的结果等价于不进行分组,这是为什么呢,我找了好些资料,如果这是发生在标准的SQL里是非常正常的,这是因为在标准的SQL里,是有执行顺序的

  1. FROM...
  2. WHERE...
  3. GROUP BY...
  4. 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`

总结:

  1. 取别名不要加引号,即使是中文别名(所有问题都解决)
  2. GROUP BY 后待分组字段名尽量不要使用别名,即使用了也一定要用不带引号的别名,否则不报错但是查询结果错误
posted @ 2022-03-31 22:12  ふじさんのゆき  阅读(449)  评论(0编辑  收藏  举报