面试中最常问的复杂SQL查询

一、示例数据表

1.1 假设我们有一张示例数据表“employees”,包含以下列:
  • id:每个员工的唯一标识符

  • name:员工姓名

  • gender:员工性别

  • salary:员工工资

  • department:员工所在部门

1.2 下面是创建employees表并插入样本数据的MySQL脚本:

CREATE TABLE employees
(
    id         INT AUTO_INCREMENT PRIMARY KEY,
    name       VARCHAR(50) NOT NULL,
    gender     VARCHAR(10) NOT NULL,
    salary     INT         NOT NULL,
    department VARCHAR(50) NOT NULL
);

INSERT INTO employees (name, gender, salary, department)
VALUES ('Ramesh Gupta', 'Male', 55000, 'Sales'),
       ('Priya Sharma', 'Female', 65000, 'Marketing'),
       ('Sanjay Singh', 'Male', 75000, 'Sales'),
       ('Anjali Verma', 'Female', 45000, 'Finance'),
       ('Rajesh Sharma', 'Male', 80000, 'Marketing'),
       ('Smita Patel', 'Female', 60000, 'HR'),
       ('Vikram Yadav', 'Male', 90000, 'Sales'),
       ('Neha Sharma', 'Female', 55000, 'Marketing'),
       ('Rahul Singh', 'Male', 70000, 'Finance'),
       ('Sonali Gupta', 'Female', 50000, 'Sales');

二、查询

2.1 查询每个部门中男女职工的平均薪水

实现方案

SELECT department, gender, AVG(salary) AS avg_salary
FROM employees
GROUP BY department, gender;
2.3 查询每个部门中比所在部门平均薪水高的员工信息

实现方案

SELECT name, salary, department
FROM employees
WHERE salary > (SELECT AVG(salary)
                FROM employees AS e2
                WHERE e2.department = employees.department);
2.4 查询每个部门中薪水前三名的员工信息

实现方案


SELECT e.department, e.name, e.salary
FROM employees e
WHERE (SELECT COUNT(*)
       FROM employees
       WHERE department = e.department
         AND salary > e.salary) < 3;
2.5 查询每个部门中比所在部门平均薪水高的员工姓名(该问题与第三个问题一样,只不过这里使用连接实现)

实现方案


SELECT e.name
FROM employees e
         JOIN (SELECT department, AVG(salary) AS avg_salary
               FROM employees
               GROUP BY department) AS dept_avg
              ON e.department = dept_avg.department
WHERE e.salary > dept_avg.avg_salary;
2.6 查询每个部门中最高薪水的员工信息

实现方案


WITH max_salary AS (SELECT department, MAX(salary) AS highest_salary
                    FROM employees
                    GROUP BY department)
SELECT m.department, e.name, e.salary
FROM employees e
         JOIN max_salary m
              ON e.department = m.department AND e.salary = m.highest_salary;

注明:该实现需要MySQL 8.0及以上版本才可运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

个人开发-胡涂涂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值