【问题标题】:Explain a MySQL Query to me向我解释一个 MySQL 查询
【发布时间】:2014-01-14 02:54:01
【问题描述】:

我很难弄清楚以下 mysql 查询是如何工作的

SELECT dp.name, COUNT(em.dp) as employees 
FROM dp LEFT JOIN em ON dp.name=em.dp 
GROUP BY dp.name 
HAVING COUNT(em.dp) = 2;

它只是显示哪些部门正好有 2 名员工。这是两张表:

em
----
id
full_name
dp


dp
----
id
name

这是我输入的一些条目。

INSERT INTO em (full_name, dp) VALUES ('Chris', 'ENG'), ('Steve', 'HR'), ('Mike', 'ACC'), ('Marvin', 'ACC');
INSERT INTO dp (name) VALUES ('ENG'), ('HR'), ('ACC');

有人可以用简单明了的方式解释上述查询吗?比如先发生的事情等等。

【问题讨论】:

  • 我认为更相关的问题是您希望它返回什么?这是一个相当直接的查询。 "返回 dp 中的所有内容以及 ep 中的任何匹配项,其中每个 dp.name 恰好有 2 个匹配项"
  • 您是否在任何文档中查找过GROUP BYHAVING
  • @SeanRedmond 我查阅了文档,了解 Joins、Group By 和 Have 如何处理简单案例,但不了解它们如何协同工作。
  • @JenZhang 你对哪一部分理解有问题? HAVING 应用于 GROUP BY 的结果
  • 我认为 OP 部分需要了解 SQL 中评估的流程。通常,任何查询都应按以下模式读取:FROM-WHERE-GROUP BY-HAVING-SELECT-ORDER BY。将其应用于上面的查询。这很容易。

标签: mysql sql


【解决方案1】:

查询对所有部门(来自 dp.name)进行分组并返回该部门的员工人数。

为了可视化这一点,您可以绘制一个包含两个表中所有列的单个表,这实际上是您的 JOIN。

然后,您可以通过从上面的表格中一次清楚地获取每个部门名称并为每个部门创建一行(这就是 GROUP BY 所做的)并检查该部门的次数来绘制第二个表显示在第一个表中(这是计数函数)。

【讨论】:

    【解决方案2】:

    您是否尝试过使用 mysql EXPLAIN 命令?您可以从 mysql 控制台访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多