首页 > 技术文章 > SQL Where中的子查询

intheway 2016-10-04 21:26 原文

-- 找到每个部门工资最高的人(包括并列第一)
CREATE TABLE Salary(
EmpID VARCHAR(10),
DeptID VARCHAR(10),
Salary FLOAT
)

INSERT INTO Salary
SELECT 'A011','D001', 4300
UNION ALL  SELECT 'A002','D001', 4300
UNION ALL  SELECT 'A003','D002', 5200
UNION ALL  SELECT 'A004','D002', 4600
UNION ALL  SELECT 'A005','D003', 8700
UNION ALL  SELECT 'A006','D003', 9300
UNION ALL  SELECT 'A007','D003', 6500
UNION ALL  SELECT 'A008','D004', 7700
UNION ALL  SELECT 'A009','D004', 9800
UNION ALL  SELECT 'A010','D004', 11000


-- 用表连接
SELECT a.* FROM Salary a
INNER JOIN(SELECT DeptID,MAX(Salary) AS Salary 
	FROM Salary 
	GROUP BY DeptID)T
ON a.DeptID=T.DeptID
AND a.Salary=T.Salary

-- 用NOT EXISTS不是太好理解
SELECT * FROM Salary a
WHERE NOT EXISTS(SELECT 1 FROM Salary b WHERE a.DeptID=B.DeptID and Salary>a.Salary )

-- 用Where中的子查询
SELECT Empid,DeptID,Salary FROM Salary a
WHERE Salary = (SELECT MAX(salary) FROM Salary b WHERE b.DeptID=a.DeptID)
ORDER BY Empid,DeptID

/* 子查询步骤
1. 外部查询获得一条记录并将其传入内部查询;
2. 基于传入的值进行内部查询
3. 内部查询将自己返回的结果值传给外部查询,外部查询利用这些值完成自己的处理。
*/

/*
Empid	DeptID	Salary
A002	D001	4300
A003	D002	5200
A006	D003	9300
A010	D004	11000
A011	D001	4300
*/

-- 找到每个部门工资最高的人(并列时只选一人)
SELECT MIN(EmpID) EmpID,a.DeptID,a.Salary FROM Salary a
INNER JOIN(SELECT DeptID,MAX(Salary) AS Salary 
	FROM Salary 
	GROUP BY DeptID)T
ON a.DeptID=T.DeptID
AND a.Salary=T.Salary
GROUP BY a.DeptID,a.Salary


-- 用Where中的子查询

SELECT Empid,DeptID,Salary FROM Salary a
WHERE Salary = (SELECT MAX(salary) FROM Salary b WHERE b.DeptID=a.DeptID)
	AND Empid = (SELECT MIN(Empid) FROM Salary b WHERE b.Salary=a.Salary) -- 这里 别名都用b没有问题。
ORDER BY Empid,DeptID


-- 分组

SELECT MIN(Empid) Empid,DeptID,Salary FROM Salary a
WHERE Salary = (SELECT MAX(salary) FROM Salary b WHERE b.DeptID=a.DeptID)
GROUP BY DeptID,Salary
ORDER BY Empid,DeptID

  

推荐阅读