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

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

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

推荐一个好用的在线文本对比网站 - diffchecker
推荐网址:https://www.diffchecker.com UI设计也很不错,响应也很快,广告少 生成的对比还可以生成在线链接:(点击右上角“分享”) 可设置过期时间等 我生成的示例:https://www.diffchecker.c…...

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

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

【Python 2D绘图】Matplotlib绘图(统计图表)
【Python 2D绘图】Matplotlib绘图(统计图表) 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框架的响应式依赖追踪机制
当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示,但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图,这是为什么?我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新,单当视图中不存在…...

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

Git基础之工作原理
基础概念 git本地有三个工作区域,工作目录 Working Directory,暂存区Stage/Index和资源区Repository/Git Directory,如果在加上远程的git仓库就是四个工作区域 四个区域与文件交换的命令之间的关系 WorkSpace:工作区,就…...

小程序 wxml 语法 —— 41列表渲染 - 进阶用法
这一节讲解列表渲染的两个进阶用法: 如果需要对默认的变量名和下标进行修改,可以使用 wx:for-item 和 wx:for-item: 使用 wx:for-item 可以指定数组当前元素的变量名使用 wx:for-index 可以指定数组当前下标的变量名 将 wx:for 用在 标签上&…...

ElasticSearch 入门教程
ElasticSearch 入门教程 ElasticSearch 是一个分布式、可扩展的搜索和分析引擎,基于 Apache Lucene 构建,支持全文检索、结构化查询和聚合分析。本教程将带你深入了解 ElasticSearch 的核心概念、安装配置、常见操作,并提供示例代码…...

用Python写一个算24点的小程序
一、运行界面 二、显示答案——递归介绍 工作流程: 1. 基本情况:函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字,它会判断这个数字是否接近 24(使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…...

分布式网络
分布式网络(Distributed Network)指的是一种计算机网络架构,其中计算资源(计算、存储、数据处理等)分布在多个物理或逻辑上的节点上,而不是集中在单一的服务器或数据中心中。这种架构的主要目标是提高系统的…...

忘记dedecms后台超级管理员账号和密码的解决方案
解决方案: 方案一、数据库修改: 1、前提是您能登录到数据库后台,登录MySQL数据库管理工具(如phpMyAdmin) 2、打开数据库中的 dede_admin 表,找到管理员记录,将 pwd 字段的值改成 f297a57a5a7…...

【Linux学习笔记】Linux基本指令分析和权限的概念
【Linux学习笔记】Linux基本指令分析和权限的概念 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…...

Git基础之分支
常用指令 git branch 列出本地所有分支 git branch -r 列出所有远程分支 git branch [branch-name] 新建一个分支,但依然停留在当前分支 git checkout -b [branch] 新建一个分支,并切换到该分支 git merge [branch] 合并指定分支当前分支 git branch -d …...

MAC电脑常用操作
环境:M3芯片 ,macOS15.2 🚀 快捷键 🖥️ 窗口管理 ✅ 退出/进入全屏模式 • 浏览器等应用:⌘ Command Ctrl F ✅ 最小化当前窗口 • ⌘ Command M • 💡 隐藏窗口但保留应用在后台运行 ✅ 关闭当前标…...

【计算机网络】深入解析 HTTP 协议的概念、工作原理和通过 Fiddler 抓包查看 HTTP 请求/响应的协议格式
网络原理— HTTP 1. 什么是HTTP? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议: HTTP 往往是基于传输层的 TCP 协议实现的 (HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3基于UDP实现) 我们平时打开一个网站,就是通过HTTP协议来…...