MySql 自我总结

news2025/4/15 15:48:55

目录

1. 数据库约束

1.1约束类型

2. 表的设计

2.1 一对一

2.2 一对多

2.3 多对多

3. 新增

4. 查询

4.1 聚合查询

4.2 GROUP BY 

4.3 HAVING

4.4 联合查询

4.5 内连接

4.5.1 内连接的核心概念

4.5.2 内连接的语法

4.5.3 ON 与 WHERE 的区别

4.6 自连接

4.6.1 定义

4.6.2 核心用途

4.7 外连接

4.7.1 定义

4.7.2 核心用途

4.8 子查询

4.8.1  子查询概念

4.9 合并查询

5. 索引

5.1 概念

5.2 索引的作用

5.3 索引的使用

5.4 B+树

5.4.1 B+ 树的核心特性

5.4.2 B+树的优势

6 事务

6.1 概念

6.2 事务的 ACID 特性

6.3 事务的隔离级别

6.3.1 READ UNCOMMITTED (读未提交)

6.3.2 READ COMMITTED(读已提交)

6.3.3 REPEATABLE READ(可重复读,MySQL 默认级别)

6.3.4 SERIALIZABLE(串行化)


1. 数据库约束

1.1约束类型

• NOT NULL - 某列不能储存 NULL 值

DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT NOT NULL,
   sn INT,
   name VARCHAR(20),
   qq_mail VARCHAR(20)
);

• UNIQUE - 保证某列的每行必须有唯一的值

DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT ,
   sn INT UNIQUE,
   name VARCHAR(20),
   qq_mail VARCHAR(20)
);

• DEFAULT - 规定没有给列赋值时的默认值

DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT NOT NULL,
   sn INT UNIQUE,
   name VARCHAR(20) DEFAULT 'unkown',
   qq_mail VARCHAR(20)
);

• PRIMARY KEY - NOT 和 UNIQUE 的结合。确保某列有唯一标识,有助于更容易的快速找到表中的一个特定的记录

DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT PRIMARY KEY auto_increment
   sn INT UNIQUE,
   name VARCHAR(20) DEFAULT 'unkown',
   qq_mail VARCHAR(20)
);

• FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性

外键用于关联其他表的主键或者唯一键,语法:

foreign key (字段名) references 主表(列) 
DROP TABLE IF EXISTS classes;
CREATE TABLE classes (
 id INT PRIMARY KEY auto_increment,
 name VARCHAR(20),
 `desc` VARCHAR(100)
);

DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT PRIMARY KEY auto_increment,
   sn INT UNIQUE,
   name VARCHAR(20) DEFAULT 'unkown',
   qq_mail VARCHAR(20),
 classes_id int,
 FOREIGN KEY (classes_id) REFERENCES classes(id)
);


• CHECK - CHECK 约束是 SQL 中用于限制列中可以存储的值的约束条件。它允许你定义一个布尔表达式,该表达式必须为真,否则数据将不被允许插入或更新到表中。

2. 表的设计

2.1 一对一

一个学生只能有一个账号,一个账号只能被一个学生持有

设计表做法:

      两个表,使用 id 来进行联系

      student (studentId, name, accountId)

      account (accountId, accountName, password)

2.2 一对多

一个学生只能在一个班级,一个班级可以包含多个学生

设计表做法:

2.3 多对多

一个课程可有多个学生,一个学生可以选择多门课程

设计表做法:

此时我们就需要引入关联表,我们可以设计三张表

(1) student (studentId, studentName ......)

(2) course (courseId, courseName ......)

此时不管我们是在 student 表里添加 courseId 还是在 course 表里 添加 studentId 都只能表示一对多的关系。所以我们可以创建一个关联表来吧 student 表和 course 表都连接起来。

(3) student_course (studentId, courseId )

3. 新增

我们可以通过 SELECT 代替 VALUES 来提供数据

INSERT INTO 目标表 (列1, 列2) 
SELECT 源列1, 源列2 FROM 源表;
-- 创建用户表
DROP TABLE IF EXISTS test_user;
CREATE TABLE test_user (
   id INT primary key auto_increment,
   name VARCHAR(20) comment '姓名',
   age INT comment '年龄',
   email VARCHAR(20) comment '邮箱',
 sex varchar(1) comment '性别',
 mobile varchar(20) comment '手机号'
);
-- 将学生表中的所有数据复制到用户表
insert into test_user(name, email) select name, qq_mail from student;

需要注意的是,这是属于 INSERT 语法范畴,数据来源于动态 SELECT 子查询。先运行子查询,之后会把子查询的结果按照对应顺序插入到 INSERT 表中。

