面试常见问题——数据库(二)

面试常见问题——数据库(二)

目录:

  1. 应用实例
    1. 交换工资【LeetCode】
    2. 部门工资前三高的所有员工【LeetCode】
    3. 体育馆的人流量【LeetCode】
    4. 行程和用户【LeetCode】
    5. 换座位【LeetCode】
    6. 连续出现的数字【LeetCode】
    7. 部门工资最高的员工【LeetCode】
    8. 删除重复的电子邮箱【LeetCode】
    9. 超过五名学生的课【LeetCode】
    10. 上升的温度【LeetCode】
    11. 重新格式化部门表【LeetCode】
    12. 有趣的电影【LeetCode】
    13. 从不订购的客户【LeetCode】
    14. 大的国家【LeetCode】
    15. 超过经理收入的员工【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】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值