HAVING与WHERE的聚合函数MySQL Workbench



上下文:我对编码还很陌生,从python开始大约2个月,然后在过去几个月改用SQL。我几乎是自学成才的,使用youtube视频,通过Udemy上课(这也是我的偏好,以防这个问题听起来很傻(。我正在做一道练习题。问题是:

"创建一个可视化,提供从1990年开始每年在公司工作的男性和女性员工之间的细分"。(可视化部分用于tableau,但目前我首先为SQL中所需的输出创建查询(。

我知道,通常情况下,WHERE用于查询中所有记录的一般条件,而HAVING用于进一步筛选,可以与聚合函数一起使用,而WHERE不能与聚合函数配合使用。我在代码中使用了WHERE,而解决方案使用了HAVING,每个代码中都有一些差异。他们都产生了相同的结果。

问题:我的代码可以接受吗?我得到了正确的结果是侥幸吗?是正确的,但可能不是最正确的吗;正式的";或";专业的";做这件事的方法(类主要关注确保你有干净的代码和使用专业标准来提高可读性等(,还是完全可以,只是用两种不同的方法来解决同一个问题?这个问题并没有明确地说明它们是多种解决方案

我的代码:

SELECT
YEAR(d.from_date) AS year,
e.gender,
COUNT(e.emp_no) AS employees
FROM
t_employees e
JOIN
t_dept_emp d ON e.emp_no = d.emp_no
WHERE
d.from_date BETWEEN '1989-12-31' AND sysdate()
GROUP BY year, e.gender
ORDER BY year;

解决方案:

SELECT
YEAR(d.from_date) AS calendar_year,
gender,
COUNT(e.emp_no) AS Employees
FROM
t_employees e
JOIN
t_dept_emp d ON e.emp_no = d.emp_no
GROUP BY calendar_year, e.gender
HAVING calendar_year >= 1990
ORDER BY calendar_year;

提前谢谢!

这两个查询是等价的。如果使用WHERE筛选器来筛选与GROUP BY中某列相同的表达式,则查询将产生相同的结果。您的解决方案可能更高效,因为聚合需要内存来存储所有组。在早期的WHERE处理过程中过滤掉这些行可以减少内存使用(理想情况下,数据库引擎能够检测到这种等价性并以任何一种方式优化查询,但MySQL的优化器可能没有那么聪明(。

最新更新