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 后待分组字段名尽量不要使用别名,即使用了也一定要用不带引号的别名,否则不报错但是查询结果错误