MySQL数据库基础第四篇(多表查询与事务)

文章目录

  • 一、多表关系
  • 二、多表查询
  • 三、内连接查询
  • 四、外连接查询
  • 五、自连接查询
  • 六、联合查询 union, union all
  • 七、子查询
    • 1.标量子查询
    • 2.列子查询
    • 3.行子查询
    • 4.表子查询
  • 八、事务
  • 八、事务的四大特性
  • 九、并发事务问题
  • 十、事务隔离级级别

在这篇文章中,我们将深入探讨数据库的查询技巧和方法,包括多表关系、多表查询、内连接查询、外连接查询、自连接查询,以及联合查询、子查询等多种查询方法。我们将通过清晰的图解和实例代码,展现数据在不同查询中的流动和转化,让读者一目了然。我们还将介绍事务在数据库中的作用和使用方式,详细解读事务的四大特性并讲解并发事务可能出现的问题和解决办法。此外,我们还将探讨事务的隔离级别,并通过实例代码展示如何在实际操作中使用这些功能。无论你是数据库应用的新手还是老鸟,我相信你都能在这篇文章中找到有用的信息。

一、多表关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、多表查询

在这里插入图片描述
合并查询(笛卡尔积,会展示所有组合结果):
select * from emp, dept;

笛卡尔积:两个集合A集合和B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

消除无效笛卡尔积:
select * from emp, dept where emp.dept = dept.id;

三、内连接查询

在这里插入图片描述
在这里插入图片描述
隐式内连接:
SELECT 字段列表 FROM 表1, 表2 WHERE 条件 …;

显式内连接:
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 …;

显式性能比隐式高

例子:


-- 查询员工姓名,及关联的部门的名称
-- 隐式
select e.name, d.name from employee as e, dept as d where e.dept = d.id;
-- 显式
select e.name, d.name from employee as e inner join dept as d on e.dept = d.id;

四、外连接查询

在这里插入图片描述
左外连接:
查询左表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 …;
相当于查询表1的所有数据,包含表1和表2交集部分数据

右外连接:
查询右表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 …;

例子:

-- 左
select e.*, d.name from employee as e left outer join dept as d on e.dept = d.id;
select d.name, e.* from dept d left outer join emp e on e.dept = d.id;  -- 这条语句与下面的语句效果一样
-- 右
select d.name, e.* from employee as e right outer join dept as d on e.dept = d.id;

五、自连接查询

在这里插入图片描述
当前表与自身的连接查询,自连接必须使用表别名

语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 …;

例子:

-- 查询员工及其所属领导的名字
select a.name, b.name from employee a, employee b where a.manager = b.id;
-- 没有领导的也查询出来
select a.name, b.name from employee a left join employee b on a.manager = b.id;

六、联合查询 union, union all

在这里插入图片描述

七、子查询

在这里插入图片描述

1.标量子查询

子查询返回的结果是单个值(数字、字符串、日期等)。
常用操作符:- < > > >= < <=

例子:

-- 查询销售部所有员工
select id from dept where name = '销售部';
-- 根据销售部部门ID,查询员工信息
select * from employee where dept = 4;
-- 合并(子查询)
select * from employee where dept = (select id from dept where name = '销售部');
-- 查询xxx入职之后的员工信息
select * from employee where entrydate > (select entrydate from employee where name = 'xxx');

2.列子查询

在这里插入图片描述

例子:

-- 查询销售部和市场部的所有员工信息
select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');
-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
-- 查询比研发部任意一人工资高的员工信息
select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));
## 3.
## 4.
# 八、
# 九、案例
## 1.源代码
>代码如下(示例):

3.行子查询

在这里插入图片描述
例子:

-- 查询与xxx的薪资及直属领导相同的员工信息
select * from employee where (salary, manager) = (12500, 1);
select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');

4.表子查询

返回的结果是多行多列
常用操作符:IN

例子

-- 查询与xxx1,xxx2的职位和薪资相同的员工
select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2');
-- 查询入职日期是2006-01-01之后的员工,及其部门信息
select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;

