SQL - Having 子句
你好,未来的 SQL 巫师们!今天,我们将踏上一段激动人心的旅程,探索 SQL 中的 HAVING 子句。作为你友好的邻居计算机老师,我在这里一步一步地引导你完成这次冒险。所以,拿起你的虚拟记事本,让我们一起潜入!
SQL HAVING 子句
想象一下,你正在尝试组织一个派对,但只想邀请那些与你至少有五个共同朋友的人。这正是 SQL 中的 HAVING 子句所做的 —— 它帮助我们根据特定条件过滤分组结果。
HAVING 子句就像是站在你数据派对门口的保安。它根据你设定的规则决定哪些数据组可以进来。让我们来看一个简单的例子:
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
在这个例子中,我们在查看每个部门的平均工资,但我们只想看到平均工资超过 50,000 美元的部门。HAVING 子句是我们的保安,检查每个组(部门),只让符合我们条件的组进来。
HAVING 与 GROUP BY 子句一起使用
HAVING 子句经常与 GROUP BY 配对使用,就像两个总是形影不离的好朋友。GROUP BY 将我们的数据组织成组,而 HAVING 根据条件过滤这些组。
让我们看另一个例子:
SELECT product_category, COUNT(*) as product_count
FROM products
GROUP BY product_category
HAVING COUNT(*) > 10
ORDER BY product_count DESC;
以下是发生的情况:
- 我们按产品类别对产品进行分组。
- 我们计算每个类别中的产品数量。
- HAVING 子句只让产品数量超过 10 的类别通过。
- 最后,我们按产品数量降序排列结果。
这就像是在整理你的衣橱,但只保留拥有超过 10 件物品的分区,然后从物品最多到最少排列它们。
HAVING 与 ORDER BY 子句一起使用
正如你在前一个例子中看到的,HAVING 也能与 ORDER BY 和睦相处。让我们看另一个例子:
SELECT customer_id, SUM(order_total) as total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(order_total) > 1000
ORDER BY total_spent DESC;
这个查询就像是在寻找你的 VIP 客户:
- 我们按客户对订单进行分组。
- 我们计算每个客户的花费总额。
- HAVING 子句过滤出花费超过 1000 美元的客户。
- 然后,我们按这些 VIP 客户的花费从高到低排序。
HAVING 子句与 COUNT() 函数
COUNT() 函数就像是 HAVING 的忠诚助手,总是准备好帮助计数。这里有一个例子:
SELECT author, COUNT(book_id) as book_count
FROM books
GROUP BY author
HAVING COUNT(book_id) >= 5
ORDER BY book_count DESC;
这个查询是在寻找多产的作者:
- 我们按作者对书籍进行分组。
- 我们计算每个作者写了多少本书。
- HAVING 子句只保留写了 5 本或更多书的作者。
- 我们排序结果,以首先看到最多产的作者。
HAVING 子句与 AVG() 函数
AVG() 是 HAVING 的另一个好朋友。让我们看看它们一起工作的样子:
SELECT department, AVG(performance_score) as avg_score
FROM employee_performance
GROUP BY department
HAVING AVG(performance_score) > 8.5
ORDER BY avg_score DESC;
这个查询就像是在寻找表现优异的部门:
- 我们按部门对绩效评分进行分组。
- 我们计算每个部门的平均分数。
- HAVING 子句只保留平均分数超过 8.5 的部门。
- 我们排序结果,以首先看到表现最好的部门。
HAVING 子句与 MAX() 函数
最后但同样重要的是,让我们看看 HAVING 如何与 MAX() 一起工作:
SELECT product_category, MAX(price) as highest_price
FROM products
GROUP BY product_category
HAVING MAX(price) > 1000
ORDER BY highest_price DESC;
这个查询是在寻找奢侈品类别:
- 我们按类别对产品进行分组。
- 我们找到每个类别中的最高价格。
- HAVING 子句只保留至少有一个产品价格超过 1000 美元的类别。
- 我们排序结果,以首先看到最昂贵物品的类别。
就这样,各位!你已经了解了 HAVING 子句及其在 SQL 中的最佳伙伴。记住,熟能生巧,所以不要害怕尝试这些查询。在你意识到之前,你将能够像一个专业人士那样编写复杂的 SQL 查询!
以下是我们在本文中介绍的方法的快速参考表:
方法 | 描述 | 示例 |
---|---|---|
HAVING | 过滤分组结果 | HAVING AVG(salary) > 50000 |
GROUP BY | 根据相似值分组行 | GROUP BY department |
ORDER BY | 对结果集进行排序 | ORDER BY total_spent DESC |
COUNT() | 计算行数 | HAVING COUNT(book_id) >= 5 |
AVG() | 计算一组值的平均值 | HAVING AVG(performance_score) > 8.5 |
MAX() | 返回一组中的最大值 | HAVING MAX(price) > 1000 |
快乐查询,愿你的数据永远干净,查询永远高效!
Credits: Image by storyset