SQL練習(xí)筆記一:部門員工最高工資
點(diǎn)擊上方藍(lán)字關(guān)注「網(wǎng)優(yōu)小兵玩Python」
◆?◆?◆
創(chuàng)建Employee 表,包含所有員工信息,每個員工有其對應(yīng)的 Id, salary 和 department Id。
-- 創(chuàng)建Employee表 --CREATE TABLE Employee(Id int(4) not null,Name VARCHAR(10) not null,Salary int(10) not null,DepartmentId int(4) not NULL);-- 增加4條數(shù)據(jù) --INSERT INTO Employee VALUES(1,'Joe',70000,1);INSERT INTO Employee VALUES(2,'Henry',80000,2);INSERT INTO Employee VALUES(3,'Sam',60000,2);INSERT INTO Employee VALUES(4,'Max',90000,1);

創(chuàng)建Department 表,包含公司所有部門的信息。
-- 創(chuàng)建Department表 --CREATE TABLE Department(Id int(4) not null,Name VARCHAR(10));-- 增加2條數(shù)據(jù) --INSERT into Department VALUES(1,'IT');INSERT?into?Department?VALUES(2,'Sales');

問題一:編寫一個 SQL 查詢,找出每個部門工資最高的員工。例如,根據(jù)上述給定的表格,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資。
--?通過排序(必須加上LIMIT,不然結(jié)果不正確)與GROUP?BY結(jié)合求出部門內(nèi)最高工資,INNER?JOIN再關(guān)聯(lián)上部門名?--SELECTD.Name AS Department,E.Name AS Employee,SalaryFROM( SELECT * FROM Employee ORDER BY Salary DESC LIMIT 10 ) AS EINNER JOIN Department AS D ON E.DepartmentId = D.IdGROUP BYE.DepartmentId;

問題2:查詢部門工資前3的信息。
-- 增加2條數(shù)據(jù) --INSERT INTO Employee VALUES(5,'Janet',69000,1);INSERT?INTO?Employee?VALUES(6,'Randy',85000,1);-- 使用窗口函數(shù)對各部門的員工工資進(jìn)行分組排序SELECT( SELECT D.Name FROM Department AS D WHERE DepartmentId = D.Id ) AS 'Department',??Name,SalaryFROM( SELECT Name, Salary, DepartmentId, RANK() over ( PARTITION BY DepartmentId ORDER BY Salary DESC ) AS ranking FROM Employee ) AS bWHEREranking <= 3;

總結(jié):當(dāng)ORDEY BY與GROUP BY結(jié)合查詢時需使用LIMIT分頁,不然分組后排序的結(jié)果各列值會對不上,問題一SQL語句中如不加LIMIT,查詢結(jié)果如下:

可以看出IT部門的最高工資查詢結(jié)果是錯誤的。問題一可用問題二的窗口函數(shù)解法查詢,WHERE的條件修改為ranking<2即可。
網(wǎng)優(yōu)苦短,我用Python


網(wǎng)優(yōu)小工具傳送門

評論
圖片
表情
