在mysql中既然where和having都能过滤,为什么用where的多

问答在mysql中既然where和having都能过滤,为什么用where的多
王利头 管理员 asked 7 月 ago
3 个回答
Mark Owen 管理员 answered 7 月 ago

在 MySQL 数据库中,WHERE 和 HAVING 都是功能强大的过滤器,用于从表中提取特定数据。尽管它们拥有类似的过滤功能,但它们在使用场景和作用范围上却有明显的区别。

WHERE:筛选行

WHERE 子句用于在表中筛选行。它根据指定的条件对每行进行评估,如果条件满足,则该行将被选择。换句话说,WHERE 子句决定了哪些行将被包含在最终结果集中。

例如:

sql
SELECT * FROM employees WHERE department = 'Sales';

该查询将选择所有属于 “Sales” 部门的员工记录。WHERE 子句对每行进行评估,并仅选择满足条件的行。

HAVING:筛选组

HAVING 子句用于在对表进行分组后筛选分组结果。它根据指定的条件对每个分组进行评估,如果条件满足,则该分组将被选择。HAVING 子句决定了哪些分组将被包含在最终结果集中。

例如:

sql
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING total_salary > 100000;

该查询将根据部门对员工记录进行分组,并计算每个部门的总工资。HAVING 子句对每个分组进行评估,并仅选择总工资大于 100,000 的分组。

使用 WHERE 多的原因

尽管 WHERE 和 HAVING 都可以用于过滤数据,但在大多数情况下使用 WHERE 的原因有以下几点:

1. 效率

WHERE 子句在查询执行期间早期应用,因为它在计算之前筛选行。另一方面,HAVING 子句在分组计算完成后应用。这意味着 WHERE 子句通常比 HAVING 子句更有效,因为它需要处理更少的数据。

2. 灵活度

WHERE 子句可以应用于表中的任何列,包括分组列。HAVING 子句只能应用于分组列或聚合函数的结果。这使得 WHERE 子句在过滤数据方面更加灵活。

3. 直观性

WHERE 子句对于初学者和经验丰富的用户来说都更容易理解和使用。HAVING 子句需要对分组和聚合函数有更深入的理解,因此对于初学者来说可能更具挑战性。

结论

WHERE 和 HAVING 是 MySQL 中强大的过滤器,但它们的最佳用途有所不同。对于在行级别过滤数据,WHERE 子句是首选。而对于在组级别过滤数据,HAVING 子句是必不可少的。通过了解它们的差异并根据具体情况选择合适的过滤器,您可以最大限度地提高查询效率并获得所需的准确结果。

seoer788 管理员 answered 7 月 ago

WHERE 和 HAVING 都是 SQL 中的过滤谓词,用于从表中选择满足特定条件的行。但它们主要应用于不同的数据子集中,导致 WHERE 的使用频率更高。

WHERE 过滤行

WHERE 谓词应用于表的行,在检索数据之前过滤不满足条件的行。它检查每个行的列值,并仅选择符合特定标准的行。这通常用于在查询结果中排除或包含特定的数据点,例如:

sql
SELECT * FROM orders WHERE order_date > '2023-01-01';

HAVING 过滤组

HAVING 谓词应用于经过 GROUP BY 子句分组后的行组,在聚合函数(如 SUM、COUNT、AVG 等)计算之后过滤结果。它检查每个组的聚合结果,并仅选择满足特定条件的组。这通常用于在分组结果中排除或包含特定的数据子集,例如:

sql
SELECT SUM(quantity) AS total_quantity
FROM orders
GROUP BY product_id
HAVING total_quantity > 100;

为什么 WHERE 用得更多

尽管 HAVING 在某些情况下很有用,但 WHERE 在大多数情况下更常用,原因如下:

  • 更广泛的适用性:WHERE 可用于所有类型的查询,无论是简单查询还是复杂查询。HAVING 仅适用于聚合查询,限制了它的使用范围。
  • 更直观:WHERE 语法更直观,易于理解和使用,即使对于初学者也是如此。HAVING 语法需要对分组和聚合概念有一定了解。
  • 更好的性能:WHERE 过滤的行越早,查询性能越好。HAVING 在聚合计算之后过滤行,这可能会影响查询速度。
  • 索引利用:WHERE 谓词可以利用索引进行优化,加快查询速度。HAVING 不能利用索引,因为它应用于聚合结果。

例外情况

在某些情况下,HAVING 比 WHERE 更合适:

  • 分组条件:HAVING 可用于指定分组条件,这是 WHERE 无法做到的。
  • 聚合条件:HAVING 可用于过滤聚合结果,这是 WHERE 无法做到的。

总结

总体而言,WHERE 用得更多,因为它更加通用、直观、高效并且可以利用索引。HAVING 在聚合查询中过滤分组结果时很有用,但在大多数情况下,WHERE 是更合适的选择。

ismydata 管理员 answered 7 月 ago

在 MySQL 中,WHERE 和 HAVING 都是过滤语句,但它们的作用域和使用场景有所不同,导致 WHERE 的使用频率更高。

作用域的不同

WHERE 子句用于在 SELECT 语句中对行进行过滤,应用于从表中检索的数据集。它根据指定的条件从表中选择符合要求的行。

HAVING 子句则用于在 GROUP BY 语句中对分组后的数据进行过滤,应用于已分组的聚合结果。它根据指定的条件从分组后的数据中选择符合要求的组。

使用场景的不同

WHERE 主要用于以下场景:

  • 从表中选择满足特定条件的行
  • 根据特定条件排除行
  • 结合其他子句(如 JOIN、ORDER BY)使用

HAVING 主要用于以下场景:

  • 从分组后的数据中选择满足特定条件的组
  • 根据特定条件排除组
  • 结合聚合函数(如 SUM、COUNT、AVG)使用

WHERE 用得更多的原因

WHERE 用得更多的原因有以下几点:

  1. 更广泛的适用性:WHERE 可以用于过滤任何类型的表数据,而 HAVING 仅适用于已分组的数据。在大多数情况下,我们需要过滤未分组的数据,因此 WHERE 的适用范围更广。
  2. 效率更高:WHERE 在应用于未分组的数据时效率更高,因为它直接从表中筛选出符合要求的行。而 HAVING 在应用于分组后的数据时需要先进行分组,然后再筛选,这会增加计算负载。
  3. 更直观易懂:WHERE 的语法更简单直观,更容易理解和使用。而 HAVING 的语法稍显复杂,需要对分组和聚合函数有较好的理解。
  4. 更常见的需求:在实际应用中,我们经常需要对未分组的数据进行过滤,例如根据条件筛选客户信息、订单记录等。因此,WHERE 的需求量更大。

示例对比

以下示例展示了 WHERE 和 HAVING 的不同使用方式:

sql
-- 使用 WHERE 过滤未分组的数据
SELECT * FROM customers WHERE city = 'London';
-- 使用 HAVING 过滤分组后的数据
SELECT city, SUM(sales) AS total_sales
FROM sales
GROUP BY city
HAVING total_sales > 10000;

总结

WHERE 和 HAVING 都是 MySQL 中有用的过滤语句,但作用域和使用场景不同。WHERE 主要用于过滤未分组的数据,适用范围更广、效率更高、语法更简单,因此在实际应用中使用频率更高。而 HAVING 主要用于过滤分组后的数据,在处理聚合结果时发挥作用,但需求量较小。

公众号