我从我的表中获得了3个最高薪水这里我的查询
SELECT DISTINCT salary
FROM salary e1
WHERE 3 = (
SELECT count( DISTINCT salary )
FROM salary e2
WHERE e1.salary >= e2.salary )
它工作正常,但我想知道,为什么我们把条件“Where 3”?它是如何表现的?
答案 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
降序(最高工资优先),SELECT
仅DISTINCT
个值(这是您编写好的地方)和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操作,它消除了我们本来会返回的任何重复。
它是如何表现的。
就性能而言,在大型套装中,相关的子查询将分别用于我们的午餐和午餐盒。这不是唯一可以返回此结果的查询模式,还有其他查询可以减少返回等效结果的工作。