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

MySQL数据库复杂的增删改查操作

在前面的文章中,我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子,进行讲解一些较为复杂且现时需求的例子。

基础知识:

一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博客

该公司的数据库设计如下:


一、创建公司数据库表格

创建employee表格 

create table employee(emp_id int primary key,`name` varchar(20),birth_date date,sex varchar(20),salary int,branch_id int,sup_id int
);

在这里并没有将branch_id和sup_id设计为外键,是应为其branch和employee表格还没有创建,所以之后会再返回来设计。

创建branch表格

create table branch(branch_id int primary key,branch_name varchar(20),manager_id int,foreign key (manager_id) references employee(emp_id) on delete set null
);

这里设置manager_id为外键,references关联上employee表格的emp_id属性,这里先不用知道为什么加上 on delete set null,之后会详细的说。

现在补上branch_id和sup_id为外键,因为现在branch和employee表格已经创建好了。

branch_id:

alter table employee 
add foreign key (branch_id) 
references branch(branch_id) 
on delete set null;

sup_id:

alter table employee 
add foreign key (sup_id) 
references employee(emp_id) 
on delete set null;

创建clint表格

create table `client`(client_id int primary key,client_name varchar(20),phone varchar(20)
);

创建works_with表格

create table `works_with`(emp_id int,client_id int,total_sales int,primary key(emp_id, client_id),foreign key (emp_id) references employee(emp_id) on delete cascade,foreign key (client_id) references `client`(client_id) on delete cascade
);

同样的这里先不用知道为什么加上 on delete cascade,之后会详细的说。


二、添加数据

branch数据:

添加数据的时候不能直接添加employee数据,因为在employee表格中外键还没添加数据,所以换种方式,就先添加branch表格数据,但是又由于branch表格中也有外键manager_id,所以再添加 的时候先设置为null,之后再加。

insert into branch values(1, '研发', null);
insert into branch values(2, '行政', null);
insert into branch values(3, '资讯', null);
select * from branch;

employee数据: 

insert into employee 
values(206, '小黄', '1998-10-08', 'F', 50000, 1, null);
insert into employee 
values(207, '小绿', '1985-09-16', 'M', 29000, 2, 206);
insert into employee 
values(208, '小黑', '2000-12-19', 'M', 35000, 3, 206);
insert into employee 
values(209, '小白', '1997-01-22', 'F', 39000, 3, 207);
insert into employee 
values(210, '小乐', '1925-11-10', 'F', 84000, 1, 207);
select * from employee;

现在再为branch表格添加上manager_id(branch表的外键)的值

update branch
set manager_id = 206
where branch_id = 1;update branch
set manager_id = 207
where branch_id = 2;update branch
set manager_id = 208
where branch_id = 3;

client数据:

insert into `client` values(400, '阿狗', '254354335');
insert into `client` values(401, '阿猫', '25633899');
insert into `client` values(402, '旺来', '45354345');
insert into `client` values(403, '路西', '54354365');
insert into `client` values(404, '艾瑞克', '18783783');
select * from `client`;

works_with数据:

insert into `works_with` values(206, 400, '70000');
insert into `works_with` values(207, 401, '24000');
insert into `works_with` values(208, 402, '9800');
insert into `works_with` values(208, 403, '24000');
insert into `works_with` values(210, 404, '87940');
select * from `works_with`;


三、相应的简单操作

-- 1.取得所有员工的数据

select * from employee;

-- 2.取得所有客戶数据

select * from client;

-- 3.按薪水低到高取得员工数据

select * from employee 
order by salary


-- 4.取得薪水前3高的员工

select * from employee 
order by salary desc
limit 3;


-- 5.取得所有员工的名子

select `name` from employee;

假设这里想要取得有哪些性别,或者说有哪些名字得话,也就是不想让取出得数据重复得话,我们可以在要取得得属性前面加上distinct


四、聚合函数(aggregate functions)

聚合函数可以让我们更加方便得知道数据库得一些数据,举例如下。

--1.取得员工人数

select count(*) from employee;

--2.取得所有出生于1970-01-01 之后的女性员工人数

select count(*) from employee
where birth_date > '1970-01-01' and sex = 'F';

--3.取得所有员工的平均薪水

select avg(salary) from employee;

--4.取得所有员工薪水的总和

select sum(salary) from employee;

--5.取得薪水最高的员工

select max(salary) from employee;


--6.取得薪水最低的员工

select min(salary) from employee;


五、万用字元

% 表示多个字元,_ 表示代表一个字元。

--1.取得电话号码尾数是335的客戶

