如下表(table1):
id client
1 001
1 002
1 003
2 001
2 002
3 001
1 001
id 代表客服人员的 id,client 代表与该客服人员通话的客户的 id,也是说,每有一条记录,就代表一个客服与一位客户进行了通话,相同的记录,例如第一行和第七行,代表着 1 号客服与 001 号客户在不同的时间进行了两次通话,问:如下 SQL 可否统计出与客户通话次数大于 1 客服 id?
SELECT id, COUNT(client) AS count
FROM table1
GROUP BY id
WHERE count > 1;
答案是不能,执行该 SQL 会报错:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE count > 1' at line 4
原因: WHERE 子句会比 SELECT 子句先执行,上面的 SQL 中 ,当 WHERE 子句被执行时,count 这个值尚不存在。直到 WHERE 子句执行完毕,count 才会被计算出来。
SQL 语句的书写顺序如下:
SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY
SQL 语句的执行顺序如下:
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
其中 SELECT 和 FROM 是必须的,其他关键词是可选的,这六个关键词的执行顺序 与SQL语句的书写顺序并不是一样的,而是按照下面的顺序来执行
所以本文开头所说的查询有两种实现的 SQL:
# 使用 HAVING 过滤分组中的数据
SELECT id, COUNT(client) AS count
FROM table1
GROUP BY id
HAVING count > 1;
# 使用内嵌视图(子查询),让 WHERE 可以引用别名
SELECT * FROM
(SELECT id, COUNT(client) AS count
FROM byte_dance_table_1
GROUP BY id) tmp
WHERE tmp.count > 1;