4. 查询

4.1 聚合查询

聚合查询函数如下:

• COUNT

COUNT(*) 会计入包含 NULL 值的行,它返回表中所有记录的条数,无论是否某个列存在 NULL。而 COUNT(具体列名) 只会统计该列中 非 NULL 值的数量。

-- 统计班级共有多少同学
SELECT COUNT(*) FROM student;

• SUM

-- 统计数学成绩总分
SELECT SUM(math) FROM exam_result

• AVG

-- 统计平均总分
SELECT AVG(chinese + math + english) 平均总分 FROM exam_result;

• MAX

-- 返回英语最高分
SELECT MAX(english) FROM exam_result;

• MIN

-- 返回 > 70 分以上的数学最低分
SELECT MIN(math) FROM exam_result WHERE math > 70;

NULL 和其他数值进行各种运算,结果都是NULL,但是 SUM 比较特殊,会自动跳过NULL的运算。

4.2 GROUP BY 

在GROUP BY子句中只能使用列名,不能使用聚合函数。

• 准备测试表及数据

create table emp(
 id int primary key auto_increment,
 name varchar(20) not null,
 role varchar(20) not null,
 salary numeric(11,2)
);
insert into emp(name, role, salary) values
('马云','服务员', 1000.20),
('马化腾','游戏陪玩', 2000.99),
('孙悟空','游戏角色', 999.11),
('猪无能','游戏角色', 333.5),
('沙和尚','游戏角色', 700.33),
('隔壁老王','董事长', 12000.66);

• 查询

select role,max(salary),min(salary),avg(salary) from emp group by role;

结果如下:

4.3 HAVING

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING。WHERE是在分组前过滤数据,而HAVING是在分组后对聚合结果进行过滤。

select role,max(salary),min(salary),avg(salary) from emp group by role 
having avg(salary)<1500;

结果如下:

4.4 联合查询

实际开发中数据往往来自不用表,所以需要多表联合查询。多表查询是对多张表提取笛卡尔积

笛卡尔积:在 SQL 中, 多表查询的笛卡尔积是指两个或多个表进行关联查询时,未指定连接条件(如 ON 或 WHERE),导致每个表的每一行都与另一个表的每一行组合,产生一个巨大的结果集。

-- 隐式笛卡尔积(不推荐)
SELECT * FROM table1, table2;

-- 显式笛卡尔积(使用 CROSS JOIN)
SELECT * FROM table1 CROSS JOIN table2;

这里不推荐隐式笛卡尔积,数据库优化器可能无法对隐式笛卡尔积进行有效优化,而显式CROSS JOIN 会提示优化器提前处理全组合逻辑。

我们可以使用 INNER JOIN、LEFT JOIN 等,搭配 ON 子句来指定连接条件,进而避免出现意外的笛卡尔积。

4.5 内连接

在 SQL 中,内连接(INNER JOIN) 是最常用的关联查询方式,用于仅返回两个表中满足连接条件的匹配行。

4.5.1 内连接的核心概念

• 作用:筛选两个表中的交集部分的数据

• 结果集:仅保留满足链接条件的行,不匹配的行被删除

4.5.2 内连接的语法

(1) 显示 INNER JOIN 语法

SELECT 列名
FROM 表1
INNER JOIN 表2 ON 表1.列 = 表2.列;

• 特点:

        使用 INNER JOIN 关键字明确关联逻辑,通过 ON指定连接条件,代码可读性强

(2) 隐式内连接语法

SELECT 列名
FROM 表1, 表2
WHERE 表1.列 = 表2.列;

特点:

        使用逗号多表分隔,通过 WHERE 子句过滤,容易与笛卡尔积混淆,可读性差

4.5.3 ON 与 WHERE 的区别

• ON 子句定义连接条件 (那些行需要关联)

• WHERE 子句在关联后过滤结果 (那些行需要保留)

• 举例:

-- 查询 IT 部门的员工
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d 
  ON e.dept_id = d.id 
  AND d.dept_name = 'IT'; -- 在 ON 中过滤更高效
4.6 自连接
4.6.1 定义

自连接是指将同一个表与自身关联,用于处理表中的层级关系或递归结构。通过为表设置不同的别名 (Alias) 来区分逻辑上的两个"表"。

SELECT 
    a.column1, b.column2  -- 选择需要的列
FROM 
    table_name a          -- 表的第一个别名
JOIN 
    table_name b          -- 表的第二个别名
ON 
    a.common_column = b.common_column  -- 连接条件
[WHERE ...];              -- 可选过滤条件

同一张表列与列之间的比较可以用条件筛选,如果同一张表想行与行之间比较,就需要自连接来查询,创建两张基于原表的"虚拟表"。

