SQL - Having 子句

你好,未来的 SQL 巫师们!今天,我们将踏上一段激动人心的旅程,探索 SQL 中的 HAVING 子句。作为你友好的邻居计算机老师,我在这里一步一步地引导你完成这次冒险。所以,拿起你的虚拟记事本,让我们一起潜入!

SQL - Having Clause

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;

以下是发生的情况:

  1. 我们按产品类别对产品进行分组。
  2. 我们计算每个类别中的产品数量。
  3. HAVING 子句只让产品数量超过 10 的类别通过。
  4. 最后,我们按产品数量降序排列结果。

这就像是在整理你的衣橱,但只保留拥有超过 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 客户:

  1. 我们按客户对订单进行分组。
  2. 我们计算每个客户的花费总额。
  3. HAVING 子句过滤出花费超过 1000 美元的客户。
  4. 然后,我们按这些 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;

这个查询是在寻找多产的作者:

  1. 我们按作者对书籍进行分组。
  2. 我们计算每个作者写了多少本书。
  3. HAVING 子句只保留写了 5 本或更多书的作者。
  4. 我们排序结果,以首先看到最多产的作者。

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;

这个查询就像是在寻找表现优异的部门:

  1. 我们按部门对绩效评分进行分组。
  2. 我们计算每个部门的平均分数。
  3. HAVING 子句只保留平均分数超过 8.5 的部门。
  4. 我们排序结果,以首先看到表现最好的部门。

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;

这个查询是在寻找奢侈品类别:

  1. 我们按类别对产品进行分组。
  2. 我们找到每个类别中的最高价格。
  3. HAVING 子句只保留至少有一个产品价格超过 1000 美元的类别。
  4. 我们排序结果,以首先看到最昂贵物品的类别。

就这样,各位!你已经了解了 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