八、事务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基本操作:

-- 1. 查询张三账户余额
select * from account where name = '张三';
-- 2. 将张三账户余额-1000
update account set money = money - 1000 where name = '张三';
-- 此语句出错后张三钱减少但是李四钱没有增加
模拟sql语句错误
-- 3. 将李四账户余额+1000
update account set money = money + 1000 where name = '李四';
-- 查看事务提交方式
SELECT @@AUTOCOMMIT;
-- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
SET @@AUTOCOMMIT = 0;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 设置手动提交后上面代码改为:
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;

操作方式二:

开启事务:
START TRANSACTION 或 BEGIN TRANSACTION;
提交事务:
COMMIT;
回滚事务:
ROLLBACK;
操作实例:

start transaction;
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;

八、事务的四大特性

在这里插入图片描述

九、并发事务问题

在这里插入图片描述

十、事务隔离级级别

在这里插入图片描述
√表示在当前隔离级别下该问题会出现
Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差

在这里插入图片描述

查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别:
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };

SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效

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

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

相关文章

数据结构之队的实现

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

C++面经

学习视频参考 1 面向对象的三大特征 1.1 封装 1.1.1 目的 隐藏实现细节&#xff0c;实现模块化。 1.1.2 特性 访问权限&#xff1a; public&#xff1a;可以给所有对象访问。protected&#xff1a;仅对子类开放。private&#xff1a;仅对自己开放&#xff0c;可以通过友元…

用HTML5 Canvas创造视觉盛宴——动态彩色线条效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- 声明文档类型为XHTML 1.0 Transitional -…

Python四级考试笔记

Python四级考试笔记【源源老师】 四级标准 一、 理解函数及过程、函数的参数、函数的返回值、变量作用域等概念。 二、 能够创建简单的自定义函数。 三、 理解算法以及算法性能、效率的概念&#xff0c;初步认识算法优化 效率的方法。 四、 理解基本算法中递归的概念。 五、 掌…

C语言---自幂数(“水仙花数”)

1.打印0~100000的自幂数 #include<stdio.h> #include<math.h> int main() {int i 0; for (i 0; i<100000; i){int n 0;int temp i;//判断位数while (temp){n;temp temp / 10;}//每个数字求和temp i;int sum 0;while (temp){sum sum pow(temp % 10, n)…

[office] 如何固定excel单元格的方法 #笔记#微信#微信

如何固定excel单元格的方法 在Excel中录入好数据以后就需要进行统计数据&#xff0c;在有些单元格中的数据不能够改变位置&#xff0c;因此我们需要对特定的单元格进行锁定固定。下面是由小编分享的如何固定excel单元格的方法&#xff0c;供大家阅读、学习。 如何固定excel单元…

掘根宝典之C++多重继承,二义性,虚基类

多重继承派生类 除去一个类从一个基类派生&#xff0c;C还支持一个派生类同时继承多个基类 MI&#xff1a;有多个直接基类的类 1.多重继承派生类的定义 如果已经定义了多个基类&#xff0c;那么定义多重继承的派生类的形式为&#xff1a; class 派生类名:访问标号1 基类名…

【开源】SpringBoot框架开发独居老人物资配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4.2 新增物资4.3 查询物资4.4 查询物资配送4.5 新增物资配送 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的独居老人物资配送系统&#xff0c;包含了社区档案、…

win7自带截图工具保存失效解决办法

今日发现一台远航技术的win7中自带的截图工具使用时正常&#xff0c;保存图片时没有弹出保存位置的对话窗口&#xff0c;无法正常保存图片。解决方案如下&#xff1a; 1、进入注册表编辑器。开始-搜索程序和文件-输入 regedit 按下回车键&#xff0c;打开注册表&#xff1b; 2、…

多模态基础---BERT