4.6.2 核心用途

• 层级关系:如员工与经理 (同一表中)

• 递归结构 (如分类树中的父子节点)

• 同一个表中的数据对比 (如查找同一个客户的多个订单)

4.7 外连接
4.7.1 定义

外连接用于返回两个表中满足条件的行,并保留至少一个表的所有行 (即使无匹配)

• 左外连接 (LEFT OUTER JOIN):保留左表所有行

SELECT 
    a.column1, b.column2  
FROM 
    table_a a  
LEFT JOIN 
    table_b b  
ON 
    a.key = b.key  
[WHERE ...];

• 右外连接 (RIGHT OUTER JOIN):保留右表所有行

SELECT 
    a.column1, b.column2  
FROM 
    table_a a  
RIGHT JOIN 
    table_b b  
ON 
    a.key = b.key  
[WHERE ...];

• 全外连接 (FULL OUTER JOIN):保留左右表所行

SELECT 
    a.column1, b.column2  
FROM 
    table_a a  
FULL JOIN 
    table_b b  
ON 
    a.key = b.key  
[WHERE ...];

4.7.2 核心用途

• 保留未匹配的数据:如查找没有订单的客户、没有客户的订单

• 数据完整性分析:识别缺失或孤立的记录

4.8 子查询
4.8.1  子查询概念

子查询是指嵌入在其他 sql 语句中的 select 语句,也叫嵌套查询

• 单行子查询:返回 一行一列 的结果,通常与单值比较操作符(如=, <, > 等)配合使用。

SELECT column1, column2
FROM table_name
WHERE column_operator (SELECT single_value_column FROM ... [WHERE条件]);

• 多行子查询:返回 多行一列 的结果, 不能使用单值比较符操作,可以使用 in,any,all,exists 来查询。

单行子查询和多行子查询对比

4.9 合并查询

对于不同表不能使用 or 的情况下,就可以使用合并查询。在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL时,前后查询的结果集中,字段需要一致

SELECT column1, column2, ... FROM table1
[UNION | UNION ALL]
SELECT column1, column2, ... FROM table2
[UNION | UNION ALL]
SELECT ...;

• UNION:该操作符用于取得两个结果集并合并,自动去除结果集中重复的行

• UNION ALL:该操作符用于取得两个结果集并合并,不会自动去除结果集中重复的行

5. 索引

5.1 概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并制定索引的类型,各类索引有各自的数据类型。可以理解为书的目录,提高查询速度。

5.2 索引的作用

• 加速查询:通过索引快速定位数据,减少全表扫描

• 约束唯一性:唯一索引确保列值唯一, 一个表只能有一个主键,但是可以有多个唯一索引,主键不能为空,唯一索引允许 NULL(只允许一个)

• 优化排序和分组:索引可加速 ORDER BY 和 GROUP BY 操作

使用场景:数据量较大,且经常对这些列进行条件查询

如果非条件查询列,或者经常有插入,修改操作,或磁盘空间不足时,不考虑创建索引。

5.3 索引的使用

创建主键约束 (PRIMARY KEY)、唯一约束 (UNIQUE)、外键约束 (FOREIGN KEY) 时,会自动创建对应的索引。

• 查看索引

show index from 表名;

• 创建索引

对于非主键、非唯一约束、非外键的字段,可以创建普通索引

create index 索引名 on 表名(字段名);

• 删除索引

drop index 索引名 on 表名;

5.4 B+树

B+树是数据库索引中常用的数据结构,它针对磁盘储存特性优化,支持高效的范围查找,和顺序访问,同时保持稳定的查询性能。

5.4.1 B+ 树的核心特性

• N叉平衡搜索树:每个节点包含多个键和子节点指针,树的高度保持平衡

• 所有的叶子节点位于同一层,保持查询路径长度一致

• 数据仅存储在叶子结点,内部节点仅存储键值和子节点指针,用于导航。叶子结点存储实际数据,并通过链表串联,支持高效的范围遍历。

• 节点容量越大,树的高度越低

5.4.2 B+树的优势

• N叉搜索树,高度低降低了硬盘IO次数

• 范围查询方便且高效

• 所有查询落到叶子结点,开销稳定容易预估成本

• 叶子结点存储数据行,非叶子结点只能存储索引列 key 值,非叶子节点占据空间小,可以加载到内存,进一步减少查询时 IO 次数

6 事务

6.1 概念

事务指逻辑上的一组操作,组成这个操作的各个单元,要么全部成功要么全部失败。在不同的环境中都可以有事务,在数据库中,就是数据库事务。

