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

news2025/3/14 10:31:41

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

基础知识:

一文清晰梳理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_id
	from branch
	where branch_name = '研发'
);

select manager_id
	from branch
	where branch_name = '研发'

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

select `name` 
from employee
where emp_id in (
	select emp_id 
	from works_with
	where 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分,是充满希望的早晨!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KCD 北京站丨Volcano 邀您畅聊云原生智能调度技术与应用

AI与云原生技术正以前所未有的速度改变着我们的世界,而云原生技术则如同一座坚实的桥梁,连接着传统IT与现代化的数字世界。当AI与云原生相遇,它们相互赋能,相互促进,为开发者们打开了一个全新的技术宇宙。 3 月 15 日&…

BLEU评估指标

一、介绍 用于评估模型生成的句子和实际句子差异的指标,取值在[0,1],匹配度高就距离1近,反之距离0近。这个指标计算代价小,容易理解,与语言无关,与人类评价结果高度相关。 BLEU主要基于n-gram匹配&#x…

高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架

一、背景 在快节奏的开发周期中,如何确保接口质量?自动化测试是关键。通过构建标准化、可复用的测试框架,能显著提升测试效率与准确性,为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标: ● 实现快速、高效的接口测试…

BSides Vancouver: 2018 (Workshop)

BSides Vancouver: 2018 (Workshop) 来自 <https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop,231/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23…

rStar论文精读

论文简介 论文标题&#xff1a;《Mutual reasoning makes smaller LLMs stronger problem-solvers》 论文地址&#xff1a;https://arxiv.org/abs/2408.06195 录用会议&#xff1a;ICLR2025 背景与挑战 挑战1&#xff1a;在SLM中平衡exploration与exploitation。一些方法有很…

247g 的工业级电调,如何让无人机飞得更 “聪明“?——STONE 200A-M 深度测评

一、轻量化设计背后的技术取舍 当拿到 STONE 200A-M 时&#xff0c;247g 的重量让人意外 —— 这个接近传统 200A 电调 70% 的重量&#xff0c;源自 1205624.5mm 的紧凑结构&#xff08;0.1mm 公差控制&#xff09;。实测装机显示&#xff0c;相比同规格产品&#xff0c;其体积…

Node.js:快速启动你的第一个Web服务器

Node.js 全面入门指南 文章目录 Node.js 全面入门指南一 安装Node.js1. Windows2. MacOS/Linux 二 配置开发环境1. VSCode集成 三 第一个Node.js程序1. 创建你的第一个Node.js程序 四 使用Express框架1. 快速搭建服务器 一 安装Node.js 1. Windows 以下是Windows环境下Node.j…

自定义日志回调函数实现第三方库日志集成:从理论到实战

一、应用场景与痛点分析 在开发过程中&#xff0c;我们经常会遇到以下场景&#xff1a; 日志格式统一&#xff1a;第三方库使用自己的日志格式&#xff0c;导致系统日志混杂&#xff0c;难以统一管理和分析。日志分级过滤&#xff1a;需要动态调整第三方库的日志输出级别&…

Linux练级宝典->任务管理和守护进程

任务管理 进程组概念 每个进程除了进程ID以外&#xff0c;还有一个进程组&#xff0c;进程组就是一个或多个进程的集合 同一个进程组&#xff0c;代表着他们是共同作业的&#xff0c;可以接收同一个终端的各种信号&#xff0c;进程组也有其唯一的进程组号。还有一个组长进程&a…

C语言:计算并输出三个整数的最大值 并对三个数排序

这是《C语言程序设计》73页的思考题。下面分享自己的思路和代码 思路&#xff1a; 代码&#xff1a; #include <stdio.h> int main() {int a,b,c,max,min,mid ; //设置大中小的数分别为max&#xff0c;mid&#xff0c;min&#xff0c;abc为输入的三个数printf("ple…

工具(十二):Java导出MySQL数据库表结构信息到excel

一、背景 遇到需求&#xff1a;将指定数据库表设计&#xff0c;统一导出到一个Excel中&#xff0c;存档查看。 如果一个一个弄&#xff0c;很复杂&#xff0c;耗时长。 二、写一个工具导出下 废话少絮&#xff0c;上码&#xff1a; 2.1 pom导入 <dependency><grou…

ACL初级总结

ACL–访问控制列表 1.访问控制 在路由器流量流入或者流出的接口上,匹配流量,然后执行相应动作 permit允许 deny拒绝 2.抓取感兴趣流 3.ACL匹配规则 自上而下逐一匹配,若匹配到了则按照对应规则执行动作,而不再向下继续匹配 思科:ACL列表末尾隐含一条拒绝所有的规则 华为:AC…

调优案例一:堆空间扩容提升吞吐量实战记录

&#x1f4dd; 调优案例一&#xff1a;堆空间扩容提升吞吐量实战记录 &#x1f527; 调优策略&#xff1a;堆空间扩容三部曲 # 原配置&#xff08;30MB堆空间&#xff09; export CATALINA_OPTS"$CATALINA_OPTS -Xms30m -Xmx30m"# 新配置&#xff08;扩容至120MB&am…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷一)

目录 1. 内存和地址 2. 指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量 2.3 解引用操作符 &#xff08;*&#xff09; 3. 指针的解引用 3.1 指针 - 整数 3.2 void* 指针 4. const修饰指针 4.1 const修饰变量 4.2 const修饰指针变量 5…

计算机毕业设计:留守儿童的可视化界面

留守儿童的可视化界面mysql数据库创建语句留守儿童的可视化界面oracle数据库创建语句留守儿童的可视化界面sqlserver数据库创建语句留守儿童的可视化界面springspringMVChibernate框架对象(javaBean,pojo)设计留守儿童的可视化界面springspringMVCmybatis框架对象(javaBean,poj…

golang算法二叉树对称平衡右视图

100. 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a…

Chatbox通过百炼调用DeepSeek

解决方案链接&#xff1a;评测&#xff5c;零门槛&#xff0c;即刻拥有DeepSeek-R1满血版 方案概览 本方案以 DeepSeek-R1 满血版为例进行演示&#xff0c;通过百炼模型服务进行 DeepSeek 开源模型调用&#xff0c;可以根据实际需求选择其他参数规模的 DeepSeek 模型。百炼平台…

【数据结构】6栈

0 章节 3&#xff0e;1到3&#xff0e;3小节。 认知与理解栈结构&#xff1b; 列举栈的操作特点。 理解并列举栈的应用案例。 重点 栈的特点与实现&#xff1b; 难点 栈的灵活实现与应用 作业或思考题 完成学习测试&#xff12;&#xff0c;&#xff1f; 内容达成以下标准(考核…

PyTorch 入门学习

目录 PyTorch 定义 核心作用 应用场景 Pytorch 基本语法 1. 张量的创建 2. 张量的类型转换 3. 张量数值计算 4. 张量运算函数 5. 张量索引操作 6. 张量形状操作 7. 张量拼接操作 8. 自动微分模块 9. 案例-线性回归案例 PyTorch 定义 PyTorch 是一个基于 Python 深…

mov格式视频如何转换mp4?

mov格式视频如何转换mp4&#xff1f;在日常的视频处理中&#xff0c;经常需要将MOV格式的视频转换为MP4格式&#xff0c;以兼容更多的播放设备和平台。下面给大家分享如何将MOV视频转换为MP4&#xff0c;4款视频格式转换工具分享。 一、牛学长转码大师 牛学长转码大师是一款功…