MySQL实战(尚硅谷)

news/2025/4/1 4:30:00/

 要求

代码

# 准备数据
CREATE DATABASE IF NOT EXISTS company;USE company;CREATE TABLE IF NOT EXISTS employees(employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name  VARCHAR(50),department_id INT
);DESC employees;CREATE TABLE IF NOT EXISTS departments(department_id INT PRIMARY KEY,department_name VARCHAR(50)
);DESC  departments;CREATE TABLE IF NOT EXISTS salaries (employee_id INT PRIMARY KEY,salary DECIMAL(10, 2)
);DESC  salaries;CREATE TABLE IF NOT EXISTS managers (manager_id INT PRIMARY KEY,department_id INT
);DESC  managers;-- 插入员工信息
INSERT INTO employees (employee_id, first_name, last_name, department_id)
VALUES(1, 'John', 'Doe', 1),(2, 'Jane', 'Smith', 2),(3, 'Michael', 'Johnson', 1),(4, '图图', 'Brown', NULL),(5, 'David', 'Williams', 3),(6, 'Sarah', 'Jones', 1);-- 插入部门信息
INSERT INTO departments (department_id, department_name)
VALUES(1, 'HR'),(2, 'Finance'),(3, 'IT');-- 插入员工薪资信息
INSERT INTO salaries (employee_id, salary)
VALUES(1, 50000),(2, 60000),(3, 55000),(4, 48000),(5, 70000),(6, 52000);-- 插入经理信息
INSERT INTO managers (manager_id, department_id)
VALUES(1, 1),(2, 2),(3, 3);SHOW TABLES;# 实现
#1、找出每个部门的平均工资。 部门的信息 , 平均工资
#  员工表 和 薪资表
#  查询语法: 连表查询 -> 员工表 | 分组查询 -> 分组字段 和 聚合函数
SELECT d.department_name,AVG(s.salary) AS ssav FROM employees eLEFT JOIN salaries s ON e.employee_id =s.employee_idLEFT JOIN departments d ON e.department_id = d.department_idGROUP BY d.department_name;#2、列出每个部门的经理姓名以及他们管理的员工数目。
#2.1 查询每个部门以及部门对应的经理的名称	SELECT * FROM departments dLEFT JOIN managers m ON  d.department_id = m.department_idLEFT JOIN employees e01 ON e01.department_id =m.department_id;#2.2 查询每个员工以及员工对应的部门以及部门的名称
SELECT d.department_name, CONCAT(e1.first_name,e1.last_name) AS manager_name , COUNT(1) ct FROM departments d LEFT JOIN managers m ON d.department_id = m.department_idLEFT JOIN employees e1 ON e1.employee_id = m.manager_idLEFT JOIN employees e2 ON e2.department_id = d.department_idGROUP BY manager_name,d.department_name ;#3、列出没有分配到部门的员工。
SELECT * FROM employees WHERE department_id IS NULL;	#4、列出每个部门的员工数目以及该部门的总工资。SELECT e.department_id,AVG(s.salary) , COUNT(1) FROM employees  e LEFT JOIN salaries s ON e.employee_id = s.employee_idGROUP BY e.department_id;#5、列出每个员工的名字以及他们的薪资等级(低于平均工资的员工为低级别,高于平均工资的员工为高级别)。# id , 姓名 , 薪水等级 -> 比较 平均薪水 [流程语句 case when | 聚合函数单独使用,窗口函数]    
SELECT e.employee_id,CONCAT(e.first_name,e.last_name) , s.salary ,CASE WHEN s.salary < AVG(salary) OVER () THEN '低级别'ELSE '高级别'END AS salary_level   FROM employees e LEFT JOIN salaries s ON e.employee_id = s.employee_id;    #6、找出薪资排名前10的员工。
SELECT * FROM employees e LEFT JOIN salaries s ON e.employee_id = s.employee_idORDER BY s.salary DESC LIMIT 1,1;#7、找出至少有2名员工的部门。
# 至少有2名员工的部门  > 2 分组后的条件
# where 分组前的条件
# on 主 = 外
# having -> group by 分组后的条件    
SELECT department_id , COUNT(1) num FROM employees e GROUP BY department_id HAVING num > 2;#8、找出每个部门的平均工资,但排除经理的薪资。
SELECT e.department_id,AVG(s.salary) FROM employees  e LEFT JOIN salaries s ON e.employee_id = s.employee_idWHERE e.employee_id NOT IN (SELECT manager_id FROM  managers)GROUP BY e.department_id#9、列出每个部门的员工姓名、薪资,以及该部门内工资排名。
# rank() 多行函数->窗口函数使用
SELECT  e.first_name,s.salary,e.department_id , RANK() OVER(PARTITION BY e.department_id ORDER BY s.salary DESC)FROM employees  e LEFT JOIN salaries s ON e.employee_id = s.employee_id#10、找出每个部门薪资最低的员工。# from where select SELECT * FROM (SELECT  e.first_name,s.salary,e.department_id , RANK() OVER(PARTITION BY e.department_id ORDER BY s.salary ASC) numFROM employees  e LEFT JOIN salaries s ON e.employee_id = s.employee_id )  temp WHERE temp.num = 1 ;DROP DATABASE IF EXISTS company;