6.2 事务的 ACID 特性

6.3 事务的隔离级别
6.3.1 READ UNCOMMITTED (读未提交)

现象:事务可以读取其他未提交事务的修改(脏读)

6.3.2 READ COMMITTED(读已提交)

现象:事务只能读取其他已经提交的修改,解决了脏读,但是由于实时性,可能会出现不可重复读。不可重复读指的是,事务A在同一事务内第一次和第二次检查的结果不一样。

读已提交用处

如新闻网站、博客平台、读多写少,对实时性能要求高,允许短暂的数据不一致。

6.3.3 REPEATABLE READ(可重复读,MySQL 默认级别)

现象:确保同一事务内多次读取结果一致,解决不可重复读,但可能出现幻读。可以理解可重复读是时间冻结,在你检查这个事务的时候,结果是不变的,但是提交的时候系统会自动进行修改矫正。

可重复读用处

对数据一致性要求高的事务,比如:

银行计算账户利息时,需要基于某一时间点的约来算,期间不受转账影响。

生成财务报表时,数据必须基于某个固定时间点

可重复读代价

数据库需要保存旧数据快照,占用更多储存空间

高并发时可能增加冲突(提交时发现数据已经变化,需要重试)

6.3.4 SERIALIZABLE(串行化)

现象:强制事务串行执行,解决所有并发问题,但是性能最低。系统像"单线程"处理请求,彻底避免开发冲突,但会导致排队等待。

串行化用处

如金融系统、库存扣减、唯一性约束(如用户注册时检查用户名唯一性)、复杂事务逻辑

=========================================================================如果觉得有用的话给博主一键三连吧,祝您在以后的代码之路上越走越远。

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

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

相关文章

uni-app app 安卓和ios防截屏