1. BERT简介 BERT用于将一个输入的句子转换为word_embedding&#xff0c;本质上是多个Transformer的Encoder堆叠在一起。 其中单个Transformer Encoder结构如下&#xff1a; BERT-Base采用了12个Transformer Encoder。 BERT-large采用了24个Transformer Encoder。 2. BERT的…

360小工具

有时候不希望打开360安全卫士&#xff0c;但又需要使用它的小工具 小工具目录统一基于360安装目录&#xff0c;一般情况在&#xff1a;C:\Program Files (x86)\360\360Safe 备份还原小工具 C:\Program Files (x86)\360\360Safe\Utils\winrebackup\360WinREBackup64.exe 360LS…

静态时序分析:SDC约束命令set_clock_transition详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析&#xff1a;SDC约束命令create_clock详解一文的最后&#xff0c;我们谈到了针对理想(ideal)时钟&#xff0c;可以使用set_clock_transition命令直…

MQTT的应用场景和发展方向

随着物联网&#xff08;IoT&#xff09;技术的发展&#xff0c;MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为一种轻量级的通信协议&#xff0c;正在被广泛应用于各种物联网场景中。本文将介绍MQTT的应用场景以及未来的发展方向。 一、MQTT的应用场景…

在Linux系统中,yum 和 apt-get 都是用于管理软件包和更新系统的命令行工具,它们的区别是什么?

一、 yum yum 是在基于RPM的Linux发行版&#xff08;如CentOS、RHEL及其衍生版&#xff09;中使用的包管理器。它通过网络连接到软件仓库并自动处理依赖关系来安装、更新和卸载软件包。主要命令包括&#xff1a; 1、更新软件包列表 yum update 2、安装软件包 yum install …

c++堆排序解释

堆排序是一种基于二叉堆数据结构的排序算法。它是利用了堆的性质&#xff0c;即父节点的值总是大于或等于&#xff08;或小于或等于&#xff09;其子节点的值。 堆排序的基本思想是首先将待排序的数组构建成一个最大堆&#xff08;或最小堆&#xff09;&#xff0c;然后将堆的…

数据结构与算法:双向链表

朋友们大家好啊&#xff0c;在上节完成单链表的讲解后&#xff0c;我们本篇文章来对带头循环双向链表进行讲解 双向链表 双向链表、头节点和循环的介绍构建双向链表节点的构建初始化双向循环链表&#xff08;空链表&#xff09;销毁双向链表 链表的打印双向链表头尾的插与删尾插…

Medical Boundary Diffusion Modelfor Skin Lesion Segmentation

皮肤病灶分割的医学边界扩散模型 摘要 由于多尺度边界关注和特征增强模块的进步&#xff0c;皮肤镜图像中的皮肤病变分割最近取得了成功。然而&#xff0c;现有的方法依赖于端到端学习范式&#xff0c;直接输入图像和输出分割图&#xff0c;经常与极其困难的边界作斗争&#…

B端系统升级方案模板:针对美观性和体验性升级(总体方案)

大家好&#xff0c;我是大美B端工场&#xff0c;专注于前端开发和UI设计&#xff0c;有需求可以私信。本篇从全局分享如何升级B端系统&#xff0c;搞B端系统升级的有个整体思维&#xff0c;不是说美化几个图标&#xff0c;修改几个页面就能解决的&#xff0c;这个方案模板&…

laravel_进程门面_再次介绍

文章目录 单次调用进程池调用伪造和断言断言和判断的区别 前面我已经简单介绍了一点process facades&#xff0c;这里再进行一个补充的介绍。 可以也看看前面的介绍。 单次调用 use Illuminate\Support\Facades\Process;$result Process::run(ls -la);return $result->ou…

c++希尔排序解释

希尔排序是一种排序算法&#xff0c;它是插入排序的改进版本。它通过将序列分成多个子序列&#xff0c;对每个子序列进行插入排序&#xff0c;然后逐步减小子序列的长度&#xff0c;直到整个序列有序。 希尔排序的基本思想是&#xff1a;选择一个增量序列&#xff0c;根据增量…