http://www.ppmy.cn/news/1583202.html

相关文章

C++ 使用栈实现中序遍历二叉树

#include <stack> #include "iostream" using namespace std; // 假设二叉树节点定义如下 struct TreeNode { int value; TreeNode* left; TreeNode* right; TreeNode(int val) : value(val), left(nullptr), right(nullptr) {} }; typedef Tree…

thinkphp8.0\swoole的websocket应用

环境&#xff1a;centOS7.9、php8.3、thinkphp8.0\think-swoole4.1 我用的官方think-swoole插件 第一步&#xff1a;根据官方文档&#xff0c;需要安装此扩展插件 composer require topthink/think-swoole 第二步&#xff1a;在根目录下config文件夹下编辑swoole.php配置文…

适合各个层次的 7 个计算机视觉项目【1】:植物病害检测

植物病害检测 植物病害检测是计算机视觉在农业领域的一个重要应用。您将学习如何加载、处理和扩充数据集&#xff0c;构建深度神经网络模型&#xff0c;并在数据集上训练模型。该项目有助于理解图像分类&#xff0c;并通过实现早期病害检测为可持续农业做出贡献。 import os…

清晰易懂的 C++ 开发环境搭建教程

一、安装 C 编译器&#xff08;三大平台全覆盖&#xff09; 1. Windows 系统 方案一&#xff1a;MinGW-w64&#xff08;轻量推荐&#xff09; 下载 MinGW-w64&#xff1a; 访问 MinGW-w64 官网 → 下载 mingw-w64-install.exe。 安装配置&#xff1a; 架构选择&#xff1a;x…

form 表单内容序列化成一个字符串

html <form id"form1" action"http://localhost:8080/xxx" method"post"> <p >关键字1&#xff1a; <input type "text" name"keyword1" /></p> <p >关键字2&#xff1a; <input t…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

扩展卡尔曼滤波

1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统&#xff0c;扩展卡尔曼滤波 则扩展到了非线性系统&#xff0c;核心原理就是将非线性系统线性化&#xff0c;主要用的的知识点是 泰勒展开&#xff08;我另外一篇文章的链接&#xff09;&#xff0c;如下是泰勒展开的公式…

Android adb自身调试log开关

本文介绍下如何打开adb源码中的debug log 1.adb源码log是可以动态打开和关闭的&#xff0c;控制逻辑代码如下 static NoDestructor<std::mutex> log_mutex; static NoDestructor<CachedProperty> log_property GUARDED_BY(log_mutex)("debug.adbd.logging&q…