mysql - 了解一些 SQL 子查询示例
问题描述
我一直在从互联网上的资源中自学 SQL。我有两个我想了解的 SQL 查询。
- 编写 SQL 查询以从表中获取三个最高薪水。
SELECT distinct Salary from worker a WHERE 3 >= (SELECT count(distinct Salary) from worker b WHERE a.Salary <= b.Salary) order by a.Salary desc;
- 编写 SQL 查询以从表中获取三分钟工资。
SELECT distinct Salary from worker a WHERE 3 >= (SELECT count(distinct Salary) from worker b WHERE a.Salary >= b.Salary) order by a.Salary desc;
正如你所看到的,这两个是相似的。我不是特别明白的部分是这样的:
(a.Salary >= b.Salary)
或者(a.Salary <= b.Salary)
我不明白这里的逻辑。它在这里做什么?
桌子:
解决方案
在您对每个给定薪水的查询中,计算出比当前薪水多/少的薪水。如果计数大于 3,则不应显示当前的。这些条件(a.Salary >= b.Salary)
负责计算比当前更多/更少的薪水。
但要获得 3 min/max salareis,我会这样做:
SELECT slary
FROM worker
ORDER BY salary DESC
LIMIT 3;
分钟:
SELECT slary
FROM worker
ORDER BY salary ASC
LIMIT 3;
如果一名工人可以拥有多条记录,并且您需要显示最大总数,则为:
SELECT SUM(slary) total_salary
FROM worker
GROUP BY worker_id
ORDER BY salary DESC
LIMIT 3
推荐阅读
- recursion - 球拍树遍历
- android - 实施 'com.firebaseui:firebase-ui-database:4.1.0 错误
- validation - 如何使用条件数据验证来检查用户是否输入了公式或值?
- php - 使用 php 的 google api 中的无效 api 密钥权限被拒绝错误
- raku - 在接收器上下文中无用地使用 LOOP_BLOCK_1 符号
- javascript - 仅更新非空字段 | 对象传播
- c# - 阻止滚动条的值更改事件处理程序,直到滚动条被释放
- openlayers - OpenLayers - 如何显示特征标签?
- javascript - 为什么我的 IDE 告诉我在 Javascript 中用 var 定义变量是错误的?
- mysql - MySQL SELECT AS 后何时使用引号