当前位置: 首页 > news >正文

MySQL实战(尚硅谷)

 要求

代码

# 准备数据
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 e
	LEFT JOIN salaries s ON e.employee_id =s.employee_id
	LEFT JOIN departments d ON e.department_id = d.department_id
	GROUP BY d.department_name;
	
	
#2、列出每个部门的经理姓名以及他们管理的员工数目。
#2.1 查询每个部门以及部门对应的经理的名称	

SELECT * FROM departments d
	LEFT JOIN managers m ON  d.department_id = m.department_id
	LEFT 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_id
                    LEFT JOIN employees e1 ON e1.employee_id = m.manager_id
                    LEFT JOIN employees e2 ON e2.department_id = d.department_id
                    GROUP 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_id
         GROUP 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_id
                          ORDER 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_id
         WHERE 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) num
         FROM employees  e 
         LEFT JOIN salaries s ON e.employee_id = s.employee_id )  temp WHERE temp.num = 1 ;
        

                    
DROP DATABASE IF EXISTS company;

相关文章:

  • 【蓝桥杯】每日练习 Day12 贡献法
  • vulhub靶场jangow-01-1.0.1
  • 数据结构之循环队列的顺序结构基本操作-基本结构-初始化-入队-出队-判断队列是否为空-获取队头元素
  • 当AI重构编程范式:Java 24的进化逻辑与技术深水区的战略突围
  • 【ESP32S3】esp32获取串口数据并通过http上传到前端
  • 造成服务器网络连接不稳定的原因是什么?
  • 【Python】pillow库学习笔记2-ImageFilter类和ImageEnhance类
  • PHP If...Else 语句详解
  • 用户模块——自定义业务异常
  • 【react】实现路由返回拦截的多种方式
  • Three学习入门(四)
  • DeepSeek助力文案,智能音箱如何改变你的生活?
  • 【企业网络安全防护】一体化管控平台:企业办公效率与安全兼得!
  • 计算机专业本科毕业设计一般有哪些选题?
  • 突破反爬困境:SDK架构设计,为什么选择独立服务模式(四)
  • Web前端之JavaScript的DOM操作冷门API
  • 一个简单的用C#实现的分布式雪花ID算法
  • OpenCV图像拼接(6)根据权重图对源图像进行归一化处理函数normalizeUsingWeightMap()
  • 鸿蒙第三方解析(一)
  • 3. 轴指令(omron 机器自动化控制器)——>MC_GearIn
  • 做网站如何写代码/seo网站推广如何做
  • 临朐网站开发/百度广告商
  • i岗网站建设/创建网站要钱吗
  • 怎么用云服务器建设网站/营销方案的几个要素
  • 教育企业重庆网站建设/google关键词分析工具
  • 网站里的搜索怎么做/广州网络推广外包平台