select * from `client` 
where phone like '%335';


--2.取得姓艾的客戶

select * from `client` 
where client_name like '艾%';


--3.取得生日在12月的员工

select * from `employee` 
where birth_date like '_____12%';


六、Union 

通过union操作,就可以将搜寻结果结合在一起。

-- 1.员工名字 union 客户名字

select `name` 
from employee
union 
select `client_name`
from `client`;

在使用union得时候,其属性得数量是要求一致的,不能属性数量不一致,否则就会导致出错。

-- 2.员工id +员工名子 union 客户id + 客户名字

select `emp_id`, `name` 
from employee
union 
select `client_id`, `client_name`
from `client`;

可以看见这样返回的结果其实是以第一个用了第一个选择的属性的,如果想改变其和并后的属性名字的话,使用以下代码就可以:

select `emp_id` as `total_id`, `name`as `total_name`
from employee
union 
select `client_id`, `client_name`
from `client`;

-- 3.员工薪水 union 销售金额

select `salary` 
from employee
union 
select `total_sales`
from `works_with`;


七、join 连接

可以帮助我们将两个表格连接在一起

-- 取得所有部门经理的名字

要想取得部门经理的名字,那我们就得先去找部门(branch)的表格,而branch表格中之后中只有manmager_id,并没有manager的名字,所以要通过manager_id找到对应的名字。

select *
from employee
join branch on manager_id = emp_id;

为什么只显示了三条数据,是因为再进行连接的时候是通过manager_id = emp_id进行连接的,所以只有206、207、208匹配上了。

现在不想显示那么多的数据,就可以通过以下代码来实现:
 

select emp_id, `name`, branch_name
from employee
join branch on manager_id = emp_id;

若在连接的时候,两个表格中的属性,有重复,比如假设branch表中的manager_id属性叫id,而employee表中emp_id也叫id的话,那再连接的时候应该改成`employee`.`emp_id` = `branch`.`brach_id`,这样指定好属性来自于哪个表格。


八、subquery 子查询

是表示在一个查询语句中可以使用另外一个查询语句。

-- 1.找出研发部门的经理名字

select `name` 
from employee
where emp_id = (select manager_idfrom branchwhere branch_name = '研发'
);

select manager_idfrom branchwhere branch_name = '研发'

首选通过子查询,查询到了研发部门的manager_id,然后再通过这个子查询的结果去查询该id在employee中对应的名称。
-- 2.找出对单一位客戶销售金额超过50000的员工名字

select `name` 
from employee
where emp_id in (select emp_id from works_withwhere total_sales > 50000
);

九、解释on delete set null 和on delete cascade

on delete set null:当时在设置branch表格的时候,其中的外键manager_id是referneces到了employee表格的emp_id的,那假设employee中的id为206的员工离职了,那branch表格中的manager_id该怎么办呢?所以加上on delete set null表示在外键manager_id所referneces的employee表格中的emp_id被删除后,自动将manager_id设置为null。

测试:

delete from employee
where emp_id = 207;
select * from employee;

当207被删除后,其外键sup_id中是207的都被设置为了空(即209和210)同时branch表中的外键manager_id也被设置为了空。

on delete cascade:当时在设置works_with表格的时候,其中的外键emp_id是referneces到了employee表格的emp_id的,那假设employee中的id为206的员工离职了,那works_with表格中的emp_id该怎么办呢?这里加上on delete cascade表示在外键emp_id所referneces的employee表格中的emp_id被删除后,自动将works_with这行删除。注意:这里不能设置为on delete set null,因为works_with表格中的emp_id同时是主键和外键,主键不能为空,所以只能是被删除该记录而不能被设置为空null。

测试:

delete from employee
where emp_id = 207;
select * from works_with;

207那条记录被删除了!到这里为止。数据库的复习就到此结束了!

2025/3/9

慢慢来,21岁不过是一天当中的6点18分,是充满希望的早晨!

相关文章:

MySQL数据库复杂的增删改查操作

在前面的文章中,我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子,进行讲解一些较为复杂且现时需求的例子。 基础知识: 一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博…...

点云软件VeloView开发环境搭建与编译

官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…...

本地YARN集群部署

请先完成HDFS的前置部署,部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…...

STM32常见外设的驱动示例和代码解析

以下是针对STM32常见外设的驱动示例和代码解析,基于HAL库实现,适用于大多数STM32系列(如F1/F4/H7等),可根据具体型号调整引脚和时钟配置。 1. GPIO驱动 应用场景:控制LED、按键检测、继电器开关等。 示例代码: // 初始化LED(推挽输出) void LED_Init(void) {GPIO_In…...

