Q: Write a query to retrieve two minimum and maximum salaries from the EmployeePosition table.
查找最小的两条记录
To retrieve two minimum salaries, you can write a query as below:
SELECT DISTINCT Salary
FROM EmployeePosition E1
WHERE 2 >= (SELECT COUNT(DISTINCT Salary)
FROM EmployeePosition E2
WHERE E1.Salary >= E2.Salary)
ORDER BY E1.Salary DEsC;
查找最大的两条记录
To retrieve two maximum salaries, you can write a query as below:
SELECT DISTINCT Salary
FROM EmployeePosition E1
WHERE 2 >= (SELECT COUNT(DISTINCT Salary)
FROM EmployeePosition E2
WHERE E1.Salary <= E2.Salary)
ORDER BY E1.Salary DEsC;
其中,一开始不懂这个语句的意思
WHERE 2 >= (SELECT COUNT(DISTINCT Salary)
FROM EmployeePosition E2
WHERE E1.Salary <= E2.Salary)
E2是内查询的子表,E1.Salary <= E2.Salary 会循环迭代每一个外表E1的记录跟子表的记录做大小比较,然后计数。
比如在查询最小的两条记录,整个E1的记录,如果只有两个或两个以下记录数小于等于E2当前这个值,那这个值就会选上。换句话说,E2当前这个记录,如果大于等于E1的记录数是1,那么他就是最小的,如果大于等于E1的记录数是2,那么他就是第二小的。
放一个来源解释的截图: