【发布时间】:2018-01-17 22:58:56
【问题描述】:
我有以下人事表:
+---------+----------+-------------+
| name | dept_nbr | job_title |
+---------+----------+-------------+
| Michael | 14 | Programmer |
| Kumar | 14 | Programmer |
| Dave | 14 | Programmer |
| Jane | 14 | Manager |
| Carol | 37 | Programmer |
| Joe | 37 | Programmer |
| John | 59 | CEO |
+---------+----------+-------------+
问题:找出所有少于 3 名程序员的 dept_nbr(部门)。
工作查询:
SELECT DISTINCT dept_nbr
FROM Personnel AS P1
WHERE (SELECT COUNT(P2.dept_nbr)
FROM Personnel AS P2
WHERE P1.dept_nbr = P2.dept_nbr AND P2.job_title = 'Programmer') < 3;
结果:
37
59
注意事项:
正确地不包括第 14 部门,因为它有 3 名程序员(3 名等于但不少于 3 名)。部门 59 的程序员为零,也正确包含在结果中。
我的问题:
当上述查询执行时,通用 SQL 引擎如何进行?根据我的阅读,SQL 执行顺序(大致)是:From、Where、Group By、Have 和 Select。那么,下面的说法正确吗?
1 - 外部查询将 Personnel 表的每一行作为 P1 传递给内部查询。
2.a - 内部查询将整个 Personnel 表作为 P2 逐行扫描,查找满足条件“P1.dept_nbr = P2.dept_nbr AND P2.job_title = '程序员”。
2.b –一旦对整个表进行内部查询,它会计算匹配的 dept_nbr 值并将其返回给外部查询。
3 – 在Outer Query中,如果Inner Query返回的计数满足条件“WHERE(Inner Query Count Result)
4 – 在外部查询处理的所有行之后,外部查询对结果执行 DISTINCT 并显示唯一的 dept_nbr 值。
我上面的理解正确吗?具体来说,外部查询是否在最后执行 DISTINCT(步骤 #4)?这样看来,内部查询是在做冗余扫描(例如,它处理了四次dept_nbr = 14,当它在第一遍中确实有答案时)。
我在 sqlfiddle.com 上使用 MySQL 5.6 测试了上述查询。
【问题讨论】:
标签: mysql sql subquery correlated-subquery