mysql中的where子句“where 3”

时间:2015-01-16 16:44:25

标签: mysql where-clause

我从我的表中获得了3个最高薪水这里我的查询

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

它工作正常,但我想知道,为什么我们把条件“Where 3”?它是如何表现的?

2 个答案:

答案 0 :(得分:3)

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

查询可以写成这样简单:

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

注意:

别名e1不需要,但我在FORM子句中使用它并在ORDER BY子句中使用它来清楚表示salary的每个实例的内容(表格和字段都有此名称。

工作原理:
ORDER表格中的行" salary" BY字段salary降序(最高工资优先),SELECTDISTINCT个值(这是您编写好的地方)和LIMIT s结果集到3行。

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

如果表格在字段salary上有索引,则它会像风一样运行。如果它没有这样的索引,请立即创建:

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

答案 1 :(得分:2)

相等比较是比较两个值。一侧的常量值为3,另一侧的子查询返回的值。

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

"技巧"这是右侧的子查询。这就是我们称之为"相关的"子查询。对于正在评估的每一行都会运行。

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

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

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

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

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

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

使用我们刚刚获得的值运行另一个查询来获取计数。

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

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

重复一遍,直到我们为salary表中的所有行完成它。

最后一步是DISTINCT操作,它消除了我们本来会返回的任何重复。

它是如何表现的。


就性能而言,在大型套装中,相关的子查询将分别用于我们的午餐和午餐盒。这不是唯一可以返回此结果的查询模式,还有其他查询可以减少返回等效结果的工作。