mysql "where 3" 中的 where 子句

where clause in mysql "where 3"

我已经从我的 table 中获取了 3 个最高薪水,这是我的查询

SELECT DISTINCT salary
FROM salary e1
WHERE 3 = (
SELECT count( DISTINCT salary )
FROM salary e2
WHERE e1.salary >= e2.salary ) 

它工作正常,但我想知道,为什么我们放置条件 "Where 3"?它的表现如何?

相等比较是比较两个值。一侧的常量值 3,另一侧的值 return 由子查询编辑。

如果正在评估的行的比较结果为 TRUE,则该行将被 returned。否则,该行将不会 returned。

这里的"trick"就是右边的子查询。这就是我们所说的 "correlated" 子查询。正在评估的每一行都会得到 运行。

基本上,操作可以这样描述...

salary table 访问一行,并从中获取 salary 列的值。

运行 另一个查询,使用 salary 列的值来获取计数。

将该计数与常量值 3 进行比较。

如果比较结果为 TRUE,return 该行,否则丢弃它。

访问 salary table 的下一行并获取工资值。

运行 另一个查询,使用我们刚刚得到的值,得到一个计数。

将计数与常量值 3 进行比较。

如果比较结果为 TRUE,return 该行,否则丢弃。

然后重复该操作,直到我们对 salary table.

中的所有行完成此操作

最后一步是 DISTINCT 操作,它消除了我们本来会 returning 的所有重复项。

这就是它的表现。


就性能而言,在大型集合上,相关子查询将用于我们的每份午餐,还有我们的午餐盒。这不是唯一可以 return 这个结果的查询模式,还有其他查询会做更少的工作来 return 一个等效的结果。

您的查询速度慢不是因为 3 而是因为它在内部查询中不必要地使用。 由 @spencer7593 提供,解释了它是如何工作的,你可以看到它一次又一次地做同样的事情。

查询可以这么简单的写:

SELECT DISTINCT e1.salary
FROM salary e1
ORDER BY e1.salary DESC
LIMIT 3;

注:

别名 e1 不是必需的,但我在 FORM 子句中使用了它,并在 ORDER BY 子句中使用它来明确表示 [=16= 的每个实例](table 和字段都具有此名称)。

工作原理:
ORDERs 来自 table "salary" BY 字段的行 salary 降序(最高薪水在前),仅 SELECTs DISTINCT值(这是你写得很好的地方)和 LIMITs 结果集为 3 行。

事实上,它在从列 salary 中找到 3 个最大的不同值后停止执行。

如果 table 在字段 salary 上有索引,它运行起来就像风一样。如果没有这样的索引,现在创建它:

ALTER TABLE `salary` ADD INDEX (`salary`);