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 和字段都具有此名称)。
工作原理:
它 ORDER
s 来自 table "salary" BY
字段的行 salary
降序(最高薪水在前),仅 SELECT
s DISTINCT
值(这是你写得很好的地方)和 LIMIT
s 结果集为 3
行。
事实上,它在从列 salary
中找到 3 个最大的不同值后停止执行。
如果 table 在字段 salary
上有索引,它运行起来就像风一样。如果没有这样的索引,现在创建它:
ALTER TABLE `salary` ADD INDEX (`salary`);
我已经从我的 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
而是因为它在内部查询中不必要地使用。
查询可以这么简单的写:
SELECT DISTINCT e1.salary
FROM salary e1
ORDER BY e1.salary DESC
LIMIT 3;
注:
别名 e1
不是必需的,但我在 FORM
子句中使用了它,并在 ORDER BY
子句中使用它来明确表示 [=16= 的每个实例](table 和字段都具有此名称)。
工作原理:
它 ORDER
s 来自 table "salary" BY
字段的行 salary
降序(最高薪水在前),仅 SELECT
s DISTINCT
值(这是你写得很好的地方)和 LIMIT
s 结果集为 3
行。
事实上,它在从列 salary
中找到 3 个最大的不同值后停止执行。
如果 table 在字段 salary
上有索引,它运行起来就像风一样。如果没有这样的索引,现在创建它:
ALTER TABLE `salary` ADD INDEX (`salary`);