首先可参考文档 uni.setUserCaptureScreen 这里需要在项目中引入这个插件 uni-usercapturescreen - DCloud 插件市场 否则会报错,在需要防止截屏录屏的页面中,加入 uni.setUserCaptureScreen({enable: false,success() {console.log(全局截屏录屏功能已禁用);},fail(err)…

【Go】windows下的Go安装与配置,并运行第一个Go程序

【Go】windows下的Go安装与配置&#xff0c;并运行第一个Go程序 安装环境&#xff1a;windows10 64位 安装版本&#xff1a;go1.16 windows/amd64 一、安装配置步骤 1.到官方网址下载安装包 https://golang.google.cn/dl/ 默认情况下 .msi 文件会安装在 c:\Go 目录下。可自行配…

vue3腾讯云直播 前端拉流(前端页面展示直播)

1、引入文件&#xff0c;在index.html <link href"https://tcsdk.com/player/tcplayer/release/v5.3.2/tcplayer.min.css" rel"stylesheet" /><!--播放器脚本文件--><script src"https://tcsdk.com/player/tcplayer/release/v5.3.2/t…

【MYSQL从入门到精通】数据库基础操作、数据类型

目录 一些基础操作语句 创建库名 选择要操作的数据库 删除数据库 磁盘中删除文件的原理 数据库安全的各种措置 查看MYSQL的帮助 数值类型 字符串类型 日期类型 一些基础操作语句 1.使用客户端工具连接数据库服务器&#xff1a;mysql -uroot -p 2.查看所有数据库&am…

论文阅读笔记——Multi-Token Attention

MTA 论文 在 Transformer 中计算注意力权重时&#xff0c;仅依赖单个 Q 和 K 的相似度&#xff0c;无法有效捕捉多标记组合信息。&#xff08;对于 A、B 两个词&#xff0c;单标记注意力需要分别计算两个词的注意力分数&#xff0c;再通过后处理定位共同出现的位置或通过多层隐…

vue3 antdesign table表格特定单元格背景变色

效果&#xff1a; <a-table :columns"columnsAll" :data-source"tableAllData"bordered size"middle" :scroll"{ x: 100,y: 600 }" :pagination"false"style"margin: 0 10px 10px 10px;" ><template #…

【C语言】--- 编译和链接

编译和链接 1. 翻译环境和运行环境2. 翻译环境2.1 预处理2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 3. 运行环境 1. 翻译环境和运行环境 计算机只能运行二进制指令&#xff0c;所以我们的.c的文本程序需要先翻译为二进制程序才能被计算机执行。在…

深入解析Python爬虫技术:从基础到实战的功能工具开发指南

一、引言:Python 爬虫技术的核心价值 在数据驱动的时代,网络爬虫作为获取公开数据的重要工具,正发挥着越来越关键的作用。Python 凭借其简洁的语法、丰富的生态工具以及强大的扩展性,成为爬虫开发的首选语言。根据 Stack Overflow 2024 年开发者调查,68% 的专业爬虫开发者…

前端 Vue: Cannot find module XX or its corresponding type declarations.

记一个常见错误&#xff0c;每次创建完新的vuetsvite项目&#xff0c;在配置路由的时候总会找不到vue文件&#xff0c;我用的是Webstorm&#xff0c;在设置里面修改以下设置&#xff0c;即可消除警告。

数字内容体验案例解析与行业应用

数字内容案例深度解析 在零售行业头部品牌的实践中&#xff0c;数字内容体验的革新直接推动了用户行为模式的转变。某国际美妆集团通过搭建智能内容中台&#xff0c;将产品信息库与消费者行为数据实时对接&#xff0c;实现不同渠道的动态内容生成。其电商平台首页的交互式AR试…

HBuilderX中uni-app打包Android(apk)全流程超详细打包

一、Android生成打包证书 1、Android平台签名证书(.keystore)生成指南_android 签名生成-CSDN博客&#xff08;如果不上架应用商店可以跳过&#xff0c;可以使用云端证书&#xff09; 二、打开manifest.json配置基础设置 三、配置安卓应用图标 四、配置安卓启动页图片 五、…

多模态大模型重塑自动驾驶:技术融合与实践路径全解析

目录 1、 引言&#xff1a;AI与自动驾驶的革命性融合 2、五大领先多模态模型解析 2.1 Qwen2.5-Omni&#xff1a;全模态集大成者 2.2. LLaVA&#xff1a;视觉语言理解专家 2.3. Qwen2-VL&#xff1a;长视频理解能手 2.4. X-InstructBLIP&#xff1a;跨模态理解框架 2.5. …

vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值。

项目场景&#xff1a; <el-table-column label"税率" prop"TaxRate" width"180" align"center" show-overflow-tooltip><template slot-scope"{row, $index}"><el-form-item :prop"InquiryItemList. …

OFDM CP 对解码影响

OFDM符号间会存在ISI&#xff0c;为了解决该问题在符号间插入了循环前缀&#xff0c;可以说这个发明是OFDM能够实用的关键&#xff0c;在多径信道中CP可以有效的解决符号间干扰。3GPP中对于不同SCS 定义了不同的CP长度&#xff1a; 5G Cyclic Prefix (CP) Design -5G Physical …

Vue3.5 企业级管理系统实战(十四):动态主题切换

动态主题切换是针对用户体验的常见的功能之一&#xff0c;我们可以自己实现如暗黑模式、明亮模式的切换&#xff0c;也可以利用 Element Plus 默认支持的强大动态主题方案实现。这里我们探讨的是后者通过 CSS 变量设置的方案。 1 组件准备 1.1 修改 Navbar 组件 在 src/layo…

解决Ubuntu20.04安装ROS2的问题(操作记录)

一、ROS 系统安装版本选择 每版的Ubuntu系统版本都有与之对应ROS版本&#xff0c;每一版ROS都有其对应版本的Ubuntu版本&#xff0c;切记不可随便装。ROS 和Ubuntu之间的版本对应关系如下&#xff1a;&#xff08; 可以从这个网站查看ROS2的各个发行版本的介绍信息。&#xff…

C# 设置Excel中文本的对齐方式、换行、和旋转

在 Excel 中&#xff0c;对齐、换行和旋转是用于设置单元格内容显示方式的功能。合理的设置这些文本选项可以帮助用户更好地组织和展示 Excel 表格中的数据&#xff0c;使表格更加清晰、易读&#xff0c;提高数据的可视化效果。本文将介绍如何在.NET 程序中通过C# 设置Excel单元…

RPA VS AI Agent

图片来源网络 RPA&#xff08;机器人流程自动化&#xff09;和AI Agent&#xff08;人工智能代理&#xff09;在自动化和智能化领域各自扮演着重要角色&#xff0c;但它们之间存在显著的区别。以下是对两者区别的详细分析&#xff1a; 一、定义与核心功能 RPA&#xff08;机…

uniapp大文件分包

1. 在pages.json中配置 "subPackages":[{"root":pagesUser,"pages":[{"path":mine/xxx,"style":xxx },{"path":mine/xxx,"style":xxx}]},{"root":pagesIndex,"pages":[{"p…

Spark-core编程

sortByKey 函数说明 join 函数说明 leftOuterJoin 函数说明 cogroup 函数说明 RDD行动算子&#xff1a; 行动算子就是会触发action的算子&#xff0c;触发action的含义就是真正的计算数据。 reduce 函数说明 collect 函数说明 foreach 函数说明 count 函数说明 first …