使用数据库和缓存的时候,是如何解决数据不一致的问题的?

1.缓存更新策略 1.1. 缓存旁路模式(Cache Aside) 在应用里负责管理缓存,读取时先查缓存,如果命中了则返回缓存,如果未命中就查询数据库,然后返回缓存,返回缓存的同时把数据给写入缓存中。更新…...

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…...

使用OpenCV和MediaPipe库——实现人体姿态检测

目录 准备工作如何在Windows系统中安装OpenCV和MediaPipe库? 安装Python 安装OpenCV 安装MediaPipe 验证安装 代码逻辑 整体代码 效果展示 准备工作如何在Windows系统中安装OpenCV和MediaPipe库? 安装Python 可以通过命令行运行python --versio…...

JWT的学习

1、HTTP无状态及解决方案 HTTP一种是无状态的协议,每次请求都是一次独立的请求,一次交互之后就是陌生人。 以CSDN为例,先登录一次,然后浏览器退出,这个时候在进入CSDN,按理说服务器是不知道你已经登陆了&…...

elasticsearch是哪家的

Elasticsearch:数据搜索与分析的领航者 在当今这个信息爆炸的时代,快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…...

《A++ 敏捷开发》- 18 软件需求

需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品,以前都是扫二维码开箱,有些图书馆升级了使用指纹识别。 “是否新方法比以前好?”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…...

计算机网络:计算机网络的组成和功能

计算机网络的组成: 计算机网络的工作方式: 计算机网络的逻辑功能; 总结: 计算机网络的功能: 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点(计算机或设备&…...

Upload-Labs-Linux 1-20

前端校验绕过&#xff1a;pass 01 两种思路&#xff1a;1.通过抓包&#xff0c;修改后缀 2.前端禁用js绕过前端后缀检验 首先写一个木马&#xff0c;改为图片格式GIF89a<?php eval($_POST[cmd])?>抓包之后改为PHP格式&#xff1a; 使用蚁剑连接木马&#xff0c;第一次尝…...

Compose笔记(八)--权限

这一节主要了解一下Compose中权限的申请&#xff0c;其中主要用到accompanist-permissions这个权限库&#xff0c;它是一个简化的Android Compose 中权限管理的库&#xff0c;如下使用&#xff1a; 栗子: 依赖添加 dependencies {implementation("com.google.accompani…...

单例模式:确保一个类只有一个实例

目录 引言 1. 单例模式的核心思想 2. 单例模式的实现方式 2.1 饿汉式单例 2.2 懒汉式单例 2.3 线程安全的懒汉式单例 2.4 双重检查锁定&#xff08;Double-Checked Locking&#xff09; 2.5 静态内部类实现单例 2.6 枚举实现单例 3. 单例模式的使用场景 4. 单例模式…...

推荐一个好用的在线文本对比网站 - diffchecker

推荐网址&#xff1a;https://www.diffchecker.com UI设计也很不错&#xff0c;响应也很快&#xff0c;广告少 生成的对比还可以生成在线链接&#xff1a;&#xff08;点击右上角“分享”&#xff09; 可设置过期时间等 我生成的示例&#xff1a;https://www.diffchecker.c…...

学习第八十五行

[capture](parameters) -> return_type {// function body }capture: 捕获列表&#xff0c;指定如何捕获周围作用域中的变量。parameters: 参数列表&#xff0c;与普通函数类似。return_type: 返回类型&#xff0c;可以省略&#xff0c;编译器会自动推断。function body: 函…...

基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程

一、Django项目初始化 1.创建Django项目 Django-admin startproject 项目名 2.安装 djangorestframework pip install djangorestframework 解释: Django REST Framework (DRF) 是基于 Django 框架的一个强大的 Web API 框架&#xff0c;提供了多种工具和库来构建 RESTf…...

【Python 2D绘图】Matplotlib绘图(统计图表)

【Python 2D绘图】Matplotlib绘图&#xff08;统计图表&#xff09; 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图…...

vue3框架的响应式依赖追踪机制

当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示&#xff0c;但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图&#xff0c;这是为什么&#xff1f;我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新&#xff0c;单当视图中不存在…...

.Net 6 上传文件接口 文件大小报错整体配置

/// <summary>/// 上传文件/// </summary>/// <param name"file"></param>/// <returns></returns>[HttpPost("UploadifyFile")][RequestSizeLimit(2000 * 1024 * 1024)] // 设置最大请求体大小为 100MBpublic async …...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...