首页 > 数据库 > 数据库开发技术 > 数据工程师面试中最常问的复杂SQL查询

id:每个员工的唯一标识符
name:员工姓名
gender:员工性别
salary:员工工资
department:员工所在部门
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');
Employees 表

实现方案:
SELECT department, gender, AVG(salary) AS avg_salaryFROM employeesGROUP BY department, gender;
输出:

实现方案:
SELECT name, salaryFROM employeesWHERE (department, salary) IN (SELECT department, MAX(salary)FROM employeesGROUP BY department);
输出:

实现方案:
SELECT name, salary, departmentFROM employeesWHERE salary > (SELECT AVG(salary)FROM employees AS e2WHERE e2.department = employees.department);
输出:

实现方案:
SELECT e.department, e.name, e.salaryFROM employees eWHERE (SELECT COUNT(*)FROM employeesWHERE department = e.departmentAND salary > e.salary) < 3;
输出:

实现方案:
SELECT e.nameFROM employees eJOIN (SELECT department, AVG(salary) AS avg_salaryFROM employeesGROUP BY department) AS dept_avgON e.department = dept_avg.departmentWHERE e.salary > dept_avg.avg_salary;
输出:

实现方案:
WITH max_salary AS (SELECT department, MAX(salary) AS highest_salaryFROM employeesGROUP BY department)SELECT m.department, e.name, e.salaryFROM employees eJOIN max_salary mON e.department = m.department AND e.salary = m.highest_salary;
输出:

该实现需要MySQL 8.0及以上版本才可运行,因为WITH...AS...子句只有8.0及以上版本才支持。
原文作者:数据派探险家;如有侵权,请联系管理员删除。