SQL比较弱求解释下这条SQL(子查询)

Lewe2010 发布于 2016/07/01 18:25
阅读 330
收藏 2
表Employee:
 1 +----+-------+--------+--------------+
 2 | Id | Name  | Salary | DepartmentId |
 3 +----+-------+--------+--------------+
 4 | 1  | Joe   | 70000  | 1            |
 5 | 2  | Henry | 80000  | 2            |
 6 | 3  | Sam   | 60000  | 2            |
 7 | 4  | Max   | 90000  | 1            |
 8 | 5  | Janet | 69000  | 1            |
 9 | 6  | Randy | 85000  | 1            |
10 +----+-------+--------+--------------+
表Department:
1 +----+----------+
2 | Id | Name     |
3 +----+----------+
4 | 1  | IT       |
5 | 2  | Sales    |
6 +----+----------+
写一段SQL查询各部门收入前三位的员工信息,返回结果如下:
1 +------------+----------+--------+
2 | Department | Employee | Salary |
3 +------------+----------+--------+
4 | IT         | Max      | 90000  |
5 | IT         | Randy    | 85000  |
6 | IT         | Joe      | 70000  |
7 | Sales      | Henry    | 80000  |
8 | Sales      | Sam      | 60000  |
9 +------------+----------+--------+



SELECT
	a. NAME AS Department,
	b. NAME AS Employee,
	b.Salary
FROM
	Department a,
	Employee b
WHERE
	b.DepartmentId = a.Id
AND (
	SELECT
		count(DISTINCT Salary)
	FROM
		Employee
	WHERE
		DepartmentId = a.Id
	AND Salary > b.Salary
) < 3
ORDER BY
	Department



加载中
0
快速开发师
快速开发师

你这个是驱动查询,外层每搜到一条员工信息,传递给内层查询做(...)<3的判断 ,外层查询先执行完搜索到一条学生信息,便将所有信息变量给内层做判断,然后内层依靠这些变量a.Id , b.Salary, 的值进行统计判断,将统计结果和3比较,最后得出的结果后就告知外层搜索到的那条数据是否保留,保留则直接返回给结果集,然后外层继续搜索下一条员工信息,并丢给内层做判断是否保留外层的结果,一直到外层搜索完所有员工信息为止。

L
Lewe2010
回复 @快速开发师 : 为什么用<3呢?
快速开发师
快速开发师
驱动查询一般来说查询完比较慢,但是其可以一边查询一边产生结果集,客户端可以持续地搜到结果集。内部查询每次都要检索,会导致频繁加载表数据,如果内部查询访问的表过大就悲剧了,你会听到你的磁盘在咔咔咔吃吃吃地响。一般建议内部表比较小。这也不是必须,如果是oracle也许会把你看到的这种驱动形式,悄悄地解释成非驱动的hashjoin形式。
2
0
0808xyj
其含义是 查询每个部门工资前三名的员工信息,其思想是 分组取前N条数据
0
快速开发师
快速开发师
    查询工资水平在其部门排名前4的员工,不知道这样说对不对
快速开发师
快速开发师
纠正一下是前3不是4
L
Lewe2010
这个我知道,但是我是想知道SQL的思路 子查询那块
0
一耳听世界
一耳听世界

你这个表设计有问题

你应该在建立一个工资表

返回顶部
顶部