数据库基础 四张图理解数据库之第二张 快速学习 理解 多表操作(附带相关资源)第二天

本文深入解析数据库中的多表操作,包括一对一、一对多、多对多关系,外键约束,以及truncate table与delete from的区别。重点讨论了主外键约束和事务的四大特性,同时介绍了不同类型的多表查询,如连接查询、外链接查询和子查询。此外,还提到了事务的隔离级别和安全性问题。

多表操作

一对多关系:

原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。
这里写图片描述

多对多关系:

原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
这里写图片描述

一对一关系:

原则:
外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一unique。
外键是主键:主表的主键和外键的主键,形成主外键关系。
提示:实际开发中应用不多,因为一对一可以创建成一张表。

外键约束:

特点:
从表外键的值是对主表主键的引用。
从表外键类型,必须与主表主键类型一致。

1、truncate table 和delete from 区别?

truncate table:

可以清除数据,而且会重置ID,相当于:靶标摧毁了,又重新创建一张一模一样的表格。
属于DDL语句,不可以结合事务。

delete from:

可以清除数据,单不会重置ID。
属于DML,可以结合事务使用。

2、约束的演示(主外键约束)

概述(作用):

约束是用来保证数据的完整性和安全性的。
分类:

单表约束:

主键约束:primary key //自增长:auto_increment
唯一约束:unique
非空约束:not null

多表约束:

主外键约束:
foreign key
格式:
alter table 数据表A add foreign key (列名) reference 数据表B(列名);

总结:外表的外键列不能出现主表没有的主键没有的内容(数据).

多表查询

交叉查询 :格式:select * from 表A,表B; 结果:表的笛卡尔积。笛卡尔积:每张表的总条数乘积。

连接查询:

内连接查询: 语法:inner join 查询结果:表的交集。
显示内连接查询 格式: select * from 表A inner join 表B on 条件;(优化:inner可以省略。)
隐式内连接查询 格式:select * from 表A ,表B where 条件;

外链接查询

左外链接: 左表的全集+表的交集 格式:select * from 表A left outer join 表B on 条件;(优化:outer可省略)
右外链接: 右表的全集+表的交集 格式:select * from 表A right outer join 表B on 条件;

子查询 : 一个SQL语句的查询条件依赖于另一个SQL语句的查询结果。

in: 任意一个,等于
any:任意一个,任何关系
all:所有的,所有条件。

补:distinct 去重

多对多图解:
这里写图片描述

5、事务

概述:指的是逻辑上的一组操作,组成该操作的各个逻辑单元,要么全部成功,要么全部失败。

记忆:

MySQL默认开启了事务的自动提交功能,Oracle没有,需要手动开启。
MySQL的默认隔离级别:repeatable read。
// select @@tx_isolation; 查看隔离级别。
//show variables like ‘%commit%‘ ; 查看是否开启了事务的自动提交功能.
set session transaction isolation level ; 指定的隔离级别。
variables
oracle 的默认隔离界别是: read committed

事务的执行特点;

事务的共有四大特性:
1. 原子性: 事务的不可分割,组成事务的各个逻辑单元不可分割。
2. 一致性:事务执行的前后,数据完整性保持一致。
3. 隔离性:事务执行不应该受到其他事务的干扰。
4. 持久性:事务一旦结束,数据就持久化到数据库中。

补:
如果不考虑隔离性,就有可能引发安全问题:
关于读的问题:
脏读: 一个事务读取到了另一个事务还没有提交的数据。
不可重复读:一个事务读取到了另一个事务已经提交的:修改数据,导致多次查询结果不一致。
虚读(幻读):一个事务读取到了另一事务已经提交的;添加数据,导致多次查询结果不一致。

关于写的问题:
丢失更新。

隔离级别的范文从小到大分别是:
read uncommitted < read committed

多表左外链接查询格式:

SELECT *
FROM 表1
LEFT JOIN 表2
ON 表1.关联字段=表2.关联字段
LEFT JOIN 表3
ON (表1/表2).关联字段=表3.关联字段
WHERE 条件

图图图

这里写图片描述

资源下载链接

是的,**你理解得完全正确!** --- ### ✅ 回答: > 这个脚本确实是:**只有找到第一张,才会继续去找第二张;如果找不到第一张,就直接停止脚本,不会执行找第二张操作。** --- ### 🔍 原因分析(结合代码): 我们来看关键逻辑部分: ```vbs ret1 = FindPic(x1, y1, x2, y2, pic1, 0, similarity, x, y) If ret1 >= 0 Then MessageBox "找到第一张..." Else MessageBox "未找到第一张..." EndScript ' ← 关键在这里! End If ``` - `EndScript` 是一个非常重要的命令,它的作用是 **立即终止脚本运行**。 - 所以当第一张没找到时(`ret1 < 0`),程序进入 `Else` 分支,执行 `EndScript`,后面的代码(包括找第二张)**根本不会执行**。 因此: ✅ **结果就是:必须成功找到第一张 → 才会继续找第二张** ❌ 找不到第一张 → 脚本结束,不进行下一步 --- ### 🛠 如果你想“即使没找到第一张也继续尝试找第二张”,该怎么改? 只需要把 `EndScript` 换成 `Goto` 或去掉强制退出即可。例如: ```vbs If ret1 >= 0 Then MessageBox "找到第一张" Else MessageBox "没找到第一张,跳过..." // 不用 EndScript,而是继续往下走 End If ' 继续查找第二张 ret2 = FindPic(x1, y1, x2, y2, pic2, 0, similarity, x, y) ... ``` 这样即使第一张没找到,也会继续尝试找第二张。 --- ### ✅ 总结对比: | 需求 | 是否使用 `EndScript` | 行为 | |------|------------------------|------| | 必须先找到1再找2 | ✅ 使用 `EndScript` | 找不到1就停止 | | 1可有可无,都继续找2 | ❌ 不使用 `EndScript` | 即使1没找到也继续 | --- 所以你的理解是对的: 👉 当前脚本的行为就是:**“找到第一张才继续,否则放弃”**。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值