文章目錄
- 1.換座位(交換相鄰的id)
- 基本信息
- 要求
- 答案[case when]
- 2.分數排名(分組,排序)
- 基本信息
- 要求
- 答案
- 3.連續出現的數字(連接)
- 信息
- 要求
- 答案
- 4.第N高的薪水(函數)
- 信息
- 要求
- 答案
- 5.各個部門工資最高的員工(分組,連接)
- 信息
- 要求
- 答案
- 6.統計各專業人數
- 7.查詢回答率最高的問題
- 8.至少有5名直接下屬的經理
1.換座位(交換相鄰的id)
基本信息
小美是一所中學的信息科技老師,她有一張 seat 座位表,平時用來儲存學生名字和與他們相對應的座位 id。
其中縱列的 id 是連續遞增的
小美想改變相鄰倆學生的座位。
你能不能幫她寫一個 SQL query 來輸出小美想要的結果呢?
示例:
id | student |
---|---|
1 | Abbot |
2 | Doris |
3 | Emerson |
4 | Green |
5 | Jeames |
要求
假如數據輸入的是上表,則輸出結果如下:
id | student |
---|---|
1 | Doris |
2 | Abbot |
3 | Green |
4 | Emerson |
5 | Jeames |
- 注意:
如果學生人數是奇數,則不需要改變最后一個同學的座位。
答案[case when]
select(casewhen mod(id,2) = 1 and id != (select count(*) from seat) then id+1when mod(id,2)=0 then id-1else id end) as id , student
from seat
order by id asc
2.分數排名(分組,排序)
基本信息
編寫一個 SQL 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分后的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。
Id | Score |
---|---|
1 | 3.50 |
2 | 3.65 |
3 | 4.00 |
4 | 3.85 |
5 | 4.00 |
6 | 3.65 |
要求
例如,根據上述給定的 Scores 表,你的查詢應該返回(按分數從高到低排列):
Score | Rank |
---|---|
4.00 | 1 |
4.00 | 1 |
3.85 | 2 |
3.65 | 3 |
3.65 | 3 |
3.50 | 4 |
答案
select s.Score, count(distinct t.Score) Rank
from Scores s join Scores t on s.Score <= t.Score
group by s.Id order by s.Score desc;
3.連續出現的數字(連接)
信息
編寫一個 SQL 查詢,查找所有至少連續出現三次的數字。
Id | Num |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
4 | 2 |
5 | 1 |
6 | 2 |
7 | 2 |
要求
例如,給定上面的 Logs 表, 1 是唯一連續出現至少三次的數字。
ConsecutiveNums |
---|
1 |
答案
這道題給了我們一個Logs表,讓我們找Num列中連續出現相同數字三次的數字,那么由于需要找三次相同數字,所以我們需要建立三個表的實例,我們可以用l1分別和l2, l3內交,l1和l2的Id下一個位置比,l1和l3的下兩個位置比,然后將Num都相同的數字返回即可:
解法一:
select distinct l1.Num as ConsecutiveNums
from Logs l1 join Logs l2 on l1.Id = l2.Id - 1 join Logs l3 on l1.Id = l3.Id - 2
where l1.Num = l2.Num and l2.Num = l3.Num;
我們在本地已經新建了表Logs.
4.第N高的薪水(函數)
信息
編寫一個 SQL 查詢,獲取 Employee 表中第 n 高的薪水(Salary)。
Id | Salary |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
要求
例如上述 Employee 表,n = 2 時,應返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查詢應返回 null。
getNthHighestSalary(2) |
---|
200 |
答案
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGINSET N = N - 1;RETURN (select distinct Salary from Employee group by Salaryorder by Salary desc limit 1 offset N);
END
5.各個部門工資最高的員工(分組,連接)
信息
Employee 表包含所有員工信息,每個員工有其對應的 Id, salary 和 department Id。
Id | Name | Salary | DepartmentId |
---|---|---|---|
1 | Joe | 70000 | 1 |
2 | Henry | 80000 | 2 |
3 | Sam | 60000 | 2 |
4 | Max | 90000 | 1 |
Department 表包含公司所有部門的信息。
Id | Name |
---|---|
1 | IT |
2 | Sales |
要求
編寫一個 SQL 查詢,找出每個部門工資最高的員工。例如,根據上述給定的表格,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資。
Department | Employee | Salary |
---|---|---|
IT | Max | 90000 |
Sales | Henry | 80000 |
答案
select Department.Name as Department, Employee.Name as Employee,Salary
from Employee join Department on Employee.DepartmentId = Department.Id
where (Employee.salary, Employee.departmentId) in (select max(salary),departmentIdfrom employeegroup by departmentId );
6.統計各專業人數
7.查詢回答率最高的問題
8.至少有5名直接下屬的經理
SELECTName
FROMEmployee AS t1 JOIN(SELECTManagerIdFROMEmployeeGROUP BY ManagerIdHAVING COUNT(ManagerId) >= 5) AS t2ON t1.Id = t2.ManagerId);