面试常见问题——数据库(二)
目录:
- 应用实例
- 交换工资【LeetCode】
- 部门工资前三高的所有员工【LeetCode】
- 体育馆的人流量【LeetCode】
- 行程和用户【LeetCode】
- 换座位【LeetCode】
- 连续出现的数字【LeetCode】
- 部门工资最高的员工【LeetCode】
- 删除重复的电子邮箱【LeetCode】
- 超过五名学生的课【LeetCode】
- 上升的温度【LeetCode】
- 重新格式化部门表【LeetCode】
- 有趣的电影【LeetCode】
- 从不订购的客户【LeetCode】
- 大的国家【LeetCode】
- 超过经理收入的员工【LeetCode】
一、应用实例:
1、题目描述:给定一个salary表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。【LeetCode】
例如:
运行你所编写的更新语句之后,将会得到以下表:
UPDATE salary
SET sex = (
CASE sex WHEN 'm' THEN 'f'
WHEN 'f' THEN 'm'
END
)
2、题目描述:部门工资前三高的所有员工。【LeetCode】
Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId 。
Department 表包含公司所有部门的信息。
编写一个SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回:
解释:IT 部门中,Max 获得了最高的工资,Randy 和 Joe 都拿到了第二高的工资,Will 的工资排第三。销售部门(Sales)只有两名员工,Henry 的工资最高,Sam 的工资排第二。
CREATE TABLE Department(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR(50) NOT NULL
);
CREATE TABLE Employee(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR(50) not null,
Salary DECIMAL(6,1) not null,
DepartmentId INT,
FOREIGN KEY(DepartmentId) REFERENCES Department(Id)
);
INSERT INTO Department(Name)
VALUES('IT'),('Sales');
INSERT INTO Employee(Name, Salary, DepartmentId)
VALUES('Joe', 85000, 1),
('Henry', 80000, 2),
('Sam', 60000, 2),
('Max', 90000, 1),
('Janet', 69000, 1),
('Randy', 85000, 1),
('Will', 70000, 1);
SELECT b.Name AS Department, a.Name AS Employee, Salary
FROM Employee AS a
INNER JOIN Department AS b
ON b.Id = a.DepartmentId
WHERE a.Id in(
SELECT e1.Id
FROM Employee e1
left join Employee e2
ON e1.DepartmentId = e2.DepartmentId
AND e1.Salary < e2.Salary
GROUP BY(e1.Id)
HAVING COUNT(distinct e2.Salary) <= 2
)
ORDER BY b.Id ASC, Salary DESC;
3、题目描述:体育馆的人流量。X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、人流量 (people)。请编写一个查询语句,找出人流量的高峰期。高峰期时,至少连续三行记录中的人流量不少于100。【LeetCode】