MYSQL复杂查询练习题以及答案大全(难度适中)
MYSQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的功能和灵活的查询语言,使得我们可以轻松地进行复杂的数据操作,在实际应用中,我们经常会遇到一些复杂的查询需求,需要使用到MYSQL的各种高级特性和技巧,本文将为大家提供一些难度适中的MYSQL复杂查询练习题,并给出详细的解答。
子查询
1、查询所有员工的姓名和工资,要求工资高于公司平均工资的员工。
解析:首先需要计算公司的平均工资,然后使用子查询筛选出工资高于平均工资的员工。
SELECT e.name, e.salary FROM employee e WHERE e.salary > (SELECT AVG(salary) FROM employee);
2、查询每个部门的工资总和,要求只显示工资总和大于10000的部门。
解析:使用子查询计算每个部门的工资总和,然后筛选出工资总和大于10000的部门。
SELECT d.department_id, d.department_name, SUM(e.salary) as total_salary FROM employee e JOIN department d ON e.department_id = d.department_id GROUP BY d.department_id, d.department_name HAVING total_salary > 10000;
连接查询
1、查询每个部门的员工姓名和工资,要求显示员工的姓名和工资,以及对应的部门名称。
解析:使用INNER JOIN连接employee表和department表,筛选出每个部门的员工信息。
SELECT e.name, e.salary, d.department_name FROM employee e INNER JOIN department d ON e.department_id = d.department_id;
2、查询每个部门的员工数量和平均工资,要求显示部门名称、员工数量和平均工资。
解析:使用LEFT JOIN连接employee表和department表,筛选出每个部门的员工信息,然后使用GROUP BY分组统计员工数量和平均工资。
SELECT d.department_name, COUNT(e.employee_id) as employee_count, AVG(e.salary) as average_salary FROM employee e LEFT JOIN department d ON e.department_id = d.department_id GROUP BY d.department_name;
聚合函数与GROUP BY子句
1、查询每个部门的员工数量和平均工资,要求显示部门名称、员工数量和平均工资。
解析:使用GROUP BY分组统计每个部门的员工数量和平均工资。
SELECT d.department_name, COUNT(e.employee_id) as employee_count, AVG(e.salary) as average_salary FROM employee e JOIN department d ON e.department_id = d.department_id GROUP BY d.department_name;
2、查询每个部门的工资总和,要求只显示工资总和大于10000的部门。
解析:使用GROUP BY分组统计每个部门的工资总和,然后筛选出工资总和大于10000的部门。
SELECT d.department_id, d.department_name, SUM(e.salary) as total_salary FROM employee e JOIN department d ON e.department_id = d.department_id GROUP BY d.department_id, d.department_name HAVING total_salary > 10000;
窗口函数与排序子句
1、查询每个部门的员工姓名和工资,要求按照工资降序排列,同时显示员工的排名。
解析:使用RANK()窗口函数为每个员工分配排名,然后按照工资降序排列。
SELECT e.name, e.salary, RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rank FROM employee e;
2、查询每个部门的工资最高值、最低值和平均值,要求只显示工资最高值大于平均值的部门。
解析:使用MAX()、MIN()和AVG()窗口函数分别计算每个部门的工资最高值、最低值和平均值,然后筛选出工资最高值大于平均值的部门。
SELECT d.department_id, d.department_name, MAX(e.salary) as max_salary, MIN(e.salary) as min_salary, AVG(e.salary) as average_salary, CASE WHEN MAX(e.salary) > AVG(e.salary) THEN 'Yes' ELSE 'No' END as above_average FROM employee e JOIN department d ON e.department_id = d.department_id GROUP BY d.department_id, d.department_name;
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/345699.html