<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Stari&apos;s Blog</title><description>Code &amp; Life</description><link>https://lilyly9.github.io/</link><language>zh_CN</language><item><title>26summer</title><link>https://lilyly9.github.io/posts/26summer/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/26summer/</guid><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded/></item><item><title>数据库复习</title><link>https://lilyly9.github.io/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%8D%E4%B9%A0/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%8D%E4%B9%A0/</guid><description>笔记太多太乱了，我都看不懂。。</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;C1 绪论&lt;/h1&gt;
&lt;h3&gt;数据库的基本概念&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;⭐数据库、DBMS、数据库系统&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数据库 DB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;长期存储、有组织、可共享的大量&lt;strong&gt;数据的集合&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数据库管理系统 DBMS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;管理数据库的&lt;strong&gt;软件&lt;/strong&gt;，位于应用程序和数据库之间（如 MySQL、Oracle、SQLSever）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;**数据库系统 DBS **&lt;/td&gt;
&lt;td&gt;数据库、DBMS、应用程序、数据库管理员、硬件等构成的整体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数据库应用系统&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;面向具体业务开发的&lt;strong&gt;应用程序&lt;/strong&gt;及其&lt;strong&gt;数据库环境&lt;/strong&gt; = 数据库 + DBMS + 应用程序 + 数据库管理员 +硬件环境&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⭐文件系统 vs 数据库&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比角度&lt;/th&gt;
&lt;th&gt;文件方式&lt;/th&gt;
&lt;th&gt;数据库方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;分散/统一&lt;/td&gt;
&lt;td&gt;数据分散在不同文件&lt;/td&gt;
&lt;td&gt;数据统一组织和管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共享&lt;/td&gt;
&lt;td&gt;共享困难&lt;/td&gt;
&lt;td&gt;支持多用户共享&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;冗余&lt;/td&gt;
&lt;td&gt;冗余较多&lt;/td&gt;
&lt;td&gt;可以控制冗余&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;耦合/独立&lt;/td&gt;
&lt;td&gt;程序与数据耦合较强&lt;/td&gt;
&lt;td&gt;具有数据独立性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性质&lt;/td&gt;
&lt;td&gt;一致性、安全性难保证&lt;/td&gt;
&lt;td&gt;DBMS 统一保证完整性、安全和并发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用场景&lt;/td&gt;
&lt;td&gt;适合简单、独立的小规模数据&lt;/td&gt;
&lt;td&gt;适合长期、共享、结构化业务数据&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;数据模型的组成要素 &amp;amp; 常用数据模型&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;⭐数据模型&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;两大类、共三种数据模型：&lt;strong&gt;概念&lt;/strong&gt;数据模型、 &lt;strong&gt;逻辑&lt;/strong&gt;数据模型、&lt;strong&gt;物理&lt;/strong&gt;数据模型&lt;/li&gt;
&lt;li&gt;数据模型的&lt;strong&gt;组成要素&lt;/strong&gt;：&amp;lt;u&amp;gt;数据结构、数据操作、数据约束&amp;lt;/u&amp;gt;
（二维关系表、原则/插入等、实体完整性）&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;⭐关系模型基本概念&lt;/h4&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 0px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/relationModel1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/relationModel2.png&quot; alt=&quot;象集2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;数据库的三级模式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;从数据库应用开发人员角度看，数据库通常采用 &amp;lt;u&amp;gt;&lt;strong&gt;三级模式结构&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层次&lt;/th&gt;
&lt;th&gt;描述内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;外模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;某一类用户看到的局部数据，也叫用户视图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;模式/概念模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;整个数据库的全局逻辑结构&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;内模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数据的物理存储结构、文件组织和存取路径&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;img_17.png&quot; alt=&quot;图片描述&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;两种数据独立性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;逻辑数据独立性&lt;/strong&gt;：&amp;lt;u&amp;gt;概念模式&amp;lt;/u&amp;gt;改变时，外模式和应用程序尽量不用改变。
&amp;lt;br&amp;gt;例如增加一个属性，只需调整外模式与概念模式之间的映像，原有应用仍可使用原来的视图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;物理数据独立性&lt;/strong&gt;：&amp;lt;u&amp;gt;内模式&amp;lt;/u&amp;gt;改变时，概念模式和应用程序不用改变。
&amp;lt;br&amp;gt;例如把顺序文件改成 B+ 树索引，应用程序仍然执行相同的 SQL。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;⭐关系的完整性约束&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;实体完整性&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;主码属性不能为空 NULL&amp;lt;/u&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参照完整性&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;u&amp;gt;外码值要么为空，要么等于被参照关系的主码值&amp;lt;/u&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外码&lt;/strong&gt;：
&amp;lt;br&amp;gt;参照关系：R（拿着外码的表，比如学生表）
&amp;lt;br&amp;gt;被参照关系：S（被引用主键的表，比如专业表）
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/outerMa1.png&quot; alt=&quot;外码1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/outerMa2.png&quot; alt=&quot;外码2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/outerMa3.png&quot; alt=&quot;外码2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户定义的完整性&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;⭐码与相关概念&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;超码&lt;/h4&gt;
&lt;p&gt;能 &amp;lt;u&amp;gt;唯一标识&amp;lt;/u&amp;gt; 元组的任意属性集。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关系：&lt;strong&gt;候选码&lt;/strong&gt;是&lt;strong&gt;最小超码&lt;/strong&gt;，候选码的任意超集都是超码。&lt;/li&gt;
&lt;li&gt;例如：S(Sno, Sdept, Sage)，若：Sno → Sno, Sdept, Sage，
&amp;lt;br&amp;gt;{Sno}是&amp;lt;u&amp;gt;候选码&amp;lt;/u&amp;gt; 也是&amp;lt;u&amp;gt;超码&amp;lt;/u&amp;gt;，(Sno, Sdept)也是&amp;lt;u&amp;gt;超码&amp;lt;/u&amp;gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;候选码（码）&lt;/h4&gt;
&lt;p&gt;能够唯一标识元组的 &amp;lt;u&amp;gt;最小&amp;lt;/u&amp;gt; 超码
&amp;lt;br&amp;gt;{Sno}是候选码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;全码&lt;/h4&gt;
&lt;p&gt;如果关系的&lt;strong&gt;所有属性&lt;/strong&gt;U才是R的码，称为&lt;strong&gt;全码&lt;/strong&gt;
&amp;lt;br&amp;gt;例：$R(P,W,A)$（演奏者、作品、听众），全码为 $(P,W,A)$。P, W, A 都是关系R的主属性，在关系R中没有非主属性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;主码&lt;/h4&gt;
&lt;p&gt;如果一个关系模式有多个候选码，则从中选一个作为主码。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如：Student(Sno, Sname, Ssex, Sage, Sdept)：Sno 是候选码，Sname 也是候选码。
&amp;lt;br&amp;gt;  → 可以选 Sno 作为主码。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;外码&lt;/h4&gt;
&lt;p&gt;R中 $X$ 不是当前关系R的码，&lt;strong&gt;是另一关系的码&lt;/strong&gt;，则 $X$ 为 $R$ 的外码。
&amp;lt;br&amp;gt;例：$SC(&amp;lt;u&amp;gt;Sno,Cno&amp;lt;/u&amp;gt;,Grade)$ 中 Sno不是码，Sno是 S(&amp;lt;u&amp;gt;Sno&amp;lt;/u&amp;gt;,Sdept,Sage)的码，
&amp;lt;br&amp;gt;  则 $Sno$ 是 $SC$ 的外码
&amp;lt;br&amp;gt;  &lt;code&gt;FOREIGN KEY (deptno) REFERENCES Department(deptno)&lt;/code&gt;
&amp;lt;br&amp;gt;  外码的&lt;strong&gt;作用&lt;/strong&gt;是：建立表之间的引用联系，并保证参照完整性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;主属性与非主属性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主属性&lt;/strong&gt;：包含在&lt;strong&gt;任意候选码&lt;/strong&gt;中的属性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非主属性&lt;/strong&gt;：不包含在任何候选码中的属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;例&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;S(&amp;lt;u&amp;gt;Sno&amp;lt;/u&amp;gt;, Sdept, Sage)中，只有一个&lt;strong&gt;候选码Sno&lt;/strong&gt;，所以：&lt;strong&gt;Sno&lt;/strong&gt;是关系S的&lt;strong&gt;主属性&lt;/strong&gt;，&lt;strong&gt;Sdept&lt;/strong&gt;和&lt;strong&gt;Sage&lt;/strong&gt;是关系S的2个&lt;strong&gt;非主属性&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;SC(&amp;lt;u&amp;gt;Sno, Cno&amp;lt;/u&amp;gt;, Grade)中，只有一个&lt;strong&gt;候选码(Sno, Cno)&lt;/strong&gt;，所以：&lt;strong&gt;Sno&lt;/strong&gt;和&lt;strong&gt;Cno&lt;/strong&gt;是关系SC的2个&lt;strong&gt;主属性&lt;/strong&gt;，&lt;strong&gt;Grade&lt;/strong&gt;是关系SC的&lt;strong&gt;非主属性&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;Student(Sno, Sname, Ssex, Sage, Sdept)中。有两个&lt;strong&gt;候选码&lt;/strong&gt;：&lt;strong&gt;Sno&lt;/strong&gt; 和 &lt;strong&gt;Sname&lt;/strong&gt;（不允许学生同名），所以：&lt;strong&gt;Sno&lt;/strong&gt; 和 &lt;strong&gt;Sname&lt;/strong&gt;是关系Student的2个&lt;strong&gt;主属性&lt;/strong&gt;，&lt;strong&gt;Ssex,&lt;/strong&gt; &lt;strong&gt;Sage&lt;/strong&gt;, Sdept&lt;strong&gt;是关系Student的3个&lt;/strong&gt;非主属性。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;⭐C2 关系代数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关系运算&lt;/strong&gt;
&lt;img src=&quot;img_7.png&quot; alt=&quot;img_7.png&quot; /&gt;
选择：$\sigma_{Sdept=&apos;IS&apos;}(Student)$、投影：$\pi_{Sdept}(Student)$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;所有&lt;/strong&gt;：除运算÷；&lt;strong&gt;只&lt;/strong&gt;：
&lt;img src=&quot;image-111.png&quot; alt=&quot;alt text&quot; /&gt; &lt;img src=&quot;image-112.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;最大/最高&lt;/strong&gt;
在当前的所有顾客中, 查询折扣(discnt)最高的顾客的编号？
&amp;lt;br&amp;gt;令 $S := C$, “折扣不是最高的顾客的id”&lt;br /&gt;
$R_2 := \pi_{C.cid}(\sigma_{C.discnt &amp;lt; S.discnt}(C \times S))$
&amp;lt;br&amp;gt;答案是 $\pi_{cid}(C) - \pi_{C.cid}(\sigma_{C.discnt &amp;lt; S.discnt}(C \times S))$
&amp;lt;div style=&quot;display: flex; width:100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/tj.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/max1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width:100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/max2.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/max3.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;象集&lt;/strong&gt;
&amp;lt;br&amp;gt;该属性值对应的其他属性值集合，相当于除法
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 10px; margin: 5px 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/xj1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/xj2.png&quot; alt=&quot;象集2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;除运算 R ÷ S&lt;/strong&gt;
&amp;lt;span id=&quot;除运算&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;br&amp;gt;找出R、S中相同的属性列(B、C)，R 剩下的属性列(A) 作为结果。
&amp;lt;br&amp;gt;$a_i$的所有($b_j$,$c_j$)，$a_i$包含S中的全部b、c。&lt;br /&gt;
&amp;lt;div style=&quot;display: flex; width:100%; margin: 2px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/div1.png&quot; alt=&quot;外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/div2.png&quot; alt=&quot;左右外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例
&amp;lt;div style=&quot;display: flex; width:100%; margin: 2px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/divExample.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/divExample2.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;⭐C3 SQL&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;SQL基本执行结构&lt;pre&gt;&lt;code&gt;SELECT ...
 FROM ...
 WHERE ...
 GROUP BY ...
 HAVING ...
 ORDER BY ...;
&lt;/code&gt;&lt;/pre&gt;
逻辑顺序：&lt;code&gt;FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;对查询结果的处理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;对查询结果&lt;strong&gt;排序&lt;/strong&gt; &lt;strong&gt;ORDER BY 属性名 ASC升序/DESC降序&lt;/strong&gt;
查询选修了3号课程的学生的学号及其成绩，查询结果按分数降序排列。&lt;pre&gt;&lt;code&gt;SELECT Sno, Grade
FROM SC
WHERE Cno= &apos;3&apos;
ORDER BY Grade DESC;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;对查询结果&lt;strong&gt;分组&lt;/strong&gt; &lt;strong&gt;GROUP BY&lt;/strong&gt;/&lt;strong&gt;HAVING&lt;/strong&gt;
求各个课程号及相应的选课人数。&lt;pre&gt;&lt;code&gt;SELECT Cno，COUNT(Sno)
FROM SC
GROUP BY Cno; // 按照Cno为一行,相同Cno为一行
&lt;/code&gt;&lt;/pre&gt;
查询选修了3门以上课程的学生学号。&lt;pre&gt;&lt;code&gt;SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) &amp;gt;3;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;辨析 HAVING 与 WHERE：只有HAVING可以用AVG()等
&lt;img src=&quot;image-11.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;基本表 TABLE&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;定义基本表
&amp;lt;br&amp;gt;&lt;strong&gt;PRIMARY KEY 主键&lt;/strong&gt;，唯一标识一行数据，不能重复、不能为空
&amp;lt;br&amp;gt;&lt;strong&gt;UNIQUE 唯一&lt;/strong&gt;，不能重复，但能为空
&amp;lt;br&amp;gt;&lt;strong&gt;外键&lt;/strong&gt; &lt;code&gt;FOREIGN KEY (cno) PREFERENCE course(cno) ON UPDATE/DELETE 规约条件&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE Student
    (Sno CHAR(9) PRIMARY KEY,  /* 列级完整性约束条件, Sno是**主码**/
    Sname CHAR(20) UNIQUE,  /* **约束**，Sname的取值具有唯一性*/
    Ssex CHAR(2) NOT NULL CHECK (Ssex IN (&apos;男&apos;, &apos;女&apos;)),/*  非空且只能是男/女 */
    Sage SMALLINT,
    Sdept CHAR(20)
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE enrollment(
    sno char(9) NOT NULL,
    clsno char(8) NOT NULL,
    grade INT CHECK (grade BETWEEN 0 AND 100),
    PRIMARY KEY(sno,clsno), -- 课程班代码和学号联合构成PRIMARY KEY
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE courseclass(
clsno char(8) PRIMARY KEY,
cno char(8) NOT NULL,
tno char(9) ,
-- 先定义再外键 + 违约规则
FOREIGN KEY (cno) REFERENCES coures(cno) ON UPDATE CASCADE ON DELETE RESTRICT,
FOREIGN KEY (tno) REFERENCES teachers(tno) ON UPDATE CASCADE ON DELETE SET NULL
-- 父表更新cno，子表cno自动同步更新；父表删除cno，子表还有该课程就禁止删除
-- 父表更新tno，子表tno自动同步更新；父表删除tno，子表对应的tno自动设为NULL
);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;违约规则
&amp;lt;br&amp;gt;什么是违约？ 父表更新主键/删除父表记录会破坏参照关系，触发违约
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;关键字&lt;/th&gt;
&lt;th&gt;中文&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CASCADE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;级联&lt;/td&gt;
&lt;td&gt;父表改 / 删 → 子表自动跟着改 / 删&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SET NULL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;置空&lt;/td&gt;
&lt;td&gt;父表删 → 子表外键自动设为 &lt;strong&gt;NULL&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RESTRICT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;限制 / 拒绝&lt;/td&gt;
&lt;td&gt;数据库直接&lt;strong&gt;禁止&lt;/strong&gt;父表的改/删操作&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;修改基本表&lt;/strong&gt;（ALTER TABLE）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ADD新增列/完整性约束&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
ADD COLUMN S_email VARCHAR(50) NOT NULL UNIQUE;  -- 增加邮箱列，要求非空且唯一
ADD CONSTRAINT chk_sex CHECK (Ssex IN (&apos;男&apos;, &apos;女&apos;));  -- 为 Ssex 增加 CHECK 约束（性别只能是男 / 女）
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;DROP 删除列&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
DROP COLUMN S_email CASCADE; --删除“邮箱”列，默认RESTRICT
DROP CONSTRAINT chk_sex; -- 删除性别CHECK约束
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;修改列的定义&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
ALTER COLUMN Sage INT;  -- 修改数据类型：年龄从SMALLINT改为INT
ALTER COLUMN Sname CHAR(30); -- 修改列长度（姓名从 CHAR (20) 改为 CHAR (30)）
ALTER TABLE Course ADD UNIQUE(Cname); -- 增加课程名称必须取唯一值的约束条件
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除基本表&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DROP TABLE &amp;lt;表名&amp;gt;［RESTRICT| CASCADE］;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RESTRICT&lt;/strong&gt;：只有在该表没有被其他数据库对象依赖时，才能删除。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CASCADE&lt;/strong&gt;：删除该表的同时，还会删除依赖于该表的相关对象或依赖关系&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;视图 VIEW&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;视图的作用？
&amp;lt;br&amp;gt;简化复杂查询；
&amp;lt;br&amp;gt;为不同用户提供不同数据视图；
&amp;lt;br&amp;gt;隐藏敏感属性，提高安全性；
&amp;lt;br&amp;gt;阻止不符合条件的数据加入/修改成不符合条件的数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定义视图 AS&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;CREATE VIEW S_G(Sno,Gavg) -- 可选：列名
AS
 SELECT Sno,AVG(Grade)
 FROM SC
 GROUP BY Sno;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查询视图&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新视图&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除视图&lt;/strong&gt;  &lt;code&gt;DROP VIEW S_G [RESTRICT | CASCADE]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;字符串匹配&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;⭐字符匹配 &lt;strong&gt;LIKE&lt;/strong&gt;/&lt;strong&gt;=&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT* FROM Student WHERE Sno LIKE &apos;24%&apos;  -- 通配符，查询学号以24开头的学生的详细信息
SELECT* FROM Student WHERE Sno = &apos;24%&apos; -- 查询学号就是&apos;24%&apos;学生的详细信息
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;⭐字符串中的通配符&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE &apos;刘%&apos;;  -- 查询所有姓刘学生的姓名、学号和性别

SELECT Sname
FROM Student
WHERE Sname LIKE &apos;欧阳_&apos;; -- 查询姓&quot;欧阳&quot;且全名为三个汉字的学生的姓名

SELECT Sname, Sno
FROM Student
WHERE Sname LIKE &apos;_阳%&apos;; -- 查询名字中第2个字为&quot;阳&quot;字的学生的姓名和学号

SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname NOT LIKE &apos;刘%&apos;; -- 查询所有不姓刘的学生姓名、学号和性别
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多表连接 JOIN&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;SELECT DISTINCT s.sid, s.sname
FROM Student s
JOIN Enroll e ON s.sid = e.sid
JOIN Course c ON e.cid = c.cid
WHERE c.cname = &apos;数据管理基础&apos;
AND c.dept = &apos;智软学院&apos;;
&lt;/code&gt;&lt;/pre&gt;
使用 DISTINCT 是为了消除同一学生由于多条匹配记录产生的重复
&lt;ul&gt;
&lt;li&gt;DISTINCT 的位置：SELECT 子句；聚集函数内部。&lt;pre&gt;&lt;code&gt;SELECT DISTINCT dept
FROM Student;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;COUNT(DISTINCT sid)
AVG(DISTINCT score)
SUM(DISTINCT amount)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分组与 HAVING&lt;/strong&gt;先Group 分组后 HAVING
&amp;lt;div style=&quot;display: flex; width:50%; margin: -2px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/GroupHaving.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EXISTS&lt;/strong&gt;
子查询有结果，返回TRUE；子查询无结果，返回FALSE&lt;pre&gt;&lt;code&gt;SELECT Sname
FROM Student S
WHERE EXISTS (
    SELECT *
    FROM SC
    WHERE SC.Sno = S.Sno
    AND Cno = &apos;1&apos; -- 从 Student 表里，找出那些‘存在’选修 1 号课程记录的学生
); -- 查询选修了 1 号课程的学生

SELECT Sname
FROM Student S
WHERE NOT EXISTS (
    SELECT *
    FROM SC
    WHERE SC.Sno = S.Sno
    AND Cno = &apos;1&apos;
); -- 查询没选1号课程的学生
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查询选修全部课程的学生&lt;pre&gt;&lt;code&gt;SELECT Sname
FROM Student
WHERE NOT EXISTS ( -- ③ 除去没有选择课程的学生
    SELECT *
    FROM Course -- ② 有NOT EXISTS学生选择的课程中的：学生没有选择的课程
    WHERE NOT EXISTS (
        SELECT *
        FROM SC
        WHERE SC.Sno = Student.Sno  
        AND SC.Cno = Course.Cno -- ① 对SC中的每门课程，去Student、Course中寻找有无记录
    ) -- 学生选择的课程
);
✅ 理解：不存在一门课是这个学生没选的
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists1.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists2.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists3.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists4.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;⭐例题&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;所有课程都及格&lt;/strong&gt;：HAVING MIN(grade)&amp;gt;=60
&amp;lt;div style=&quot;display: flex; width:50%; gap: 1px;margin-top: -2px;margin-bottom: 20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qq2.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修完本院所有必修课&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width:50%; gap: 1px;margin-top: -2px;margin-bottom: 20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qq3.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;每组最大值
&amp;lt;div style=&quot;display: flex; width:50%; gap: 1px;margin-top: -2px;margin-bottom: 20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qq1.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只讲授本院课程&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;⭐C4 数据库编程&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;怎么使用&lt;/th&gt;
&lt;th&gt;主要场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;交互式 SQL&lt;/td&gt;
&lt;td&gt;用户直接输入 SQL&lt;/td&gt;
&lt;td&gt;临时查询、数据库管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;嵌入式 SQL&lt;/td&gt;
&lt;td&gt;主语言＋SQL&lt;/td&gt;
&lt;td&gt;SQL与C、C++结合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;过程化 SQL&lt;/td&gt;
&lt;td&gt;SQL＋变量、判断、循环&lt;/td&gt;
&lt;td&gt;存储过程、函数、触发器&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;嵌入式SQL&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;主变量&lt;/strong&gt;：能在SQL中使用的主语言变量
&lt;ul&gt;
&lt;li&gt;必须在&lt;strong&gt;声明区&lt;/strong&gt;声明&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;-- 声明区
EXEC SQL BEGIN DECLARE SECTION;
char givensno[10];
char hsname[21];
int hsage;
EXEC SQL END DECLARE SECTION;
-- 声明区
EXEC SQL select Sno, Cno, Grade 
    into :hsno, :hcno, :hgrade, :gradeid -- 指示变量
    from Student
    where Sno = :givensno ; -- 查找给定学号的学生的信息
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指示变量&lt;/strong&gt; gradeid：说明成绩是否&lt;strong&gt;为空&lt;/strong&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;取值&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;返回的是正常非空值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;大于 0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;字符串被截断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;-1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数据库值为 NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;用指示变量写入NULL：把成绩置为空&lt;pre&gt;&lt;code&gt;gradeIndicator = -1;

EXEC SQL UPDATE SC
SET Grade = :hgrade :gradeIndicator -- 实际写入的是 grade = NULL
WHERE Sno = :hsno
AND Cno = :hcno;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通信区 SQLCA&lt;/strong&gt;：记录每条SQL执行后的状态信息
&amp;lt;br&amp;gt;&lt;strong&gt;SQLCODE = 0&lt;/strong&gt;：执行&lt;strong&gt;成功&lt;/strong&gt;；
&amp;lt;br&amp;gt;非0：没有找到数据、警告或者错误。&lt;pre&gt;&lt;code&gt;if (SQLCA.SQLCODE != 0) {
    break;
} -- 前一条执行SQL语句，然后检查：若不为0 → 退出
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐游标 Cursor&lt;/h3&gt;
游标是系统为查询结果建立的 &lt;strong&gt;数据缓冲区&lt;/strong&gt; 和 &lt;strong&gt;当前位置指针&lt;/strong&gt;，用于存放SQL查询的&lt;strong&gt;执行结果&lt;/strong&gt;。解决SQL批量返回数据、主语言单条处理之间的矛盾
&lt;ul&gt;
&lt;li&gt;声明游标 &lt;code&gt;EXEC SQL DECLARE 游标名 CURSOR FOR 查询语句;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;打开游标 &lt;code&gt;EXEC SQL OPEN 游标名;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;提取数据 &lt;code&gt;EXEC SQL FETCH 游标名 INTO 主变量;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;关闭游标 &lt;code&gt;EXEC SQL CLOSE 游标名;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;例
依次检查某个系的学生记录，交互式更新某些学生年龄。&lt;pre&gt;&lt;code&gt;EXEC SQL BEGIN DECLARE SECTION; /*主变量声明开始*/
    char Deptname[21];
    char Hsno[10];
    char Hsname[21];
    char Hssex[3];
    int HSage;
    int NEWAGE;
EXEC SQL END DECLARE SECTION; /*主变量声明结束*/

long SQLCODE;
EXEC SQL INCLUDE SQLCA; /*定义SQL通信区*/

#include &amp;lt;sqlca.h&amp;gt;

int main(void) /*C语言主程序开始*/
{
    int count = 0;
    char yn; /*变量yn代表yes或no*/
    printf(&quot;Please choose the department name(CS/MA/IS): &quot;);
    scanf(&quot;%s&quot;,deptname); /*为主变量deptname赋值*/
    EXEC SQL CONNECT TO TEST@localhost:54321 USER &quot;SYSTEM&quot;/&quot;MANAGER&quot;; /*连接数据库TEST*/
    -- 我现在要登录连接到数据库，数据库地址是本机，端口是 54321，数据库名字叫 TEST，登录账号是 SYSTEM，密码是 MANAGER
    EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/
        SELECT Sno,Sname,Ssex,Sage /*游标SX对应的查询语句*/
        FROM Student
        WHERE SDept = :deptname;
    EXEC SQL OPEN SX;
/*打开游标SX，执行游标对应的查询，并指向查询结果的第一行*/

    for (;;) -- 循环读取游标里的每一条数据，直到游标读完 / 出错时退出
    {
        /* 推进游标，将当前数据放入主变量 */
        EXEC SQL FETCH SX INTO :Hsno, :Hsname, :Hssex, :HSage;
        if (sqlca.sqlcode != 0) { -- 操作不成功时退出
            break;
        }

        /* 是第一行的话，打印表头和学生信息 */
        if (count++ == 0) {
            printf(&quot;\n%-10s %-20s %-10s %-10s\n&quot;, &quot;Sno&quot;, &quot;Sname&quot;, &quot;Ssex&quot;, &quot;Sage&quot;);
        }

        /* 打印当前学生信息 */
        printf(&quot;%-10s %-20s %-10s %-10d\n&quot;, Hsno, Hsname, Hssex, HSage);

        /* 询问用户是否要更新该学生的年龄 */
        printf(&quot;UPDATE AGE(y/n)? &quot;);
        do {
            scanf(&quot;%c&quot;, &amp;amp;yn);
            -- getchar();  --吃掉多余的换行符
        } while (yn != &apos;N&apos; &amp;amp;&amp;amp; yn != &apos;n&apos; &amp;amp;&amp;amp; yn != &apos;Y&apos; &amp;amp;&amp;amp; yn != &apos;y&apos;);
        -- 强制让用户必须输入 Y/y/ N/n 才往下走，输错就一直重新输

        /* 如果选择更新操作 */
        if (yn == &apos;y&apos; || yn == &apos;Y&apos;) {
            printf(&quot;INPUT NEW AGE: &quot;);
            scanf(&quot;%d&quot;, &amp;amp;NEWAGE);
            getchar();

            /* 嵌入式SQL更新语句*/
            EXEC SQL UPDATE Student
                SET Sage = :NEWAGE  -- Sage更新为读入的NWEAGE
                WHERE CURRENT OF SX;
        } /* 对当前游标指向的学生年龄进行更新 */
    }

    /* 收尾 */
    EXEC SQL CLOSE SX; -- 关闭游标SX，不再和查询结果对应
    EXEC SQL COMMIT WORK; -- 提交更新
    EXEC SQL DISCONNECT TEST; -- 断开数据库连接
} -- 只在 EXEC SQL FETCH SX INTO 语句之后检查了状态码 SQLCA.SQLCODE
-- 在其他嵌入式SQL语句之后，都没有检查SQL语句的执行状态码！
-- Solution：添加异常处理👇
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;异常处理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;whenever&lt;/code&gt;是嵌入式SQL的全局异常捕获机制&lt;pre&gt;&lt;code&gt;EXEC SQL WHENEVER 条件 动作;
&lt;/code&gt;&lt;/pre&gt;
&lt;strong&gt;预编译器&lt;/strong&gt;在处理过程中，会根据WHENEVER语句的定义，在每一条&lt;strong&gt;嵌入式SQL语句&lt;/strong&gt;之后添加下面的异常状态检查命令： &lt;code&gt;if ( condition ) { action }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;常见执行异常
&amp;lt;br&amp;gt;&lt;strong&gt;SQLERROR&lt;/strong&gt;、&lt;strong&gt;NOT FOUND&lt;/strong&gt;、&lt;strong&gt;SQLWARNING&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;处理方法
&lt;strong&gt;CONTINUE&lt;/strong&gt;、&lt;strong&gt;GOTO label&lt;/strong&gt;、&lt;strong&gt;STOP&lt;/strong&gt;、&lt;strong&gt;DO function &lt;strong&gt;| &lt;strong&gt;BREAK&lt;/strong&gt; |&lt;/strong&gt; CONTINUE&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;例&lt;pre&gt;&lt;code&gt;exec sql whenever sqlerror goto report_error ; -- SQL执行错误
exec sql whenever not found goto notfound ; -- 查询/FETCH没有得到记录，用于结束游标循环
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- - &lt;strong&gt;全局变量 &amp;amp; 局部变量&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;VARIABLE fac NUMBER;

DECLARE
    NUM NUMBER(3) := 5;
BEGIN
    :fac := 1;

    IF NUM &amp;gt; 0 THEN
        FOR i IN 1..NUM LOOP
            :fac := :fac * i;
        END LOOP;
    END IF;
END;
``` --&amp;gt;
---
## 动态SQL
&amp;lt;!-- ```sql
-- 例1
EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = &quot;CREATE TABLE test(a int);&quot;;
EXEC SQL END DECLARE SECTION;

EXEC SQL EXECUTE IMMEDIATE :stmt;
-- 例2
const char *stmt = &quot;INSERT INTO test VALUES(?);&quot;;

EXEC SQL PREPARE mystmt FROM :stmt;

EXEC SQL EXECUTE mystmt USING 100;
EXEC SQL EXECUTE mystmt USING 200;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里 stmt 保存的不是普通数据，而是一整条 SQL 语句。 --&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;过程化SQL&lt;/h2&gt;
&lt;p&gt;&amp;lt;!-- 1. &lt;strong&gt;基本结构&lt;/strong&gt;
&lt;code&gt;sql     DECLARE         -- 变量、常量、游标、异常等定义     BEGIN         -- SQL语句/流程控制语句     EXCEPTION         -- 异常处理语句     END;     &lt;/code&gt;
2. &lt;strong&gt;变量&lt;/strong&gt;
&lt;code&gt;sql     sex BOOLEAN := TRUE; --Boolean类型的变量sex，赋值为true     today DATE NOT NULL := SYSDATE; -- Date类型的非空变量，赋值为系统Date     age NUMBER(3) NOT NULL := 25; -- 最多3位数字，不允许为空，赋值为25     &lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;常量&lt;/strong&gt;
常量一旦赋值，就不允许修改&lt;pre&gt;&lt;code&gt;pi CONSTANT NUMBER := 3.14
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据类型&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;%TYPE&lt;/strong&gt; 复制数据类型：方式修改数据类型之后 需要手动更改；降低类型不匹配的风险&lt;pre&gt;&lt;code&gt;DECLARE
    teacher_name CHAR(5);
    student_name teacher_name%TYPE; -- 自动采用 teacher_name 的类型
BEGIN
    ...
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%ROWTYPE&lt;/strong&gt; 变量结构与一整行相同&lt;pre&gt;&lt;code&gt;v_student Student%ROWTYPE; -- v_student中有student类型的id、name等
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;自定义记录类型 &lt;strong&gt;RECORD&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;DECLARE
    TYPE student IS RECORD (
        id        NUMBER(4) NOT NULL DEFAULT 0,
        name      CHAR(10),
        sex       BOOLEAN NOT NULL DEFAULT TRUE,
        birthdate DATE,
        physics   NUMBER(3),
        chemistry NUMBER(3)
    );

    student1 student; -- 使用自定义数据类型
BEGIN
    student.id := 1001; -- 访问赋值
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流程控制&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;if/else&lt;pre&gt;&lt;code&gt;IF 条件 THEN
    语句1;
ELSE
    语句2;
END IF;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;循环&lt;pre&gt;&lt;code&gt;LOOP
    循环体;
    EXIT WHEN 退出条件;
END LOOP;

i := 1;
WHILE i &amp;lt;= 5 LOOP
    DBMS_OUTPUT.PUT_LINE(i);
    i := i + 1;
END LOOP;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;FOR循环&lt;pre&gt;&lt;code&gt;FOR i IN 1..NUM LOOP -- for(i = 1; i &amp;lt;= NUM; i++)
    :fac := :fac * i;
END LOOP;
``` --&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;⭐触发器&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;**什么是触发器？**当某张表发生插入、删除或修改时，数据库自动执行一段事先写好的程序。
&amp;lt;br&amp;gt;学生成绩提高超过10%时，自动记录日志；
&amp;lt;br&amp;gt;插入教师信息时，如果教授工资低于4000，自动改成4000；
&amp;lt;br&amp;gt;删除数据时，自动备份被删除的数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;格式
只要修改就会触发，满足条件才执行后续操作&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TRIGGER 触发器名
BEFORE | AFTER
INSERT | UPDATE | DELETE(OR 其他操作)
ON 表名
FOR EACH ROW
BEGIN
    -- 触发后自动执行的语句
END;
……
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;例1：成绩提高10%时记录日志&lt;pre&gt;&lt;code&gt;CREATE TRIGGER SC_T -- 创建名为 SC_T 的触发器
AFTER UPDATE OF Grade ON SC -- SC 中的 Grade 修改完成后，触发该触发器
REFERENCING
    OLD ROW AS OldTuple,  -- 代表修改前的旧记录
    NEW ROW AS NewTuple   -- 代表修改后的新记录
FOR EACH ROW              -- 每修改一行执行一次
WHEN (NewTuple.Grade &amp;gt;= 1.1 * OldTuple.Grade) -- 新成绩比旧成绩至少提高10%，触发器才会执行下面的操作
INSERT INTO SC_U(Sno, Cno, OldGrade, NewGrade) 
VALUES(         -- 把下面信息插入日志表 SC_U
    OldTuple.Sno,
    OldTuple.Cno,
    OldTuple.Grade,
    NewTuple.Grade
);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例2：教授工资不能低于4000
&amp;lt;br&amp;gt;插入/修改教师信息时，如果该教师是教授，并且工资低于4000，就自动把工资改成4000。&lt;pre&gt;&lt;code&gt;CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
REFERENCING NEW ROW AS newTuple
FOR EACH ROW
BEGIN
    IF newTuple.Job = &apos;教授&apos;
    AND newTuple.Sal &amp;lt; 4000 THEN
        newTuple.Sal := 4000;
    END IF;
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;函数&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IS&lt;/strong&gt;：声明部分：接下来存放查询结果的 &lt;strong&gt;局部变量&lt;/strong&gt;、常量、游标等&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;例：计算总输入&lt;pre&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION totalsal -- 创建/替换一个名为totalsal的函数
(
    v_empno IN emp.empno%TYPE  -- 调用者输入
)
RETURN NUMBER  -- 函数最终返回一个 NUMBER 类型的数值
IS
    totalsal1 NUMBER;
BEGIN
    SELECT sal + comm
    INTO totalsal1    
    FROM emp
    WHERE empno = v_empno;
-- 把v_empno编号的员工的 sal工资+comm奖金，结果存入totalsal1
    RETURN totalsal1;
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;存储过程&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;image-113.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;AS&lt;/strong&gt; 声明部分：接下来存放查询结果的 &lt;strong&gt;局部变量&lt;/strong&gt;、常量、游标等&lt;pre&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE TRANSFER (
    inAccount  IN Account.AccountNum%TYPE, -- 转入账户：IN调用者传入
    outAccount IN Account.AccountNum%TYPE, -- 转出账户
    amount     IN NUMBER                   -- 转账金额
)
AS -- 内部局部变量
    /* 保存转出账户的余额 */
    totalDepositOut Account.Total%TYPE;

    /* 保存查询到的转入账户号 */
    inAccountNum Account.AccountNum%TYPE;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IN&lt;/strong&gt; 调用者传入&lt;pre&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE TRANSFER (
    inAccount  IN Account.AccountNum%TYPE, -- 转入账户：IN调用者传入
    outAccount IN Account.AccountNum%TYPE, -- 转出账户
    amount     IN NUMBER                   -- 转账金额
)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INTO&lt;/strong&gt; 查询并保存到局部变 → 异常处理&lt;pre&gt;&lt;code&gt;SELECT AccountNum
INTO inAccountNum
FROM Account
WHERE AccountNum = inAccount
FOR UPDATE;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;EXCEPTION
        /* SELECT INTO没有查询到账户 */
        WHEN NO_DATA_FOUND THEN
            ROLLBACK;

            RAISE_APPLICATION_ERROR(
                -20004,
                &apos;转入账户或转出账户不存在&apos;
            );

        /* 处理其他异常 */
        WHEN OTHERS THEN
            ROLLBACK;
            RAISE;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;例：转账存储过程&lt;pre&gt;&lt;code&gt;/*====================================================
1. 创建账户基本表
====================================================*/
CREATE TABLE Account (
    AccountNum VARCHAR2(11) PRIMARY KEY,  -- 账户号
    Total      NUMBER(15, 2) DEFAULT 0 NOT NULL, -- 账户余额

    CONSTRAINT CK_Account_Total
        CHECK (Total &amp;gt;= 0)
-- 创建名为 CK_Account_Total 的检查约束，要求：账户余额必须大于或等于0
);


/*====================================================
2. 插入测试数据
====================================================*/

/* 转入账户：初始余额20000元 */
INSERT INTO Account(AccountNum, Total)
VALUES (&apos;01003813828&apos;, 20000);

/* 转出账户：初始余额50000元 */
INSERT INTO Account(AccountNum, Total)
VALUES (&apos;01003815868&apos;, 50000);

COMMIT; -- 提交插入操作


/*====================================================
3. 查看转账前的账户余额
====================================================*/
SELECT AccountNum, Total
FROM Account
ORDER BY AccountNum;


/*====================================================
4. 创建转账存储过程
====================================================*/
CREATE OR REPLACE PROCEDURE TRANSFER (
    inAccount  IN Account.AccountNum%TYPE, -- 转入账户：IN调用者传入
    outAccount IN Account.AccountNum%TYPE, -- 转出账户
    amount     IN NUMBER                   -- 转账金额
)
AS -- 内部局部变量
    /* 保存转出账户的余额 */
    totalDepositOut Account.Total%TYPE;

    /* 保存查询到的转入账户号 */
    inAccountNum Account.AccountNum%TYPE;

BEGIN
    /*------------------------------------------
    1. 检查转账金额：小于0 不合法
    ------------------------------------------*/
    IF amount &amp;lt;= 0 THEN
        RAISE_APPLICATION_ERROR(
            -20001,
            &apos;转账金额必须大于0&apos;
        );
    END IF;

    /* 转入账户和转出账户不能相同 */
    IF inAccount = outAccount THEN
        RAISE_APPLICATION_ERROR(
            -20002,
            &apos;转入账户和转出账户不能相同&apos;
        );
    END IF;


    /*------------------------------------------
    2. 查询并锁定转出账户
    ------------------------------------------*/
    SELECT Total
    INTO totalDepositOut -- 查询并保存到局部变量totalDepositOut
    FROM Account
    WHERE AccountNum = outAccount
    FOR UPDATE; -- 加行级锁。防止转账过程中，其他事务同时修改该账户余额。
    -- 一直到COMMIT/ROLLBACK

    /*------------------------------------------
    3. 检查转出账户余额：小于转账金额 抛出ERROR
    ------------------------------------------*/
    IF totalDepositOut &amp;lt; amount THEN
        RAISE_APPLICATION_ERROR(
            -20003,
            &apos;转出账户余额不足&apos;
        );
    END IF;


    /*------------------------------------------
    4. 检查并锁定转入账户
    ------------------------------------------*/
    SELECT AccountNum
    INTO inAccountNum
    FROM Account
    WHERE AccountNum = inAccount
    FOR UPDATE;


    /*------------------------------------------
    5. 转出账户扣款
    ------------------------------------------*/
    UPDATE Account
    SET Total = Total - amount
    WHERE AccountNum = outAccount;


    /*------------------------------------------
    6. 转入账户加款
    ------------------------------------------*/
    UPDATE Account
    SET Total = Total + amount
    WHERE AccountNum = inAccount;


    /*------------------------------------------
    7. 提交转账事务
    ------------------------------------------*/
    COMMIT;


EXCEPTION
    /* SELECT INTO没有查询到账户 */
    WHEN NO_DATA_FOUND THEN
        ROLLBACK;

        RAISE_APPLICATION_ERROR(
            -20004,
            &apos;转入账户或转出账户不存在&apos;
        );

    /* 处理其他异常 */
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;

END TRANSFER;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;静态SQL vs 动态SQL&lt;/h2&gt;
&lt;hr /&gt;
&lt;h1&gt;C5 关系数据规范化理论&lt;/h1&gt;
&lt;h3&gt;⭐数据依赖：函数依赖&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;定义
&amp;lt;br&amp;gt;&lt;strong&gt;X确定唯一Y&lt;/strong&gt;，则称“X函数确定Y”或“Y函数依赖于X”，记作 $X \to Y$。
&lt;ul&gt;
&lt;li&gt;$X$：决定因素&lt;/li&gt;
&lt;li&gt;$Y$：依赖因素
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px; margin-bottom: -10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/FDli1.png&quot; alt=&quot;函数依赖例1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;1. 平凡/非平凡函数依赖&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;平凡函数依赖&lt;/strong&gt;：$X \to Y$ 且 $Y \subseteq X$（Sno&lt;strong&gt;本来就在左边&lt;/strong&gt;）
例：$(Sno,Cno) \to Sno$，$(Sno, Cno) → Cno$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非平凡函数依赖&lt;/strong&gt;：$X \to Y$ 且 $Y \nsubseteq X$
例：$(Sno,Cno) \to Grade$&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. 完全/部分函数依赖&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;完全函数依赖&lt;/strong&gt;：要决定Y，X的所有部分都要用上，如要确定一门课的成绩，需要同时知道&lt;strong&gt;学号+课程名&lt;/strong&gt;
&amp;lt;br&amp;gt;例：$(Sno,Cno) \stackrel{F}{\to} Grade$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部分函数依赖&lt;/strong&gt;：要决定Y，只需要X中的一部分属性就可以，如确定专业，只需知道&lt;strong&gt;Sno&lt;/strong&gt;就行，Cno是不必要的
&amp;lt;br&amp;gt;例：$(Sno,Cno) \stackrel{P}{\to} Sdept$&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. 传递函数依赖&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;定义：若 $X \to Y$，$Y \nrightarrow X$，$Y \to Z$（$Y \nsubseteq X$ $Z \nsubseteq Y$），则 $X \stackrel{\text{传递}}{\to} Z$&lt;/li&gt;
&lt;li&gt;例：$Sno \to Sdept$，$Sdept \to Mname$ $\Rightarrow$ $Sno \stackrel{\text{传递}}{\to} Mname$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据依赖：多值依赖&lt;/h3&gt;
&lt;hr /&gt;
&lt;h3&gt;范式 &amp;amp; 规范化&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;范式（NF）&lt;/strong&gt;：是对一个关系中允许存在的&lt;strong&gt;数据依赖&lt;/strong&gt;的要求
&amp;lt;br&amp;gt;&lt;strong&gt;规范化&lt;/strong&gt;：通过投影分解将低范式转换为高范式。&lt;/li&gt;
&lt;li&gt;范式等级（从低到高包含关系）：
$$1NF \supset 2NF \supset 3NF \supset BCNF \supset 4NF \supset 5NF$$&lt;/li&gt;
&lt;li&gt;规范化：将&lt;strong&gt;低范式&lt;/strong&gt;通过&lt;strong&gt;模式分解&lt;/strong&gt;转为&lt;strong&gt;高范式&lt;/strong&gt;，消除不良数据依赖
&amp;lt;br&amp;gt;范式越高，对表中数据依赖的要求越严格。&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;范式&lt;/th&gt;
&lt;th&gt;主要解决的问题&lt;/th&gt;
&lt;th&gt;一句话理解&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1NF&lt;/td&gt;
&lt;td&gt;属性不可再分&lt;/td&gt;
&lt;td&gt;每个格子只能放一个值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2NF&lt;/td&gt;
&lt;td&gt;部分函数依赖&lt;/td&gt;
&lt;td&gt;非主属性&lt;strong&gt;不能&lt;/strong&gt;由主属性&lt;strong&gt;部分函数依赖&lt;/strong&gt;推出，必须完全依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3NF&lt;/td&gt;
&lt;td&gt;传递函数依赖&lt;/td&gt;
&lt;td&gt;不存在&lt;strong&gt;非主属性&lt;/strong&gt;对&lt;strong&gt;候选码&lt;/strong&gt;的传递函数依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BCNF&lt;/td&gt;
&lt;td&gt;决定因素不是码&lt;/td&gt;
&lt;td&gt;所有非平凡函数依赖中的决定因素（&lt;strong&gt;左边&lt;/strong&gt;），都必须是包含&lt;strong&gt;候选码&lt;/strong&gt; （是超码）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4NF&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;每个非平凡多值依赖 X →→ Y 都满足 &lt;strong&gt;X含有码&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;1NF：属性原子性；2NF：不存在主属性&lt;strong&gt;部分函数依赖&lt;/strong&gt;非主属性；
&amp;lt;br&amp;gt;3NF：不存在 &lt;strong&gt;非主属性&lt;/strong&gt; 对 &lt;strong&gt;候选码&lt;/strong&gt;的传递依赖；BCNF：左边都是 &lt;strong&gt;超码&lt;/strong&gt;
&amp;lt;br&amp;gt;部分主 → 非主；非主 $\xRightarrow{传递}$ 候选码；超码 →&lt;/p&gt;
&lt;h3&gt;二、1NF（第一范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;定义&lt;/h4&gt;
关系模式的所有属性均为 &lt;strong&gt;不可再分的原子数据项&lt;/strong&gt;，是关系数据库的最低要求。&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;实例&lt;/h4&gt;
关系模式 &lt;code&gt;SLC(Sno, Sdept, Sloc, Cno, Grade)&lt;/code&gt; 中，所有属性均为原子属性，满足 1NF。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;三、2NF（第二范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;
&amp;lt;br&amp;gt;非主属性&lt;strong&gt;不能&lt;/strong&gt;由候选码&lt;strong&gt;部分函数依赖&lt;/strong&gt;推出，必须完全依赖。
&lt;ul&gt;
&lt;li&gt;如：AF 是候选码，D 是非主属性。
&amp;lt;br&amp;gt;若A → D，说明非主属性 D对候选码部份依赖 $\Rightarrow$ 不满足2NF&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实例&lt;/strong&gt;：SLC 关系
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin: -20px; top&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/2NF1.png&quot; alt=&quot;函数依赖集1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solution&lt;/strong&gt;
&amp;lt;br&amp;gt;分解成2个关系模式（但插入异常、删除异常任然存在）
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -20px; top&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/2NF2.png&quot; alt=&quot;函数依赖集1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;四、3NF（第三范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;
&amp;lt;br&amp;gt;不存在&lt;strong&gt;非主属性&lt;/strong&gt;对&lt;strong&gt;候选码&lt;/strong&gt;的&lt;strong&gt;传递函数依赖&lt;/strong&gt;
&amp;lt;br&amp;gt;&lt;strong&gt;码&lt;/strong&gt; ~不能~和 &lt;strong&gt;非主属性&lt;/strong&gt; 有&lt;strong&gt;传递依赖&lt;/strong&gt;关系
&amp;lt;br&amp;gt;不存在码X、属性Y、非主属性Z使得 $X→Y，Y→Z$ 成立 $\Rightarrow Y \nrightarrow X$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;实例&lt;/strong&gt;：SL 关系（Sno是码）
&lt;img src=&quot;image-41.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;五、BCNF（巴斯范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;
&amp;lt;br&amp;gt;所有非平凡函数依赖中的决定因素（&lt;strong&gt;左边&lt;/strong&gt;），都必须是包含&lt;strong&gt;候选码&lt;/strong&gt;（都必须是&lt;strong&gt;超码&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实例 1：仓库管理关系&lt;/strong&gt;：把违反的（管理员，仓库名）单独成表
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -20px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/BCNF.png&quot; alt=&quot;BCNF1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 4; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/BCNF2.png&quot; alt=&quot;BCNF1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4NF（第四范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;
&amp;lt;br&amp;gt;每个非平凡多值依赖 X →→ Y 都满足 &lt;strong&gt;X含有码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分解&lt;/strong&gt;
&amp;lt;br&amp;gt;把独立的多值事实拆开&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;⭐Armstrong公理系统&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;Armstrong公理系统 - 基本规则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;A1 自反律&lt;/strong&gt;&amp;lt;/u&amp;gt;：知道一组属性，一定知道&lt;strong&gt;部分&lt;/strong&gt;
&amp;lt;br&amp;gt;   {Cno, Sname} → Cno&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;A2 增广律&lt;/strong&gt;&amp;lt;/u&amp;gt;：若 $X \rightarrow Y$，则 $XZ \rightarrow YZ$
&amp;lt;br&amp;gt;   Cno → Sname $\Rightarrow$ {Cno, clsno} → {Sname, clsno}&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;A3 传递律&lt;/strong&gt;&amp;lt;/u&amp;gt;：若 $X\rightarrow Y$ 且 $Y\rightarrow Z$，则 $X\rightarrow Z$
&amp;lt;br&amp;gt;   Cno → Class、Class → Teacher $\Rightarrow$ Cno → Teacher&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;Armstrong公理系统 -扩充规则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;合并规则&lt;/strong&gt;&amp;lt;/u&amp;gt;：若 X $\to$ Y 且 X $\to$ Z，则 X → YZ&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;分解规则&lt;/strong&gt;&amp;lt;/u&amp;gt;：若：X → YZ，则：X → Y，X → Z&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;伪传递规则&lt;/strong&gt;&amp;lt;/u&amp;gt;：若 X $\to $Y 且 WY $\to$ Z，则 XW $\to$ Z&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;引理：$X \to A_1A_2\cdots A_k \Rightarrow   X \to A_i( i=1,2,\dots,k)$ 成立
&amp;lt;br&amp;gt;学号 → (姓名, 班级, 专业) $\Rightarrow$ 学号 → 姓名，学号 → 班级，学号 → 专业&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;函数依赖的逻辑蕴涵&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;F 的所有规则，必然导致 X→Y 成立（X Y是属性/属性集）。是由F带来的，没有写出但必然成立的规则。
&amp;lt;br&amp;gt;则称：F &lt;strong&gt;逻辑蕴涵&lt;/strong&gt; X → Y，记作 &lt;strong&gt;F ⊨ X → Y&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;例：F = {学号 → 系名, 系名 → 系主任 }，则：F ⊨ 学号 → 系主任&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;函数依赖集的覆盖 &amp;amp; 等价&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心概念
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;覆盖&lt;/strong&gt;：若 F 能推出 G 里的所有依赖 ($G\subseteq F^+$) ，就说 F覆盖G&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;等价&lt;/strong&gt;：若 F覆盖G 且 G覆盖F（$F^+ = G^+$），就说 F和G等价（充要关系）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;例
&amp;lt;br&amp;gt;设：F = { A → B, A → C }，设：G = { A → BC }
&amp;lt;br&amp;gt;$\Rightarrow$ F 和 G 等价。
&amp;lt;br&amp;gt;因为：由 F 可用合并规则推出 A → BC；由 G 可用分解规则推出 A → B 和 A → C
&amp;lt;br&amp;gt;所以：F⁺ = G⁺（“分开写”和“合起来写”本质上表达的是同一件事）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;函数依赖集&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;函数依赖&lt;/strong&gt;：A→B 从A出发能确定唯一B。即&lt;strong&gt;一对一/多对一&lt;/strong&gt;（不能出现多对一/多对多）
&amp;lt;br&amp;gt;  A→B 多对一/AC→D 一对一；但是A→B 多对一/A→C 多对多
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px; top&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/hanshuylj1.png&quot; alt=&quot;函数依赖集1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/hanshuylj2.png&quot; alt=&quot;函数依赖集2&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;3.1 函数依赖集的闭包 F^+&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;定义：$F^+ = { X \to Y \mid F \vDash X \to Y }$，即：所有被 F 逻辑蕴涵的&lt;strong&gt;函数依赖的集合&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;属性集 U={A,B,C}，函数依赖集 F={A→B, B→C} → $F^+$ ={ A→A, A→B, A→C, A→BC, A→AB, A→AC, A→ABC,
B→B, B→C, B→BC,
C→C,
AB→A, AB→B, AB→C, AB→AB, AB→AC, AB→BC, AB→ABC,
AC→A, AC→B, AC→C, AC→AB, AC→AC, AC→BC, AC→ABC,
BC→B, BC→C, BC→BC,
ABC→A, ABC→B, ABC→C, ABC→AB, ABC→AC, ABC→BC, ABC→ABC }&lt;/li&gt;
&lt;li&gt;直接计算 F⁺ 很麻烦。因为可能推出非常多的函数依赖。所以实际做题时，
&amp;lt;br&amp;gt;一般不直接求 F⁺，而是用 &lt;strong&gt;属性集闭包&lt;/strong&gt; X⁺ 👇来判断某个依赖是否成立。
​&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;3.2 属性集的闭包 $A_F^+$&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;根据 F，属性集 A 最终能够确定哪些&lt;strong&gt;属性&lt;/strong&gt;，$A_F^+$称为属性A关于函数依赖集F的闭包。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⭐例：计算A关于F的闭包 $A_F^+$（迭代算法）
&amp;lt;br&amp;gt;初始：$A_F^+ = {A}$   用 A→B：$A_F^+ = {A,B}$   用 B→C：$A_F^+ = {A,B,C}$
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-62.png&quot; alt=&quot;属性集的闭包&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⭐例：求候选码
若A能推导出所有属性 → A是候选码&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;3.3 极小函数依赖集 / 最小依赖集 / 最小覆盖：F的最简形式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;需满足 3 个条件：&lt;/h4&gt;
设 F 为函数依赖集，$F_m$ 是其极小依赖集，需满足：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;右边只有一个属性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;左边没有多余属性&lt;/strong&gt;
&amp;lt;br&amp;gt;AB → C，如果：A⁺ 中已经包含 C说明只用 A 就能推出 C，B 是多余的。
&amp;lt;br&amp;gt;于是：AB → C可以简化为：A → C&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有冗余函数依赖&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;计算算法&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;右部拆分&lt;/strong&gt;：AD → EF 拆成：AD → E，AD → F；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删左边多余属性&lt;/strong&gt;：对于 ADF→ C：∵AD → F ，故可简化为 AD → C；
&amp;lt;br&amp;gt;对于 ADF → D：∵D已经包含在左边 $\rightarrow$ 可以删除该平凡函数依赖；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删冗余依赖&lt;/strong&gt;：对于C → B，可以由C → F，F → B推出。 &lt;strong&gt;删除&lt;/strong&gt; C → B；&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;特性：每个函数依赖集都等价于一个极小依赖集，且&lt;strong&gt;不唯一&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;🌟例题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3&gt;⭐例1：属性集闭包算法 -计算A关于F的闭包 $A_F^+$&lt;/h3&gt;
&amp;lt;br&amp;gt;初始：$A_F^+ = {A}$   用 A→B：$A_F^+ = {A,B}$   用 B→C：$A_F^+ = {A,B,C}$
&lt;ul&gt;
&lt;li&gt;计算方法：迭代算法
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -30px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-62.png&quot; alt=&quot;属性集的闭包&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐例：等价/最小函数依赖集 -属性集闭包算法&lt;/h3&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image44.png&quot; alt=&quot;属性集的闭包&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐例2：极小函数依赖集算法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;右部拆分&lt;/strong&gt;：AD → EF 拆成：AD → E，AD → F；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删左边多余属性&lt;/strong&gt;：对于 ADF→ C：∵AD → F ，故可简化为 AD → C；
&amp;lt;br&amp;gt;对于 ADF → D：∵D已经包含在左边 $\rightarrow$ 可以删除该平凡函数依赖；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删冗余依赖&lt;/strong&gt;：对于C → B，可以由C → F，F → B推出。 &lt;strong&gt;删除&lt;/strong&gt; C → B；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐（补充3）例：判断冗余依赖&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;函数依赖集 M = {C → E，E → B，BCD → A}，断言：&lt;strong&gt;BCD → A&lt;/strong&gt; 可以简化成 &lt;strong&gt;CD → A&lt;/strong&gt;，它是一个冗余函数依赖
&amp;lt;br&amp;gt;构造 N = {C → E，E → B，CD → A}，只需证明：$M^+ = N^+$（M能推出的=N能推出的）
&amp;lt;br&amp;gt;✅只需证明：M ⊨ CD → A？ N ⊨ BCD → A？&lt;/p&gt;
&lt;p&gt;① 证明：M ⊨ CD → A
&amp;lt;br&amp;gt;只需证明 ${C，D}_M^+$ 中包含 A，就能证明 CD → A
&amp;lt;br&amp;gt;初始值：{CD}_M^+ = {C，D}
&amp;lt;br&amp;gt;第一遍：{CD}_M^+ = {C，D，E}（C → E）
&amp;lt;br&amp;gt;第二遍：{CD}_M^+ = {B，C，D，E}（E → B）
&amp;lt;br&amp;gt;第三遍：{CD}_M^+ = {A，B，C，D，E}（BCD → A）&lt;/p&gt;
&lt;p&gt;② 同理得证：N ⊨ BCD → A&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;函数依赖集 M = {B → D，D → E，C → F，BC → A，EF → A}，断言：BC→ A 是一个冗余的函数依赖
&amp;lt;br&amp;gt;构造 N = {B → D，D → E，C → F，EF → A}，要证明 $M^+ = N^+$，&amp;lt;br&amp;gt;只需证明：N ⊨ BC → A，即：${BC}_N^+$ 包含A&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;函数依赖集 F = {A → B，B → A，AB → C}，判断 AB → C 是否为部分函数依赖？
&amp;lt;br&amp;gt;只需假设把AB → C 换成 A → C/B → C是否依然成立。同上。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐例3：计算候选码&lt;/h3&gt;
要求候选码K，只需找到能推出全部属性U的 $K_R^+=U$ 即可。
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;没有出现在右边&lt;/strong&gt;的属性 → 一定在&lt;strong&gt;候选码&lt;/strong&gt;内（因为没有属性能推出它）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只出现在右边&lt;/strong&gt;的属性 → 一般&lt;strong&gt;不&lt;/strong&gt;放在候选码（因为可以由其他属性推出）&lt;/li&gt;
&lt;li&gt;其他属性待选跟1结合&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;先算1必须出现在候选码中的属性K，是否有 $K_R^+ = U$&lt;/li&gt;
&lt;li&gt;再依次跟3中属性结合。候选码可能不止1个。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;⭐模式分解&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;模式分解的三个理解&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;无损连接&lt;/strong&gt;：自然连接后完全等于原表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保持函数依赖&lt;/strong&gt;：分解后所有依赖规则都能找到&lt;/li&gt;
&lt;li&gt;既 &lt;strong&gt;无损连接&lt;/strong&gt; 又 &lt;strong&gt;保持函数依赖&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐无损连接&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;有损连接：会产生多余元组。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定义：R = R1 ⋈ R2 ⋈ ... ⋈ Rn，能 &lt;strong&gt;自然连接&lt;/strong&gt;$\bowtie$ 回来，完全等于&lt;strong&gt;原表&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;💫判定：两张表的&amp;lt;u&amp;gt;&lt;em&gt;公共属性&lt;/em&gt;&amp;lt;/u&amp;gt;，如果能推出某一张表的&amp;lt;u&amp;gt;&lt;em&gt;非公共属性&lt;/em&gt;&amp;lt;/u&amp;gt;，就是无损连接。
&amp;lt;br&amp;gt;例如1：设有一个关系模式T(A,B,C)，函数依赖集F， 请判断下述的
分解$ρ={T_1,T_2}$是否具有无损连接性？A是公共属性，能推出T1的非公共属性B。故满足无损连接性&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数依赖集&lt;/th&gt;
&lt;th&gt;分解ρ&lt;/th&gt;
&lt;th&gt;是否满足无损连接性？&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;{A→B}&lt;/td&gt;
&lt;td&gt;$T_1(A,B) T_2(A,C)$&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;A是公共属性，能推出B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{A→C，B→C}&lt;/td&gt;
&lt;td&gt;$T_1(A,B) T_2(A,C)$&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;A是公共属性，能推出C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{A→B}&lt;/td&gt;
&lt;td&gt;$T_1(A,B) T_2(B,C)$&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;B是公共属性，不能推出非公共属性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{A→B，B→C}&lt;/td&gt;
&lt;td&gt;$T_1(A,C) T_2(B,C)$}&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;C是公共属性，不能推出非公共属性&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐保持函数依赖&lt;/h3&gt;
&lt;p&gt;分解后，&lt;strong&gt;原来&lt;/strong&gt;的函数依赖能在&lt;strong&gt;子关系&lt;/strong&gt;中&lt;strong&gt;直接检查&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;🌟3NF模式分解&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;目标：得到 满足3NF 且 既有无损连接性又保持函数依赖 的分解&lt;/li&gt;
&lt;li&gt;步骤：&amp;lt;u&amp;gt;每条依赖建一张表，最后检查有没有候选码，没有就补上&amp;lt;/u&amp;gt;
&lt;ol&gt;
&lt;li&gt;求 F 的&lt;strong&gt;极小函数依赖集 Fmin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;求&lt;strong&gt;候选码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;谁决定谁，就把它们放在一张表里。
&amp;lt;br&amp;gt;例如：Sno → Sdept就建：SD(Sno, Sdept)&lt;/li&gt;
&lt;li&gt;合并左边相同的&lt;/li&gt;
&lt;li&gt;💫检查是否需要补&lt;strong&gt;候选码表&lt;/strong&gt;：如果没有任何子关系包含原关系的&lt;strong&gt;候选码&lt;/strong&gt; K，则补一个关系 R(K)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;💫&lt;strong&gt;例&lt;/strong&gt;：到3NF的模式分解示例
&lt;img src=&quot;image-44.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🌟BCNF 模式分解&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;目标：分解到 BCNF，并且保证无损连接。&lt;/li&gt;
&lt;li&gt;步骤：
&lt;ol&gt;
&lt;li&gt;初始 ρ = {R}&lt;/li&gt;
&lt;li&gt;检查每个关系是否满足 BCNF&lt;/li&gt;
&lt;li&gt;如果某个关系不满足 BCNF，则存在：X → Y，且 X 不是超码&lt;/li&gt;
&lt;li&gt;分解为：&lt;strong&gt;R₁ = (X,Y)&lt;/strong&gt;，&lt;strong&gt;R₂ = (U - (Y-X))&lt;/strong&gt;
&amp;lt;br&amp;gt;例：U={A,B,C,D,E},X={A,B} Y={B,C}
&amp;lt;br&amp;gt; → Y-X={B,C}-{A,B}={C}减去公共属性
&amp;lt;br&amp;gt; → $R_2$ = U-(Y-X) = {A,B,D,E},$R1$={A,B,C}&lt;/li&gt;
&lt;li&gt;继续检查，直到全部满足 BCNF&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;💫例：转换为BCNF的无损连接分解
&amp;lt;br&amp;gt;STJ(S学生,T老师,J课程)，依赖包括：T → J，(S,J) → T，(S,T) → J，候选码为ST、SJ
&amp;lt;br&amp;gt;STJ 满足 3NF，但不满足 BCNF。&lt;/p&gt;
&lt;p&gt;原因：T → J 中，T 不是超码。&lt;/p&gt;
&lt;p&gt;所以分解为：TJ(T,J) ST(S,T)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;多值依赖&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;定义：一个属性决定的不是一个值，而是&lt;strong&gt;一组值&lt;/strong&gt;。记作 &lt;strong&gt;X →→ Y&lt;/strong&gt;，读作Y多值依赖于X（有其他属性Z，Y、Z都多值依赖于X的充要条件是 X、Y可以自由组合）&lt;/li&gt;
&lt;li&gt;多值依赖 vs 函数依赖
&lt;ol&gt;
&lt;li&gt;跟&lt;strong&gt;Z&lt;/strong&gt;的关系
&amp;lt;br&amp;gt;函数依赖：只问“X 能不能唯一确定 Y”。
&amp;lt;br&amp;gt;多值依赖：还要问“Y 和剩下的属性是不是独立”。&lt;/li&gt;
&lt;li&gt;跟&lt;strong&gt;子集&lt;/strong&gt;的关系
&amp;lt;br&amp;gt;A → BC，则：A → B A → C
&amp;lt;br&amp;gt;多值依赖不一定成立&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;⭐C6 数据库的安全性&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;授权：授予GRANT 与 回收REVOKE
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;授予 GRANT&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;GRANT SELECT,INSERT
ON Student
TO U1 -- 把对Student的查询、插入权限授予用户U1

GRANT ALL PRIVILIGES
ON TABLE Student,Course
TO U2,U3 -- 把对Student表和Course表的全部权限授予用户U2和U3
&lt;/code&gt;&lt;/pre&gt;
&lt;strong&gt;转授 WITH GRANT OPTION&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;GRANT SELECT
ON Student
TO user2
WITH GRANT OPTION;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回收 REVOKE&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;REVOKE UPDATE(Sno) ON STUDENT FROM U4 -- 把用户U4修改学生学号的权限收回
REVOKE SELECT ON SC FROM PUBLIC -- 收回所有用户对表SC的查询权限
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;⭐C7 数据库设计&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据库设计基本步骤&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width: 70%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/DBDP.png&quot; alt=&quot;数据库的设计&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工作&lt;/th&gt;
&lt;th&gt;所属阶段&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;收集业务需求、数据流&lt;/td&gt;
&lt;td&gt;需求分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;画 ER/EER 图&lt;/td&gt;
&lt;td&gt;概念结构设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ER 转关系模式、规范化&lt;/td&gt;
&lt;td&gt;逻辑结构设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;设计索引、文件组织、聚簇&lt;/td&gt;
&lt;td&gt;物理结构设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建表、装载数据、编程&lt;/td&gt;
&lt;td&gt;数据库实施&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;⭐C8 ER/EER模型&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;父子关系-ISA联系&lt;/strong&gt;：不相交 &amp;amp; 完全特化（超类&amp;amp;子类）
&amp;lt;br&amp;gt;&lt;strong&gt;不相交约束 x&lt;/strong&gt;：不能是多个
&amp;lt;br&amp;gt;&lt;strong&gt;完全特化 ||&lt;/strong&gt;：必须是一个
&lt;img src=&quot;image-61.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;img src=&quot;image-62.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Part-of联系&lt;/strong&gt; 双菱形
&lt;img src=&quot;image-76.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;弱实体&lt;/strong&gt;：双矩形。自己的属性不一定能独立区分自己（有不同贷款但可能在同一天还款、金额也可能一样）（不同职工可能都有叫“张伟”的家属；因此仅用“家属姓名”不能唯一确定家属）
&lt;img src=&quot;image-87.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基数约束&lt;/strong&gt;表示：min（强制参与/非强制参与）..max（单值参与/多值参与）
&amp;lt;br&amp;gt;&lt;strong&gt;左边基数&lt;/strong&gt;：一个左边，对应多少个右边&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为什么引入：&lt;strong&gt;消除歧义&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;组合属性&lt;/strong&gt; / &lt;strong&gt;多值属性&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width: 120%; margin-left: 0; margin-top: -20px;margin-bottom: -10px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/zuheshux.png&quot; alt=&quot;组合属性的子属性表示&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/duozhishux1.png&quot; alt=&quot;多值属性的双线桥表示&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/duozhishux2.png&quot; alt=&quot;多值属性的基数约束表示&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;C9 数据库恢复技术&lt;/h1&gt;
&lt;h2&gt;事务 &amp;amp; ACID特性&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;什么是事务？&lt;/strong&gt;：原子操作，事务是一个不可分割的数据库操作序列：&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACID四个特性&lt;/strong&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;th&gt;例子&lt;/th&gt;
&lt;th&gt;主要由什么保证&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Atomicity 原子性&lt;/td&gt;
&lt;td&gt;要么全做，要么全不做&lt;/td&gt;
&lt;td&gt;扣款和加款必须一起完成&lt;/td&gt;
&lt;td&gt;UNDO、ROLLBACK、日志&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consistency 一致性&lt;/td&gt;
&lt;td&gt;从一个一致状态变为另一个一致状态&lt;/td&gt;
&lt;td&gt;转账前后总金额不变&lt;/td&gt;
&lt;td&gt;正确事务程序、完整性约束、并发与恢复机制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolation 隔离性&lt;/td&gt;
&lt;td&gt;并发事务之间互不干扰&lt;/td&gt;
&lt;td&gt;别人不能看到只扣款、未加款的中间状态&lt;/td&gt;
&lt;td&gt;第11章并发控制、封锁&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Durability 持久性&lt;/td&gt;
&lt;td&gt;提交后的结果不会因故障丢失&lt;/td&gt;
&lt;td&gt;转账提交后，断电也不能丢失&lt;/td&gt;
&lt;td&gt;REDO、日志、转储&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;COMMIT、ROLLBACK &amp;amp; 保存点 SAVEPOINT&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;image-115.png&quot; alt=&quot;alt text&quot; /&gt;
3. SQVEPOINT
&lt;code&gt;sql     操作1     操作2     SAVEPOINT sp1 -- 定义     操作3     操作4     ROLLBACK TO sp1 -- 操作3、操作4撤销；     &lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;三类故障及恢复方法&lt;/h2&gt;
&lt;p&gt;这是判断UNDO、REDO的基础。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;故障类型&lt;/th&gt;
&lt;th&gt;是否破坏磁盘数据库&lt;/th&gt;
&lt;th&gt;典型原因&lt;/th&gt;
&lt;th&gt;恢复方法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;事务故障&lt;/strong&gt;：程序错误&lt;/td&gt;
&lt;td&gt;通常不破坏数据库文件&lt;/td&gt;
&lt;td&gt;溢出、死锁、违反完整性约束&lt;/td&gt;
&lt;td&gt;UNDO该事务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;系统故障&lt;/strong&gt;：外界错误CPU/OS/DBMS/停电&lt;/td&gt;
&lt;td&gt;不破坏磁盘文件，但内存丢失&lt;/td&gt;
&lt;td&gt;断电、操作系统崩溃、DBMS崩溃&lt;/td&gt;
&lt;td&gt;UNDO未提交，REDO已提交&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;介质故障&lt;/strong&gt;：磁盘损坏/强磁场造成外存数据丢失&lt;/td&gt;
&lt;td&gt;破坏数据库文件&lt;/td&gt;
&lt;td&gt;磁盘损坏、磁头碰撞&lt;/td&gt;
&lt;td&gt;重装副本，再REDO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;病毒等人为故障&lt;/td&gt;
&lt;td&gt;可能破坏数据或文件&lt;/td&gt;
&lt;td&gt;恶意修改、删除&lt;/td&gt;
&lt;td&gt;管理员：后备副本＋日志REDO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;数据转储&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;静态转储 &amp;amp; 动态转储&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;海量存储 &amp;amp; 增量存储&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;⭐日志文件&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;**什么是日志文件？**日志文件记录事务对数据库的更新操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UNDO前像 &amp;amp; REDO后像&lt;/strong&gt;&lt;pre&gt;&lt;code&gt; &amp;lt;START T1&amp;gt;
 &amp;lt;T1, A, 100, 80&amp;gt;-- 账户 A 原来余额为100元，事务T1要扣除20元→修改为80元
 &amp;lt;COMMIT T1&amp;gt;     -- 事务T1已经成功完成，修改结果应当永久保存

 &amp;lt;START T2&amp;gt;
 &amp;lt;T2, B, 50, 70&amp;gt;
 &amp;lt;ROLLBACK T2&amp;gt;   -- T2放弃事务，撤销自己的全部修改。回滚回前像B=50
 &amp;lt;CHECKPOINT ...&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;T1没有提交，系统故障
&amp;lt;br&amp;gt;没有COMMIT，T1尚未完成 → UNDO T1使用前像，把A恢复成100&lt;/li&gt;
&lt;li&gt;T1已经提交，系统故障
&amp;lt;br&amp;gt;CONNIT已经提交，但80还没写入磁盘 → REDO T1使用后像，A写入80&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>tmp</title><link>https://lilyly9.github.io/posts/btmp/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/btmp/</guid><description>一些临时记录</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><content:encoded/></item><item><title>计算机网络</title><link>https://lilyly9.github.io/posts/%E8%AE%A1%E7%BD%91/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/%E8%AE%A1%E7%BD%91/</guid><description>全英PPT看不懂😿。计算机网络网课相关笔记，持续更新ing…</description><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#u4-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82&quot;&gt;U4 数据链路层&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-%E5%8F%AF%E9%9D%A0%E4%BC%A0%E8%BE%93%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6-%E4%B8%8E-%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3&quot;&gt;⭐1. 可靠传输/流量控制 与 滑动窗口&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#11%E5%81%9C%E6%AD%A2%E7%AD%89%E5%BE%85%E5%8D%8F%E8%AE%AE-s-w&quot;&gt;⭐1.1停止等待协议 S-W&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-%E5%90%8E%E9%80%80n%E5%B8%A7%E5%8D%8F%E8%AE%AE-gbn--%E7%B4%AF%E7%A7%AF%E7%A1%AE%E8%AE%A4&quot;&gt;⭐1.2 后退N帧协议 GBN -累积确认&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13-%E9%80%89%E6%8B%A9%E9%87%8D%E4%BC%A0%E5%8D%8F%E8%AE%AE-sr--%E5%B7%AE%E9%94%99%E5%B8%A7%E8%BF%94%E5%9B%9Enck&quot;&gt;⭐1.3 选择重传协议 SR -差错帧返回“NCK”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#14-%E5%AF%B9%E4%BA%8E%E5%8F%AF%E9%9D%A0%E4%BC%A0%E8%BE%93%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E6%9C%BA%E5%88%B6%E7%9A%84%E4%BF%A1%E9%81%93%E5%88%A9%E7%94%A8%E7%8E%87%E5%88%86%E6%9E%90&quot;&gt;1.4 对于可靠传输/流量控制机制的信道利用率分析&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2%E4%BB%8B%E8%B4%A8%E5%A4%9A%E8%B7%AF%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6&quot;&gt;⭐2.介质/多路访问控制&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#21-%E4%BF%A1%E9%81%93%E5%88%92%E5%88%86&quot;&gt;2.1 信道划分&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%9A%8F%E6%9C%BA%E8%AE%BF%E9%97%AE&quot;&gt;随机访问&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%BD%AE%E8%AF%A2%E8%AE%BF%E9%97%AE&quot;&gt;轮询访问&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BB%A5%E5%A4%AA%E7%BD%91%E4%BA%A4%E6%8D%A2%E6%9C%BA&quot;&gt;以太网交换机&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#u5-%E7%BD%91%E7%BB%9C%E5%B1%82&quot;&gt;U5 网络层&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%BD%91%E7%BB%9C%E5%B1%82%E5%8A%9F%E8%83%BD&quot;&gt;网络层功能&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ipv4&quot;&gt;IPv4&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#ip%E6%95%B0%E6%8D%AE%E6%8A%A5%E5%88%86%E7%BB%84-%E7%9A%84%E6%9E%84%E6%88%90&quot;&gt;IP数据报/分组 的构成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%88%86%E7%89%87%E9%97%AE%E9%A2%98&quot;&gt;分片问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ip%E5%9C%B0%E5%9D%80%E7%9A%84%E5%88%86%E7%B1%BB&quot;&gt;IP地址的分类&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%8D%8F%E8%AE%AE&quot;&gt;协议&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#arp%E5%8D%8F%E8%AE%AE&quot;&gt;ARP协议&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#dhcp%E5%8D%8F%E8%AE%AE&quot;&gt;DHCP协议&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#icmp%E5%8D%8F%E8%AE%AE%E7%BD%91%E9%99%85%E6%8E%A7%E5%88%B6%E6%8A%A5%E6%96%87%E5%8D%8F%E8%AE%AE&quot;&gt;ICMP协议（网际控制报文协议）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ipv6&quot;&gt;IPv6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%B7%AF%E7%94%B1%E5%8D%8F%E8%AE%AE&quot;&gt;路由协议&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#rip&quot;&gt;RIP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ospf&quot;&gt;OSPF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bgp%E5%8D%8F%E8%AE%AE&quot;&gt;BGP协议&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%A7%BB%E5%8A%A8ip&quot;&gt;移动IP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#u6-%E4%BC%A0%E8%BE%93%E5%B1%82&quot;&gt;U6 传输层&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%A6%82%E8%BF%B0&quot;&gt;概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#udp-vs-tcp&quot;&gt;UDP vs TCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#udp&quot;&gt;UDP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#tcp&quot;&gt;TCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#u7-%E5%BA%94%E7%94%A8%E5%B1%82&quot;&gt;U7 应用层&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#dns%E5%9F%9F%E5%90%8D%E7%B3%BB%E7%BB%9F&quot;&gt;DNS域名系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ftp&quot;&gt;FTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6&quot;&gt;电子邮件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%87%E7%BB%B4%E7%BD%91-www&quot;&gt;万维网 www&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;!-- # U1 计算机网络体系结构&lt;/p&gt;
&lt;h2&gt;基本概念&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;基本概念&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;&lt;em&gt;计算机网络&lt;/em&gt;&lt;/strong&gt;&amp;lt;/u&amp;gt;：由若干结点(node)和连接这些结点的链路(link)组成
&amp;lt;br&amp;gt;通过集线器、交换机构建计算机网络，通过路由器连接不同计算机网络&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;&lt;em&gt;互联网（因特网）&lt;/em&gt;&lt;/strong&gt;&amp;lt;/u&amp;gt;：各大ISP(Internet Service Provider)和国际机构组建成的、覆盖全球的互连网，
&amp;lt;br&amp;gt;必须使用 TCP/IP协议 通信；&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;&lt;em&gt;互连网&lt;/em&gt;&lt;/strong&gt;&amp;lt;/u&amp;gt;：路由器连接的大规模计算机网络，可以使用任意协议通信。&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;&lt;em&gt;交换机&lt;/em&gt;&lt;/strong&gt;&amp;lt;/u&amp;gt;：把多个节点链接起来，组成一个计算机网络
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;&lt;strong&gt;&lt;em&gt;路由器&lt;/em&gt;&lt;/strong&gt;&amp;lt;/u&amp;gt;：把两个或多个计算机网络连接起来，形成规模更大的计算机网络。也称为“&lt;strong&gt;互连网&lt;/strong&gt;”&lt;/li&gt;
&lt;li&gt;总结
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/img_24.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;计算机网络的组成&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 60%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/img_4.png&quot; alt=&quot;计算机网络的组成总览&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;从组成部分看&lt;/h3&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/img_5.png&quot; alt=&quot;计算机网络的组成总览&quot; style=&quot;width: 100%; max-width: 900px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;从工作方式看&lt;/h3&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 65%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/img_6.png&quot; alt=&quot;计算机网络的组成总览&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;从逻辑功能看&lt;/h3&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 90%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/img_7.png&quot; alt=&quot;计算机网络的组成总览&quot; style=&quot;width: 90%; max-width: 800px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;资源子网&lt;/strong&gt;:主要由连接到互连网上的**&lt;em&gt;主机&lt;/em&gt;**组成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通信子网&lt;/strong&gt;：负责计算机间&lt;strong&gt;信息传输&lt;/strong&gt;的部分，即 所有&lt;strong&gt;通信设备&lt;/strong&gt;和&lt;strong&gt;通信介质&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;&lt;strong&gt;网络适配器&lt;/strong&gt;&amp;lt;/u&amp;gt;、&amp;lt;u&amp;gt;&lt;strong&gt;底层协议&lt;/strong&gt;&amp;lt;/u&amp;gt; 属于通信子网 --&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;计算机网络的功能&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/img_8.png&quot; alt=&quot;计算机网络的组成总览&quot; style=&quot;width: 100%; max-width: 800px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;三种交换技术&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;电路交换&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;u&amp;gt;&lt;strong&gt;电路交换&lt;/strong&gt;&amp;lt;/u&amp;gt; Circuit switching&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;定义：通信前从主叫端到被叫端建立一条专用的 &lt;strong&gt;物理通路&lt;/strong&gt;，在通信的全部时间内，两个用户始终占用端到端的线路资源。&lt;/li&gt;
&lt;li&gt;优缺点：
&lt;ul&gt;
&lt;li&gt;优点：数据直送，传输速率高；&lt;/li&gt;
&lt;li&gt;缺点：建立/释放连接，需要额外的时间开销；
&amp;lt;br&amp;gt; 线路被通信双方独占，利用率低；线路分配的灵活性差；
&amp;lt;br&amp;gt; 交换节点不支持“差错控制”(无法发现传输过程中的发生的数据错误)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;更适用于：低频次、大量传输数据（电话网）
&amp;lt;span id=&quot;报文交换&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;u&amp;gt;&lt;strong&gt;报文交换&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;定义：把传送的数据单元先&lt;strong&gt;存储在中间节点&lt;/strong&gt;，再转发给下一地址
&amp;lt;br&amp;gt;   massage报文包括：控制信息 + 用户数据（发送方/接收方 + 传送的数据内容）&lt;/li&gt;
&lt;li&gt;优缺点
&lt;ul&gt;
&lt;li&gt;优点：通信前无需建立连接
&amp;lt;br&amp;gt; 数据以“报文”为单位被交换节点间“存储转发”，通信&lt;strong&gt;线路&lt;/strong&gt;可以&lt;strong&gt;灵活分配&lt;/strong&gt;
&amp;lt;br&amp;gt; 在通信时间内，两个用户无需独占一整条物理线路。相比于电路交换，线路利用率高
&amp;lt;br&amp;gt; 交换节点支持“差错控制”(&lt;strong&gt;通过校验技术&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;缺点：报文&lt;strong&gt;不定长&lt;/strong&gt;，不方便存储转发管理
&amp;lt;br&amp;gt; &lt;strong&gt;长报文&lt;/strong&gt;的存储转发时间开销大、缓存开销大
&amp;lt;br&amp;gt; 长报文&lt;strong&gt;容易出错&lt;/strong&gt;，重传代价高
&amp;lt;span id=&quot;分组交换&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;u&amp;gt;&lt;strong&gt;分组交换&lt;/strong&gt;&amp;lt;/u&amp;gt; Packet switching&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基本概念：长报文的数据分为若干个小的定长数据，&amp;lt;br&amp;gt;每部分的定长数据增加 &lt;strong&gt;控制信息(首部 Header)&lt;/strong&gt;
（包含：源地址、目的地址、分组号）；&amp;lt;br&amp;gt;定长数据+控制信息 = 分组（packet） &amp;lt;br&amp;gt;路由器是一种典型的分组交换机&lt;/li&gt;
&lt;li&gt;过程：数据被分成定长小数据，可以通过不同路径传输，最后在终端按照分组号进行排列&lt;/li&gt;
&lt;li&gt;优缺点
&lt;ul&gt;
&lt;li&gt;优点：相比于报文交换
&amp;lt;br&amp;gt; 分组定长，方便存储转发管理
&amp;lt;br&amp;gt;  分组的存储转发时间开销小、缓存开销小
&amp;lt;br&amp;gt;  分组不易出错，重传代价低&lt;/li&gt;
&lt;li&gt;缺点:
&amp;lt;br&amp;gt; 相比于报文交换，控制信息占比增加
&amp;lt;br&amp;gt; 相比于电路交换，需要在中间存储，依然存在存储转发时延
&amp;lt;br&amp;gt; 报文被拆分为多个分组，传输过程中可能出现失序、丢失等问题，增加处理的复杂度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;&amp;lt;u&amp;gt;&lt;strong&gt;虚电路交换&lt;/strong&gt;&amp;lt;/u&amp;gt; Virtual Circuit&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;过程：将源地址、目的地址建立联系(虚拟电路)，交换机处理，在传输过程中一直按序传输，最后释放连接&lt;/li&gt;
&lt;li&gt;现代计算机采用 &lt;strong&gt;分组交换&lt;/strong&gt;，用网络边缘终端强大的算力进行排序，而非用网络的核心部分&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;性能分析
&lt;img src=&quot;c013eb35e82ba9c7d86fe2d5821c59a3.jpg&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=65.1&amp;amp;p=5&quot; target =&quot;_blank&quot;&amp;gt;电路交换&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=597.0&amp;amp;p=5&quot; target=&quot;_blank&quot;&amp;gt;报文交换&amp;lt;/a&amp;gt; &amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=780.5&amp;amp;p=5&quot; target=&quot;_blank&quot;&amp;gt;分组交换&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- ---&lt;/p&gt;
&lt;h2&gt;计算机网络的分类&lt;/h2&gt;
&lt;h2&gt;&lt;img src=&quot;image-65.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;速率&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;h2&gt;计算机网络的性能指标&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;u&amp;gt;&lt;strong&gt;速率&lt;/strong&gt;&amp;lt;/u&amp;gt; ：连接到网络上的节点在信道上传输数据的速率。也称为 数据率/比特率/数据传输速率&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;信道&lt;/strong&gt;：向某一方向传送信息的通道（一条通信线路逻辑上对应 &amp;lt;u&amp;gt;发送信道&amp;lt;/u&amp;gt;、&amp;lt;u&amp;gt;接收信道&amp;lt;/u&amp;gt;）&lt;/li&gt;
&lt;li&gt;速率&lt;strong&gt;单位&lt;/strong&gt;：bit/s（b/s、bps）&lt;/li&gt;
&lt;li&gt;数量前缀：k → M → G → T（$10^3$）
&amp;lt;span id=&quot;带宽&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;u&amp;gt;&lt;strong&gt;带宽&lt;/strong&gt;&amp;lt;/u&amp;gt;：信道能传送的&amp;lt;u&amp;gt;最高数据率&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;信道语序通过的信号频率范围（Hz）&lt;/li&gt;
&lt;li&gt;通信线路通过的信号最高数据传输速率
&amp;lt;br&amp;gt;&lt;a href=&quot;#%E9%A6%99%E5%86%9C%E5%AE%9A%E7%90%86&quot;&gt;香农定理&lt;/a&gt;、&lt;a href=&quot;#%E5%86%85%E5%A5%8E%E6%96%AF%E7%89%B9%E5%AE%9A%E7%90%86%E5%A5%88%E6%B0%8F%E5%87%86%E5%88%99&quot;&gt;奈氏准则&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;吞吐量&lt;/strong&gt;：单位时间内通过某个网络/信道/接口的&amp;lt;u&amp;gt;数据传输总量&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学以致用：结点间实际能达到的最高速率，由带宽、节点性能共同限制（&amp;lt;u&amp;gt;短板效应&amp;lt;/u&amp;gt;）
&amp;lt;br&amp;gt;家用为例：光纤 → 光猫(调制解调器) → 网线 → 家用路由器WAN → 设备&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;时延&lt;/strong&gt;：从网络/链路的一端传送到另一端所需要的时间&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;总时延 = 发送时延 + 传播时延（+ 处理时延 + 排队时延）
&amp;lt;br&amp;gt;   = 将数据推向信道所花的时间 + 在信道传播所花的时间 = $\frac{数据长度}{发送速率/链路带宽}+\frac{信道长度}{传播速率}$&lt;/li&gt;
&lt;li&gt;&amp;lt;div style=&quot;display: flex; align-items: center; gap: 12px;&quot;&amp;gt;
&amp;lt;span&amp;gt;例：&amp;lt;/span&amp;gt;
&amp;lt;img src=&quot;/images/transtimeposphone.png&quot; alt=&quot;例题&quot; style=&quot;height: 180px;&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;时延带宽积&lt;/strong&gt; = 传播时延s × 带宽bit/s = bit&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;已发送但未被接收的最大比特数
&amp;lt;div style=&quot;display: flex; align-items: center; gap: 12px;&quot;&amp;gt;
&amp;lt;span&amp;gt;例：&amp;lt;/span&amp;gt;
&amp;lt;img src=&quot;/images/202333.png&quot; alt=&quot;例题&quot; style=&quot;height: 180px;&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;往返时延 RTT&lt;/strong&gt;（Round-Trip Time）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从发送方&amp;lt;u&amp;gt;发送完数据&amp;lt;/u&amp;gt;，到发送方收到来自接收方的&amp;lt;u&amp;gt;确认&amp;lt;/u&amp;gt;总共经历的时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;信道利用率&lt;/strong&gt; = $\frac{信道中有数据的时间}{总时间}$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;U2 计算机网络分层结构&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;计算机网络的3种分层/&lt;strong&gt;体系结构&lt;/strong&gt;
&amp;lt;br&amp;gt;网络体系结构：计算机网络的各层及其协议的集合
&lt;img src=&quot;image-3.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;span id=&quot;两个角度&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;水平方向的传输过程&lt;img src=&quot;image-2.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;垂直方向的传输过程
&amp;lt;br&amp;gt;对于相邻两层实体，上一层请求下一层的&lt;strong&gt;服务&lt;/strong&gt;，需要访问下一层提供的&lt;strong&gt;接口&lt;/strong&gt;（服务访问点Service Access Point，SAP）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每层的数据：&lt;strong&gt;协议数据单元（PDU）&lt;/strong&gt;：对等层次之间传送的包含首部/尾部的数据单元。第n层的记作 n-PDU&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;协议控制信息（PCI）&lt;/strong&gt;：控制协议操作的信息，即首部+尾部。第n层记作 n-PCI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务数据单元（SDU）&lt;/strong&gt;：除去本层协议控制信息的数据。
&lt;img src=&quot;image-4.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;span id=&quot;协议&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;协议 Protocol&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;协议三要素：&lt;strong&gt;语法&lt;/strong&gt;（数据/控制信息的格式）、&lt;strong&gt;语义&lt;/strong&gt;（需要完成什么动作/做出什么应答）、&lt;strong&gt;同步/时序&lt;/strong&gt;（动作发生的顺序）
&amp;lt;span id=&quot;TCP/IP模型&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;OSI参考模型&lt;/h2&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=326.8&amp;amp;p=11&quot;  target =&quot;_blank&quot;&amp;gt;各层&amp;lt;/a&amp;gt;名称：（物联网叔会使用）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;应用层&lt;/strong&gt;：实现特定网络应用（eg：两个应用传一个文件，文件就是一个&amp;lt;u&amp;gt;&lt;strong&gt;报文&lt;/strong&gt;&amp;lt;/u&amp;gt;Message）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;表示层&lt;/strong&gt;：数据格式转化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话层&lt;/strong&gt;：会话管理（检查点机制，通信失效时 从检查点恢复通信）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传输层&lt;/strong&gt;：以 &amp;lt;u&amp;gt;&lt;strong&gt;报文段&lt;/strong&gt;&amp;lt;/u&amp;gt;Segment为单位，实现进程(端口)到进程(端口)的通信。
&amp;lt;br&amp;gt;&lt;em&gt;差错控制、流量控制、连接管理、可靠传输管理&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络层&lt;/strong&gt;：向上层提供&lt;em&gt;&lt;strong&gt;虚电路服务&lt;/strong&gt;&lt;/em&gt;，转成 &amp;lt;u&amp;gt;&lt;strong&gt;分组/数据报&lt;/strong&gt;&amp;lt;/u&amp;gt;Packet。实现主机到主机的通信。
&amp;lt;br&amp;gt;  路由选择(选择传输路径)、分组转发、拥塞控制、(异构网络)网际互联、&lt;em&gt;差错控制、流量控制、连接管理、可靠传输管理&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据链路层&lt;/strong&gt;：(用校验编码技术检查每 &amp;lt;u&amp;gt;&lt;strong&gt;帧&lt;/strong&gt;&amp;lt;/u&amp;gt;frame的信息)差错控制、流量控制(协调结点间的速率)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;物理层&lt;/strong&gt;：定义电路接口参数、传输信号的含义等
&lt;img src=&quot;image-5.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;TCP/IP模型&lt;/h2&gt;
&lt;p&gt;各层名称：（接网叔用）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;应用层&lt;/strong&gt;：包括之前的应用层+表示层+会话层。如果有些应用需要相应功能，用特定&lt;strong&gt;协议&lt;/strong&gt;实现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传输层&lt;/strong&gt;：报文 → &lt;strong&gt;报文段&lt;/strong&gt;。复用/分用、&lt;em&gt;差错控制、流量控制、连接管理、可靠传输管理&lt;/em&gt;
&amp;lt;br&amp;gt;  向上层提供 有连接可靠的服务&lt;em&gt;&lt;strong&gt;TCP服务&lt;/strong&gt;&lt;/em&gt;；提供无连接不可靠的服务&lt;em&gt;&lt;strong&gt;UDP服务&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络层&lt;/strong&gt;：路由选择、分组转发、拥塞控制、网际互连、&lt;s&gt;差错控制、流量控制、连接管理、可靠传输管理&lt;/s&gt;（会传输可能出错的&lt;strong&gt;分组&lt;/strong&gt;，只在传输层进行处理）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络接口层&lt;/strong&gt;：实现相邻节点间的数据传输，未规定死接口层（交给网络设备商发挥）。具有更强的灵活性、创造性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;对比&lt;/h3&gt;
&lt;p&gt;TCP/IP模型简化网络层功能，降低网络核心部分-路由器 的负载。（网络核心部分只包含到网络层）
&amp;lt;br&amp;gt;&lt;img src=&quot;image-6.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;U3 物理层&lt;/h1&gt;
&lt;h2&gt;基础概念&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;信源&lt;/strong&gt;(数据发送方) → &lt;strong&gt;信宿&lt;/strong&gt;(数据接收方)  ，通过&lt;strong&gt;信道&lt;/strong&gt;进行传输（一条物理线路通常包括 &amp;lt;u&amp;gt;发送信道、接收信道&amp;lt;/u&amp;gt;）
&amp;lt;br&amp;gt;&lt;strong&gt;信号&lt;/strong&gt;(数据的载体)：数字信号(离散)、模拟信号(连续)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;码元&lt;/strong&gt;：每一个信号就是一个码元；&lt;strong&gt;码元宽度&lt;/strong&gt;：几bit代表一个信号（8&lt;strong&gt;进制&lt;/strong&gt;码元携带3bit数据）
&amp;lt;br&amp;gt;  eg:一个信号周期最多可以表示4种信号，0V→00/1V→01/3V→11是一个四进制码元，码元宽度是2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;波特率&lt;/strong&gt;：每秒传输几个码元（信号）。码元/秒，波特 Baud
&amp;lt;br&amp;gt;&lt;strong&gt;比特率&lt;/strong&gt;：每秒传输几个比特。bit/s，b/s，bps&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;信道的极限容量&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;内奎斯特定理(奈氏准则)&lt;/h3&gt;
对于一个理想低通信道（没有噪声、带宽有限）
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;极限&lt;strong&gt;波特&lt;/strong&gt;率&amp;lt;/u&amp;gt; $= 2W波特(W是信道的频率带宽Hz) =$ &amp;lt;u&amp;gt;比特率&amp;lt;/u&amp;gt; $ 2Wlog_2K$（一个信号周期出现K种信号）&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;香农定理&lt;/h3&gt;
对于一个有噪声、带宽有限的信道
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;极限&lt;strong&gt;比特&lt;/strong&gt;率&amp;lt;/u&amp;gt; $= Wlog_2(1+\frac{S}{N})）= 频率带宽log_2(1+信噪比)$（要使用无单位的信噪比）
&amp;lt;br&amp;gt;信噪比会很大，无单位的换成 &lt;strong&gt;分贝dB&lt;/strong&gt; 表示法：$信噪比 = 10log_{10}\frac{S}{N}dB$&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;编码和调制&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编码&lt;/strong&gt;：二进制数据 → 数字信号；&lt;strong&gt;解码&lt;/strong&gt;：二进制数据 ← 数字信号（有线网络适配器：编码-解码器）
&amp;lt;br&amp;gt;&lt;strong&gt;调制&lt;/strong&gt;：二进制数据 → 模拟信号；&lt;strong&gt;解调&lt;/strong&gt;：二进制数据 ← 模拟信号（光猫：调制-解调器）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编码方式&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; align-items: center;&quot;&amp;gt;
&amp;lt;div style=&quot;width: 70%; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/bianm1.png&quot; alt=&quot;图1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;width: 30%; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/bianma2.png&quot; alt=&quot;图2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;以太网&lt;/strong&gt;默认用&lt;strong&gt;曼彻斯特编码&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;自同步能力&lt;/strong&gt;：连续传输相同的0/1信号，能够区分比特边界/信源和信宿可以根据信号完成节奏同步，无需时钟信号。只有非归零编码无，NRZI可以增加冗余位(8+1bit)支持自同步。
&amp;lt;br&amp;gt;&lt;strong&gt;浪费带宽&lt;/strong&gt;：信号是否全都用来传输数据。NRZI有1bit冗余位，会浪费一点&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;调制&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 10px; align-items: center;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 3; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/tiaoz1.png&quot; alt=&quot;拓扑结构1&quot; style=&quot;width: 100%; max-height: 400px;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;正交幅度调制 QAM&lt;/strong&gt;：AM/QM的结合.若有m种幅值+n种相位,可调制出mn种信号,1码元$=log_2mn bit$数据
&amp;lt;br&amp;gt;QAM-16，调制1种信号，1码元携带$log_216 = 4bit$数据&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;某无噪声理想信道带宽为 4MHz，采用 QAM 调制，若该信道的最大数据传输速率是 48Mbps，则该信道采用的 QAM 调制方案是（ ）。
&amp;lt;br&amp;gt;A. QAM-16 B. QAM-32 C. QAM-64 D. QAM-128&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;在一条带宽为 200 kHz 的无噪声信道上，若采用 4 个幅值的 ASK 调制，则该信道的最大数据传输速率是（ ）。
&amp;lt;br&amp;gt;A. 200 kbps   B. 400 kbps  C. 800 kbps  D. 1600 kbps&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;C\C&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;传输介质&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;常见的传输介质
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;导向型&lt;/strong&gt;（有线）
&lt;ol&gt;
&lt;li&gt;&amp;lt;u&amp;gt;双绞线&amp;lt;/u&amp;gt; Twisted Pair：由两根导线绞合而成。有屏蔽层(STP)；无屏蔽层(UTP)
&amp;lt;br&amp;gt;提升速率&amp;amp;抗电磁干扰能力：提升绞合度+增加屏蔽层。
&amp;lt;br&amp;gt;早期局域网、早期有线电话&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;同轴电缆&amp;lt;/u&amp;gt;:内导体（传输信号）+绝缘层+外导体屏蔽层（抗电磁干扰）+绝缘保护层
&amp;lt;br&amp;gt;信号传输损耗小，长距离传输中继器少，很细很省布线空间。&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;光纤&amp;lt;/u&amp;gt;:纤芯(高折射率)+包层(低折射率) 全反射
&amp;lt;br&amp;gt;多模光纤：纤芯更粗，可传输多条光线，信号传输损耗更高，适合近距离传输
&amp;lt;br&amp;gt;单模光纤：纤芯更细，只能传输一条光线，信号传输损耗更低，适合远距离传输&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非导向型&lt;/strong&gt;（无线）
&lt;ol&gt;
&lt;li&gt;&amp;lt;u&amp;gt;无线电波&amp;lt;/u&amp;gt;：穿透能力强，传输距离强，信号指向性弱
&amp;lt;br&amp;gt;如：手机信号、WIFI&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;微波通信&amp;lt;/u&amp;gt;：频率带宽高，信号指向性强
&amp;lt;br&amp;gt;如：卫星通信&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;以太网对有线传输介质的命名规则：速度+Base+介质信息
&amp;lt;br&amp;gt;&lt;strong&gt;数字&lt;/strong&gt;：同轴电缆的最远传输举例，&lt;strong&gt;F&lt;/strong&gt; 光纤optical Fiber，&lt;strong&gt;T&lt;/strong&gt; 双绞线Twisted pair
&lt;img src=&quot;image-27.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;物理层设备&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中继器&lt;/strong&gt; Pepeater
&amp;lt;br&amp;gt;一个端口接收信号，将失真信号整形再生，并转发到另一端口。两个端口对应两个 &amp;lt;u&amp;gt;网段&amp;lt;/u&amp;gt;
&amp;lt;br&amp;gt;支持&amp;lt;u&amp;gt;半双工 通信&amp;lt;/u&amp;gt;： 支持双向传播，但不同方向不能同时进行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;集线器&lt;/strong&gt; Hub
&amp;lt;br&amp;gt;本质上是多端口中继器。
&amp;lt;br&amp;gt;将一个端口收到的信号整形再生后，转发到所有其他端口。
&amp;lt;br&amp;gt;N个端口对应N个网段，所有网段属于同一个 &amp;lt;u&amp;gt;冲突域&amp;lt;/u&amp;gt;
&amp;lt;br&amp;gt;各端口不能同时发送数据，会导致冲突。两台主机同时发送数据会导致冲突，则两台主机处于同一个冲突域。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特征&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;集线器、中继器不能无限串联（5-4-3原则）&lt;/li&gt;
&lt;li&gt;集线器连接的网络物理上是星形拓扑，逻辑上是总线型拓扑。各网段共享带宽
&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/Hub1.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/Hub2.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
--- --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;U4 数据链路层&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;所处地位
&lt;img src=&quot;image-30.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;!-- - 功能
&lt;img src=&quot;image-32.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;⭐组帧&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;定义
&amp;lt;br&amp;gt;数据链路层 把 网络层的数据打包成帧的过程叫做&lt;strong&gt;组帧&lt;/strong&gt;
&lt;img src=&quot;image-32.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;四种组帧方法&lt;/h4&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; gap: 20px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1;&quot;&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;字符计数法&lt;/strong&gt;
&amp;lt;br&amp;gt;缺点：任何一个计数字段出错，都会导致后续所有帧无法定界
&lt;img src=&quot;image-1.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1;&quot;&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;字节填充法&lt;/strong&gt;
&amp;lt;br&amp;gt;在帧的起始/结束位置加上控制字符&lt;strong&gt;SOH&lt;/strong&gt;/&lt;strong&gt;EOT&lt;/strong&gt;(Start Of Header/Ending Of Transmission)
&amp;lt;br&amp;gt;在数据部分防止歧义，SOH、EOT、ESC前加上&lt;strong&gt;ESC&lt;/strong&gt;(Escape Character)
&lt;img src=&quot;image-35.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; gap: 20px; margin-top: 20px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1;&quot;&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;零比特传输法&lt;/strong&gt;
&amp;lt;br&amp;gt;特殊比特串设为 0111 1110。对于连续5个1的数据部分进行“填充0”处理
&lt;img src=&quot;image-33.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1;&quot;&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;违规编码法&lt;/strong&gt;
&amp;lt;br&amp;gt;曼彻斯特编码中时钟周期必跳变，加入“不变”的违规编码作为帧的分界
&lt;img src=&quot;image-38.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; --&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- ## ⭐差错控制&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;定义
&amp;lt;br&amp;gt;发现并解决一个帧内部的“错位”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;奇/偶校验码&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;整个校验码中 &lt;strong&gt;1的个数&lt;/strong&gt; 是奇/偶数个，接收方的数据链路层检查1的个数是否还是奇/偶数
→ 只能检测&lt;strong&gt;奇数位&lt;/strong&gt;错误。&lt;/li&gt;
&lt;li&gt;求偶校验位：异或运算$\oplus$信息位
&amp;lt;br&amp;gt;进行偶校验：所有位$\oplus$ ，结果应为0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;循环冗余校验码（CRC码）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;K位信息位+R个校验位 作为被除数，保证除法的余数为0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px; margin-top: 4px; margin-bottom: 4px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/CRC1.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%; margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/CRC2.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%; margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能够纠错的长度
&amp;lt;br&amp;gt;K个信息位，R个校验位，若 $2^R \ge K + R + 1$ CRC校验位能表示的个数 $\ge$ 信息位的位数
&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px;margin-top: 4px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/CRC.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/CRClen1.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;海明校验码&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;总体思路
&amp;lt;br&amp;gt;K位检验码能纠错$2^k$位，要 $\ge$ R+K 中任何一位可能出现错误 + 1种正确状态&lt;br /&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 10px; align-items: flex-start;&quot;&amp;gt;
&amp;lt;div style=&quot;width: 60%; display: flex; flex-direction: column; line-height: 0; font-size: 0;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/himing1.png&quot; alt=&quot;海明校验码1&quot; style=&quot;width: 100%; display: block; margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/himing3.png&quot; alt=&quot;海明校验码3&quot; style=&quot;width: 100%; display: block; margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;width: 40%; line-height: 0; font-size: 0;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/himing2.png&quot; alt=&quot;海明校验码2&quot; style=&quot;width: 100%; display: block; margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=97.8&amp;amp;p=23&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&amp;gt;具体&amp;lt;/a&amp;gt; --&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;⭐1. 可靠传输/流量控制 与 滑动窗口&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可靠传输&lt;/strong&gt;：解决帧之间的“帧错”：帧丢失、帧重复、帧失序
&amp;lt;br&amp;gt;&lt;strong&gt;流量控制&lt;/strong&gt;：控制发送方发送帧的速率别太快，要让接收方来得及接收&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;3种机制&lt;/h4&gt;
实现这两个功能需要多种机制配合：
&lt;img src=&quot;image-34.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;img src=&quot;image-39.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;本质是滑动窗口的3种协议&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;停止-等待协议 S-W&lt;/strong&gt;：发送窗口 = 1，接收窗口 = 1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后退N帧协议 GBN&lt;/strong&gt;：发送窗口 ＞ 1，接收窗口 = 1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择重传协议SR&lt;/strong&gt;：发送窗口 ＞ 1，接收窗口 ＞ 1&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;⭐1.1停止等待协议 S-W&lt;/h3&gt;
&lt;p&gt;stop-wait&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;滑动窗口机制&lt;/h3&gt;
发送窗口 = 1，接收窗口 = 1&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;帧编号&lt;/h4&gt;
仅需 &lt;strong&gt;1 bit&lt;/strong&gt; 给帧编号
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据帧&lt;/strong&gt;的组成：首 数据部分(可长可短) 尾
&amp;lt;br&amp;gt;确认帧的数据部分很短/为空
&amp;lt;br&amp;gt;&lt;strong&gt;首尾主要是&lt;/strong&gt;：帧定界信息，校验码、&lt;em&gt;&amp;lt;u&amp;gt;帧类型&amp;lt;/u&amp;gt;&lt;/em&gt;(确认帧/反向传输的数据)、&amp;lt;u&amp;gt;&lt;em&gt;帧序号&lt;/em&gt;&amp;lt;/u&amp;gt;(0/1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;正常情况&lt;/h4&gt;
发送方 发送给 接收方；接收方 对数据进行“差错控制” 没有问题发送ACK给发送方，同时接收窗口右移；发送方接收到ACK也右移 继续发送数据。
&lt;img src=&quot;image-40.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;异常情况&lt;/h4&gt;
&lt;strong&gt;数据帧丢失&lt;/strong&gt;：超时重传机制；
&amp;lt;br&amp;gt;&lt;strong&gt;确认帧丢失&lt;/strong&gt;：超时重传，接收方收到重复帧→丢弃重复帧，并重新返回ACK；
&amp;lt;br&amp;gt;&lt;strong&gt;重复数据帧&lt;/strong&gt;：接收方通过&lt;strong&gt;帧序号&lt;/strong&gt;判断收到重复数据帧→&lt;strong&gt;丢弃重复帧&lt;/strong&gt;、&lt;strong&gt;返回重复帧的ACK&lt;/strong&gt;
&amp;lt;br&amp;gt;&lt;strong&gt;数据帧有差错&lt;/strong&gt;：接收方检测到差错→接收方将此帧“&lt;strong&gt;丢弃&lt;/strong&gt;”，且不会返回ACK。导致超时重传&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;⭐1.2 后退N帧协议 GBN -累积确认&lt;/h3&gt;
&lt;p&gt;go back N&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;滑动窗口机制&lt;/h4&gt;
发送窗口 ＞ 1，接收窗口 = 1&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;确认机制&lt;/h4&gt;
&lt;strong&gt;确认帧&lt;/strong&gt;：“&amp;lt;u&amp;gt;累积确认&amp;lt;/u&amp;gt;”，连续收到多个数据帧返回&amp;lt;u&amp;gt;最后一个帧&amp;lt;/u&amp;gt;的ACK，表示收到i号帧及之前的所有帧&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;重传机制&lt;/h4&gt;
&lt;strong&gt;超时重传&lt;/strong&gt;：若发送方超时未收到$ACK_i$，则重传i号帧 及其之后的所有帧&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;帧编号&lt;/h4&gt;
$W_T + W_R \leq n$&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;正常情况&lt;/h4&gt;
&lt;p&gt;发送窗口连续传输数据，接收到最后一个数据 → 返回“累积确认”ACK2
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=26&amp;amp;t=153.4&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;异常情况&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;数据帧丢失&lt;/strong&gt;：发送最后收到的ACK，发送窗口移动&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=26&amp;amp;t=289.0&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;br&amp;gt;&lt;strong&gt;确认帧丢失&lt;/strong&gt;：发送方全部超时重传 → 但是接收方全都已经收到过了 → 丢弃重复帧，重传ACK&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=26&amp;amp;t=580.3&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;⭐1.3 选择重传协议 SR -差错帧返回“NCK”&lt;/h3&gt;
&lt;p&gt;Selective Repeat&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;滑动窗口机制&lt;/h4&gt;
发送窗口 ＞ 1，接收窗口 ＞ 1。$W_R \leq W_T$&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;确认机制&lt;/h4&gt;
&lt;strong&gt;确认帧&lt;/strong&gt;：每一帧返回$ACK_i$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重传机制：&amp;lt;u&amp;gt;超时重传 + 请求重传&amp;lt;/u&amp;gt;&lt;/strong&gt;
&amp;lt;br&amp;gt;超时重传：超过时间，发送方重新传Data
&amp;lt;br&amp;gt;请求重传：&lt;strong&gt;NAK 否认帧&lt;/strong&gt;：若接收方检测到$Data_i$有“&lt;strong&gt;差错&lt;/strong&gt;” → 则丢弃该帧，返回发送方$NAK_i$，请求重传
&amp;lt;br&amp;gt;不必等到计时器超时再重传，而是收到NCK就立即重传 → 提升效率&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;帧编号&lt;/h4&gt;
$W_T + W_R \leq n,W_R \leq W_T$（&lt;strong&gt;接收窗口&lt;/strong&gt;小于发送窗口）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;正常情况&lt;/h4&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=27&amp;amp;t=414.6&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;异常情况&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;数据帧丢失&lt;/strong&gt;：超时重传&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=27&amp;amp;t=501.1&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;strong&gt;数据帧检测出差错而被丢弃&lt;/strong&gt;：返回给发送方 &lt;strong&gt;NAK&lt;/strong&gt; → 发送方重传帧、重置计时器&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=27&amp;amp;t=615.5&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;strong&gt;确认帧丢失&lt;/strong&gt;
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=27&amp;amp;t=822.6&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;1.4 对于可靠传输/流量控制机制的信道利用率分析&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;发送信道的信道利用率&lt;/strong&gt;：发送完当前数据到发送下一次数据（发送数据的占比）
&amp;lt;br&amp;gt;ARQ 自动重传请求协议：包括这3个协议&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;S-W协议&lt;/h4&gt;
&lt;img src=&quot;image-66.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;GBN协议、SR协议&lt;/h4&gt;
分母：第一次发送 ~ 可以发送下一组（&lt;strong&gt;分母中数据传输时间只取1个&lt;/strong&gt;）
&amp;lt;br&amp;gt;利用率不会大于1。若N=5，信道一直有发送的数据填充，$\alpha=1$
&lt;img src=&quot;image-67.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;例1&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=28&amp;amp;t=1002.2&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/li&gt;
&lt;li&gt;例2&lt;img src=&quot;image-114.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;⭐2.介质/多路访问控制&lt;/h2&gt;
&lt;p&gt;广播通信时，多个节点争抢物理传输介质。怎么解决争抢问题，实现有序传输
&lt;img src=&quot;image-117.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.1 信道划分&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;时分复用 TDM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;频分复用 FDM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;码分复用 CDM&lt;/strong&gt;
&amp;lt;!-- &lt;img src=&quot;image-69.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;码分复用&lt;/strong&gt;
&amp;lt;br&amp;gt;码片序列包含&lt;strong&gt;m个码片&lt;/strong&gt;，看作m维向量、各节点的m维向量必须相互&lt;strong&gt;正交&lt;/strong&gt;、&amp;lt;br&amp;gt;信号值与码片序列相同为1 相反为0、“规格化内积”叠加信号×码片序列=±1（1/0）
&lt;img src=&quot;image-68.png&quot; alt=&quot;alt text&quot; /&gt; --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;随机访问&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ALOHA协议&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;纯ALOHA&lt;/strong&gt;：准备好数据帧，就立即发送；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时隙ALOHA协议&lt;/strong&gt;：准备好的数据要等到一个时隙的开始才发送；若发生冲突，分别随机等一段时间后发送
&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px;margin-top: 4px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/sxaloha1.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/sxaloha2.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSMA协议&lt;/strong&gt;：发送数据之前，先&lt;strong&gt;监听&lt;/strong&gt;信道是否&lt;strong&gt;空闲&lt;/strong&gt;，只有空闲时才发送数据（网络适配器要安装“载波监听装置”）
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1-坚持CSMA协议&lt;/strong&gt;
&lt;img src=&quot;image-72.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非坚持CSMA协议&lt;/strong&gt;
&amp;lt;br&amp;gt;优点：使各节点错开发送数据，降低冲突概率；
&amp;lt;br&amp;gt;缺点：信道空闲时，可能不会被立即里哟个，导致信道利用率降低
&lt;img src=&quot;image-73.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;p-坚持CSMA协议&lt;/strong&gt;
&amp;lt;br&amp;gt;折中方法，降低冲突概率、提高信道利用率
&lt;img src=&quot;image-74.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSMA/CD协议&lt;/strong&gt;：用于早期有线以太网（总线型）Collusion Detection
&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px;margin-top: 4px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/csmacd1.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/csam2.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;ul&gt;
&lt;li&gt;接收方：依次检查检查若 帧小于最短帧长、不是发给自己的、CRC检错 帧有差错 → 丢弃帧&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSMA/CA协议&lt;/strong&gt;：用于IEEE 802.11 无线局域网（WIFI）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;轮询访问&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;令牌传递协议&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;获得令牌的节点会持有&lt;strong&gt;令牌帧&lt;/strong&gt;，想要发送数据时，把令牌帧转换为&lt;strong&gt;数据帧&lt;/strong&gt;
&amp;lt;br&amp;gt; &lt;strong&gt;数据帧&lt;/strong&gt; = 令牌号 + 源地址&amp;amp;目的地址 + 数据部分 + 是否已接收(false/true)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按固定方向遍历每个节点
&amp;lt;br&amp;gt; 是目的地址：复制数据部分，已接收=true
&amp;lt;br&amp;gt; 回到源地址：检查已接受。true：发送成功；false：发送失败，尝试重传&lt;br /&gt;
&lt;img src=&quot;image-75.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px;margin-top: 4px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/76.png&quot; alt=&quot;数据模型&quot; style=&quot;width: 75%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;!-- # U4 局域网&lt;/p&gt;
&lt;h2&gt;局域网基础&lt;/h2&gt;
&lt;h3&gt;IEEE 802 委员会&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;现存技术
&amp;lt;br&amp;gt;802.3工作组：以太网技术
&amp;lt;br&amp;gt;802.11工作组：Wi-Fi技术&lt;/li&gt;
&lt;li&gt;802委员会的层次划分
&lt;img src=&quot;image-45.png&quot; alt=&quot;alt text&quot; /&gt;
现在所学的所有功能与MAC子层有关
&amp;lt;br&amp;gt;[名存实亡]为兼容各种局域网技术 → 逻辑链路控制子层（LLC层）
&lt;ul&gt;
&lt;li&gt;有线局域网已被 802.3垄断&lt;/li&gt;
&lt;li&gt;无线局域网已被 802.11垄断&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;局域网的特点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;覆盖较小的地理&lt;strong&gt;范围&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;较低的&lt;strong&gt;时延&lt;/strong&gt;和&lt;strong&gt;误码率&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;局域网内的各节点之间以“&lt;strong&gt;帧&lt;/strong&gt;”为单位进行传输&lt;/li&gt;
&lt;li&gt;支持&lt;strong&gt;单播、广播、多播&lt;/strong&gt;
&amp;lt;br&amp;gt;（一对一、一堆全部、一对多发送帧）
&amp;lt;br&amp;gt;&lt;strong&gt;会拥有唯一的&lt;/strong&gt; MAC地址（48bit 物理地址）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;局域网的分类&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;LAN
&lt;ol&gt;
&lt;li&gt;Ethernet（同轴电缆 → 双绞线/光纤）&lt;/li&gt;
&lt;li&gt;令牌环网技术&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;WLAN&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;硬件架构&lt;/h3&gt;
&lt;p&gt;网络适配器（网卡）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把帧发送到局域网。将帧数据报封装成帧，由主机/网络适配器实现&lt;/li&gt;
&lt;li&gt;从局域网接收帧&lt;/li&gt;
&lt;li&gt;实现数据链路层+物理层功能&lt;/li&gt;
&lt;li&gt;完成数据的串/并行转换&lt;/li&gt;
&lt;li&gt;支持帧缓冲&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;单播帧/广播帧的传播&lt;/h3&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=38&amp;amp;t=1452.3&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;VLAN&lt;/h2&gt;
&lt;p&gt;VLAN的划分方式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基于接口
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=39&amp;amp;t=495.8&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/li&gt;
&lt;li&gt;基于MAC地址
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=39&amp;amp;t=681.6&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
--- --&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;以太网交换机&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自学习功能&lt;/strong&gt;：最开始交换表为空[MAC帧:端口号]
&lt;ul&gt;
&lt;li&gt;记录发送方的端口号&lt;/li&gt;
&lt;li&gt;不知道接收方地址 → 广播/直到接收方地址 → 精准发送
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=44&amp;amp;t=447.7&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;U5 网络层&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IP数据报（分组）&lt;/strong&gt;
&amp;lt;br&amp;gt;首部（包括源IP地址、目的IP地址） + 报文段&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络层&lt;/strong&gt; 实现 &lt;strong&gt;主机&lt;/strong&gt;间的传输（∵首部规定源地址、目的地址）
&amp;lt;br&amp;gt;&lt;strong&gt;数据链路层&lt;/strong&gt; 实现 &lt;strong&gt;节点&lt;/strong&gt;间的传输&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;网络层功能&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;异构网络互联&lt;/h3&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;异构？ 每个网络的拓扑结构不同、物理层&amp;amp;数据链路层的实现不同、连接的主机不同&lt;/li&gt;
&lt;li&gt;重要设备：&lt;strong&gt;路由器 Router&lt;/strong&gt;/网关&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;路由 &amp;amp; 转发&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路由&lt;/strong&gt;：
&amp;lt;br&amp;gt;各个路由器通过“路由协议”实现相互配合，最终生成各自的“&lt;strong&gt;路由表&lt;/strong&gt;”。规划分组的“最佳转发路径”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;转发&lt;/strong&gt;
&amp;lt;br&amp;gt;一台路由器有自己的“&lt;strong&gt;转发表&lt;/strong&gt;”（精简的路由表），将收到的IP数据报选择合适的接口转发出去&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;拥塞控制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;原因：网络上出现过量分组，超负荷，引起网络性能下降&lt;/li&gt;
&lt;li&gt;拥塞控制方法：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开环控制（静态）&lt;/strong&gt; ：部署网络时，提前设计好的防止拥塞控制的方法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;闭环控制（动态）&lt;/strong&gt;：将拥塞信息转发给相关路由器（ICMP协议），路由器动态调整“路由表”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;IPv4&lt;/h2&gt;
&lt;h3&gt;IP数据报/分组 的构成&lt;/h3&gt;
&lt;p&gt;首部（20B 固定部分+0~40B 可变部分） + 数据部分
&amp;lt;br&amp;gt;以下是首部固定部分的组成&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;第一行
&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px;margin-top: -2px;margin-bottom: 20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/IPv41.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分片组装问题&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标识&lt;/th&gt;
&lt;th&gt;标志&lt;/th&gt;
&lt;th&gt;片偏移&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16bit&lt;/td&gt;
&lt;td&gt;3bit&lt;/td&gt;
&lt;td&gt;13bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;检查是否来自同一个IP数据报&lt;/td&gt;
&lt;td&gt;最低位MF=1（是否还有更多分片More Fragment）次低位DF=1（不允许被分片Don&apos;t Fragment）&lt;/td&gt;
&lt;td&gt;被分片前的位置，×8B为单位&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;标识相同、源地址相同 → 分片原同属于一个IP数据报&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px;margin-top: -5px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-46.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生存时间TTL&lt;/strong&gt;、&lt;strong&gt;协议&lt;/strong&gt;、&lt;strong&gt;首部校验&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;32 bit的&lt;strong&gt;源地址&lt;/strong&gt;、32 bit的&lt;strong&gt;目的地址&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;分片问题&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;image-102.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=772.5&amp;amp;p=46&quot;&amp;gt;解释&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h3&gt;IP地址的分类&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;最初的分类（A/B/C/D/E）&lt;/strong&gt;
&amp;lt;br&amp;gt;判断目的IP&lt;strong&gt;类别&lt;/strong&gt; → 是否跟当前源IP地址的网络号相同 → 看前面的网络号 → 加上MAC地址封装成帧
&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1114.1&amp;amp;p=47&quot; target=&quot;_blank&quot;&amp;gt;不同网络的转发过程&amp;lt;/a&amp;gt;、
&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1470.7&amp;amp;p=47&quot; target=&quot;_blank&quot;&amp;gt;同一个网络的转发过程&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;子网划分 &amp;amp; 子网掩码&lt;/strong&gt;
&amp;lt;br&amp;gt;源地址、目的地址 &amp;amp; 源IP、目的IP → 是否属于同一个子网 → 跟&lt;strong&gt;子网掩码&lt;/strong&gt;相与后 是否等于目的网络号 → MAC帧转发给目的主机
&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=961.6&amp;amp;p=48&quot; target=&quot;_blank&quot;&amp;gt;子网内&amp;lt;/a&amp;gt;、
&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1058.1&amp;amp;  p=48&quot; target=&quot;_blank&quot;&amp;gt;不同子网&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1248.5&amp;amp;p=48&quot;&amp;gt;有子网划分&amp;amp;无子网划分的网络之间&amp;lt;/a&amp;gt;
&amp;lt;div style=&quot;display: flex; width:100%; gap: 1px;margin-top: -5px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-100.png&quot; alt=&quot;最初分类&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;img src=&quot;/images/image-101.png&quot; alt=&quot;子网划分&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;分类&lt;/th&gt;
&lt;th&gt;选择接口&lt;/th&gt;
&lt;th&gt;匹配后处理&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;最初ABCDE&lt;/td&gt;
&lt;td&gt;通过最先几位判断&lt;strong&gt;分类&lt;/strong&gt; → 保留多少位&lt;/td&gt;
&lt;td&gt;MAC帧直接定位目的主机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;子网划分&lt;/td&gt;
&lt;td&gt;直接和&lt;strong&gt;子网掩码&lt;/strong&gt;相与，判断属于哪个子网&lt;/td&gt;
&lt;td&gt;MAC帧直接定位目的主机&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;无分类编制 CIDR&lt;/strong&gt;
网络前缀 + 主机号
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;子网划分&lt;/strong&gt;：定长子网划分、变长子网划分
&lt;img src=&quot;image-98.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=668.2&amp;amp;p=49&quot; target=&quot;_blank&quot;&amp;gt;解答&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路由聚合&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;会减小路由表的大小，但会引入无效地址&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最长前缀匹配原则&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=732.2&amp;amp;p=50&quot; target=&quot;blank&quot;&amp;gt;例&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1248.0&amp;amp;p=50&quot; target=&quot;_blank&quot;&amp;gt;⭐综合过程&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络地址转换 NAT&lt;/strong&gt;
&lt;img src=&quot;image-99.png&quot; alt=&quot;alt text&quot; /&gt;
&amp;lt;br&amp;gt;NAT路由器包含&lt;strong&gt;传输层&lt;/strong&gt;，普通路由器只包含&lt;strong&gt;网络层&lt;/strong&gt;及以下。
&lt;ul&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1199.1&amp;amp;p=51&quot;&amp;gt;过程&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;协议&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;image-103.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;ARP协议&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=393.2&amp;amp;p=52&quot; target=&quot;_blank&quot;&amp;gt;过程&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=950.9&amp;amp;p=52&quot; target=&quot;_blank&quot;&amp;gt;集线器广播/交换机通过MAC表转发&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;DHCP协议&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=588.4&amp;amp;p=53&quot; target=&quot;_blank&quot;&amp;gt;&lt;strong&gt;发现报文 Discover&lt;/strong&gt;的组成&amp;lt;/a&amp;gt;、&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=857.2&amp;amp;p=53&quot; target=&quot;_blank&quot;&amp;gt;非DHCP服务器过程（端口号才发现错误/丢弃）&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1034.4&amp;amp;p=53&quot; target=&quot;_blank&quot;&amp;gt;&lt;strong&gt;提供报文 Offer&lt;/strong&gt;&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1318.6&amp;amp;p=53&quot; target=&quot;_blank&quot;&amp;gt;&lt;strong&gt;请求报文 Request&lt;/strong&gt;&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1598.1&amp;amp;p=53&quot; target=&quot;_blank&quot;&amp;gt;&lt;strong&gt;确认报文 ACK&lt;/strong&gt;&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;ICMP协议（网际控制报文协议）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ICMP报文的常见分类
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;差错控制报告&lt;/strong&gt;：直接传输数据报，有问题就反馈给发送方&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;询问报文&lt;/strong&gt;：传送之前，先询问接收方，确保网络通畅&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;怎么区分分类？ ICMP最先&lt;strong&gt;1B&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;差错控制报告&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;终点不可达&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=509.2&amp;amp;p=54&quot; target=&quot;_blank&quot;&amp;gt;路由器返回&amp;lt;/a&amp;gt;：目的IP地址不可到达，路由器返回ICMP报文告诉发送方终点不可达；&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=676.7&amp;amp;p=54&quot; target=&quot;_blank&quot;&amp;gt;目的主机的端口不存在&amp;lt;/a&amp;gt;：目的主机告诉发送方进程不存在&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间超过&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=749.7&amp;amp;p=54&quot; target=&quot;_blank&quot;&amp;gt;路由器返回&amp;lt;/a&amp;gt;：IP数据报的TTL=0，被丢掉；&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=857.7&amp;amp;p=54&quot; target=&quot;_blank&quot;&amp;gt;目的主机返回&amp;lt;/a&amp;gt;：IP数据报被分片，但是规定时间内分片没有到齐 → 全部丢弃&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数问题&lt;/strong&gt;
&amp;lt;br&amp;gt;检测出IP首部错误/参数不合法，路由器把IP数据报丢弃&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改变路由（重定向）&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1044.8&amp;amp;p=54&quot; target=&quot;_blank&quot;&amp;gt;路由器告诉发送方&amp;lt;/a&amp;gt;：对于某目的网络，发送到另一个路由器更近，下一次发送到该目的网络时 改变路由&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;询问报文&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Echo Request、Echo Reply&lt;/strong&gt;（回送请求/回送回答ping）
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1322.0&amp;amp;p=54&quot; target=&quot;_blank&quot;&amp;gt;过程&amp;lt;/a&amp;gt;：源地址发送ICMP请求，目的地址返回ICMP回答 告诉当前道路是否通畅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间戳请求、时间戳回答&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1615.8&amp;amp;p=54&quot; target=&quot;_blank&quot;&amp;gt;过程&amp;lt;/a&amp;gt;：源地址的时间xx，目的地址收到时间戳的时间yy，发送ICMP报文的时间是zz&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不必反馈&lt;/strong&gt;ICMP差错报告报文的&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1704.7&amp;amp;p=54&quot; target=&quot;_blank&quot;&amp;gt;情况&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;IPv6&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;对比&lt;/strong&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;选项&lt;/th&gt;
&lt;th&gt;IPv4&lt;/th&gt;
&lt;th&gt;IPv6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;位数&lt;/td&gt;
&lt;td&gt;32bit&lt;/td&gt;
&lt;td&gt;128bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;转换&lt;/td&gt;
&lt;td&gt;8位，二进制 → 十进制&lt;/td&gt;
&lt;td&gt;4×4位，十六进制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分片&lt;/td&gt;
&lt;td&gt;源主机/路由器&lt;/td&gt;
&lt;td&gt;只有源主机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;地址组成（same）&lt;/td&gt;
&lt;td&gt;网络号+主机号&lt;/td&gt;
&lt;td&gt;前缀+接口标识符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据报结构&lt;/td&gt;
&lt;td&gt;略&lt;/td&gt;
&lt;td&gt;略&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6下的数据报结构&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv4到IPv6的迁移&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双栈协议&lt;/strong&gt;：设备同时支持IPv4、IPv6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隧道技术&lt;/strong&gt;：IPv6封装进IPv4的数据部分。IPv4的数据报 = 首部 + 数据（IPv6数据报）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;路由协议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;路由算法&lt;/li&gt;
&lt;li&gt;分层次的路由协议&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;RIP&lt;/h3&gt;
&lt;p&gt;&amp;lt;u&amp;gt;应用层&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=649.0&amp;amp;p=59&quot; target=&quot;_blank&quot;&amp;gt;定时更新过程/触发响应&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;路由表 = 目的网络 + 距离 + 下一跳路由器&lt;/li&gt;
&lt;li&gt;路由表更新过程
&lt;ol&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=188.0&amp;amp;p=60&quot; target=&quot;_blank&quot;&amp;gt;初始路由表&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=416.6&amp;amp;p=60&quot; target=&quot;_blank&quot;&amp;gt;每次给邻居发送RIP Response报文&amp;lt;/a&amp;gt;：目的网络号不变，距离+1，下一路由器 → 转发来的路由器&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=978.6&amp;amp;p=60&quot; target=&quot;_blank&quot;&amp;gt;每隔30s，更新&amp;lt;/a&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;margin-top:0px&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-104.png&quot; alt=&quot;最初分类&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;慢收敛现象&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=183.0&amp;amp;p=62&quot; target=&quot;_blank&quot;&amp;gt;超过180s&amp;lt;/a&amp;gt;没收到邻居路由器 → 设为16，认为不可达
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=293.0&amp;amp;p=62&quot; target=&quot;_blank&quot;&amp;gt;更新&amp;lt;/a&amp;gt;：但还会通过其他Router路由表形成&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=399.6&amp;amp;p=62&quot; target=&quot;_blank&quot;&amp;gt;环路&amp;lt;/a&amp;gt;，直到 TTL=0 才丢弃&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=537.0&amp;amp;p=62&quot; target=&quot;_blank&quot;&amp;gt;更新&amp;lt;/a&amp;gt; → 左脚踩右脚（R3通过R4可以到Net2，R4通过R3可以到Net2）
&amp;lt;div style=&quot;flex: 1; text-align: center;margin-top:0px&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-105.png&quot; alt=&quot;最初分类&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=756.3&amp;amp;p=62&quot; target=&quot;_blank&quot;&amp;gt;发现错误&amp;lt;/a&amp;gt;：每次迭代距离+1，直到加到16才知道不可达
&lt;ul&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=71.3&amp;amp;p=63&quot; target=&quot;_blank&quot;&amp;gt;重新接入路由器&amp;lt;/a&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=244.0&amp;amp;p=63&quot; target=&quot;_blank&quot;&amp;gt;下一个30s，更新&amp;lt;/a&amp;gt; ：每一对Router的周期可以不同&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;RIP的优缺点&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;OSPF&lt;/h3&gt;
&lt;p&gt;&amp;lt;u&amp;gt;网络层&amp;lt;/u&amp;gt;，边带权&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建立单链表
&amp;lt;div style=&quot;flex: 1; text-align: center;margin-top:0px&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-1051.png&quot; alt=&quot;最初分类&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;基础
&lt;ul&gt;
&lt;li&gt;洪泛法：转发到除了入口之外的出口（不回流）
&amp;lt;br&amp;gt;检测到邻居的变化 → 洪泛最新的链表信息&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV1uT4y1p7Jy?t=58.5&quot; target=&quot;_blank&quot;&amp;gt;Dijstra算法&amp;lt;/a&amp;gt;：每次看总共的最短路径&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;怎么生成路由表？
&amp;lt;br&amp;gt;构造本地链路状态数据库 &lt;strong&gt;LSDB&lt;/strong&gt;（临界表） → Dijkstra算法计算最短路径 → 根据结果，构造&lt;strong&gt;路由表&lt;/strong&gt;
&amp;lt;br&amp;gt;若网络拓扑变化 → 引起洪泛 → 基于新的网络重新计算路由表
&amp;lt;div style=&quot;flex: 1; text-align: center;margin-top:0px&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-1052.png&quot; alt=&quot;区域划分&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=681.2&amp;amp;p=65&quot; target=&quot;_blank&quot;&amp;gt;&lt;strong&gt;“区域”划分&lt;/strong&gt;&amp;lt;/a&amp;gt;：系统过大，洪泛压力过大，Dijsktra运算开销也过大
&amp;lt;div style=&quot;flex: 1; text-align: center;margin-top:0px&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-106.png&quot; alt=&quot;区域划分&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;（选学）具体过程
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=401.9&amp;amp;p=66&quot; target=&quot;_blank&quot;&amp;gt;HELLO 问候分组&amp;lt;a&amp;gt;：每10s发送，超过40s说明另据不存在
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=726.8&amp;amp;p=66&quot; target=&quot;_blank&quot;&amp;gt;DD 数据库描述分组&amp;lt;/a&amp;gt;：告诉对方自己有的信息
&amp;lt;br&amp;gt;LSR 链路状态请求分组：想要对方的哪些信息
&amp;lt;br&amp;gt;LSU ；链路状态更新分组：响应请求，给对方发送需要的信息
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1012.7&amp;amp;p=66&quot; target=&quot;_blank&quot;&amp;gt;LSAck 链路状态确认分组&amp;lt;/a&amp;gt;：告诉对方已经收到需要的数据
&lt;ul&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1133.0&amp;amp;p=66&quot; target=&quot;_blank&quot;&amp;gt;LSU分组可能引发的洪泛&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;BGP协议&lt;/h3&gt;
&lt;p&gt;&amp;lt;u&amp;gt;应用层&amp;lt;/u&amp;gt;，基于&amp;lt;u&amp;gt;TCP协议&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=114.1&amp;amp;p=68&quot; target=&quot;_blank&quot;&amp;gt;eBGP&amp;lt;/a&amp;gt;：发送BGP报文[目的网络，所属AS，下一跳路由器]
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=346.1&amp;amp;p=68&quot; target=&quot;_blank&quot;&amp;gt;iBGP&amp;lt;/a&amp;gt;：BGP报文不修改 → 根据内部网关协议IGP，找到到达下一跳Router最短路径的路由器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BGP路由选择&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;本地偏好值最高（优先级）&lt;/li&gt;
&lt;li&gt;AS跳数最少&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热土豆路由&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;网络内部协议不同的处理：
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=461.6&amp;amp;p=69&quot; target=&quot;_blank&quot;&amp;gt;RIP协议&amp;lt;/a&amp;gt;
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=544.6&amp;amp;p=69&quot; target=&quot;_blank&quot;&amp;gt;OSPF协议&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BGP的4种报文&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=39.1&amp;amp;p=70&quot; target=&quot;_blank&quot;&amp;gt;OPEN报文&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;移动IP&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=502.0&amp;amp;p=72&quot; target=&quot;_blank&quot;&amp;gt;A在归属网络&amp;lt;/a&amp;gt;：和前面一样，直接传数据报&lt;/li&gt;
&lt;li&gt;A不在归属网络&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;接收IP数据报
&amp;lt;br&amp;gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=813.1&amp;amp;p=72&quot; target=&quot;_blank&quot;&amp;gt;两次登记&amp;lt;/a&amp;gt;、&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=689.5&amp;amp;p=72&quot; target=&quot;_blank&quot;&amp;gt;隧道&amp;lt;/a&amp;gt;、&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=812.9&amp;amp;p=72&quot; target=&quot;_blank&quot;&amp;gt;全过程&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=936.5&amp;amp;p=72&quot; target=&quot;_blank&quot;&amp;gt;发送IP数据报&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;U6 传输层&lt;/h1&gt;
&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;image-104.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;UDP vs TCP&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;UDP&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;TCP&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;首部&lt;/td&gt;
&lt;td&gt;很&lt;strong&gt;小&lt;/strong&gt;，&lt;strong&gt;8B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;更&lt;strong&gt;大&lt;/strong&gt;，20~60B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;报文传输&lt;/td&gt;
&lt;td&gt;传输完整报文，&lt;strong&gt;不支持&lt;/strong&gt;报文拆分/重装&lt;/td&gt;
&lt;td&gt;支持报文自动拆分/重装&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连接性 &amp;amp; 可靠性&lt;/td&gt;
&lt;td&gt;无连接、不可靠（交给应用层处理）&lt;/td&gt;
&lt;td&gt;有连接、可靠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;拥塞控制&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;不支持&lt;/strong&gt;拥塞控制&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;支持&lt;/strong&gt;拥塞控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;传输方式&lt;/td&gt;
&lt;td&gt;一对一/&lt;strong&gt;一对多&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;只支持一对一传输&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;UDP一对多：封装成IP数据报时，IP首部为广播首部 → 会转发给不同网络中相同端口号的进程&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;UDP&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;数据报格式&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;TCP&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=664.6&amp;amp;p=77&quot; target=&quot;_blank&quot;&amp;gt;面向字节流&amp;lt;/a&amp;gt;：UDP协议时面向报文的（把完整应用层报文 → 封装到UDP数据报→ 封装到IP数据报）
&lt;img src=&quot;image-105.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;TCP报文段格式
&lt;img src=&quot;image-106.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=622.1&amp;amp;p=79&quot; target=&quot;_blank&quot;&amp;gt;建立连接（三次握手）&amp;lt;/a&amp;gt;&lt;/li&gt;
&lt;li&gt;释放连接（四次挥手）
&amp;lt;div style=&quot;flex: 1; text-align: center;margin-top:0px&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-107.png&quot; alt=&quot;区域划分&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;ul&gt;
&lt;li&gt;从客户发出挥手1，到客户进程进入CLOSE状态，至少需要多久?一-1RTT+2MSL&lt;/li&gt;
&lt;li&gt;从客户发出握手1，到服务器进程进程进入CLOSE状态，至少需要多久?一-1.5RTT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;TCP传输的过程&lt;/h3&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;三次握手
&amp;lt;iframe
width=&quot;100%&quot;
height=&quot;468&quot;
src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=81&amp;amp;t=795.1&amp;amp;danmaku=0&amp;amp;autoplay=0&quot;
title=&quot;Bilibili video player&quot;
frameborder=&quot;0&quot;
allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TCP传输的过程&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;发送3bit → Server检查有无比特错误 → 没有就接收 → 发送TCP报文：ack=603（接下来期待收到的序号），rcvwnd=5
&amp;lt;br&amp;gt;Client 就把发送成功的3bit移出buffer缓冲区 → 读入后面的数据 → 根据发来的rcvwnd动态调整&lt;strong&gt;发送buffer&lt;/strong&gt;为5
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=82&amp;amp;t=8.9&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;累积确认&lt;/strong&gt;：连续收到多个报文段，只返回1个ACK
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=82&amp;amp;t=320.0&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接收缓冲区满了 → &lt;strong&gt;清空接收缓冲区&lt;/strong&gt; → 发送TCP数据报：ACK=609，rwnd=8
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=82&amp;amp;t=530.8&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;捎带确认&lt;/strong&gt;：确认+数据
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=82&amp;amp;t=695.3&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;超时重传&lt;/strong&gt;
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=82&amp;amp;t=1518.7&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;TCP拥塞控制&lt;/h3&gt;
&lt;img src=&quot;image-107.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;例
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=85&amp;amp;t=2173.6&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;U7 应用层&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;网络应用模型&lt;/strong&gt;：C/S模型、P2P模型&lt;/p&gt;
&lt;h2&gt;DNS域名系统&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;基础
&lt;ul&gt;
&lt;li&gt;协议工作原理&lt;/li&gt;
&lt;li&gt;域名划分 -顶级域名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS四类域名服务器&lt;/strong&gt;
&lt;img src=&quot;image-110.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS查询方式&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1376.8&amp;amp;p=90&quot; target=&quot;_balnk&quot;&amp;gt;递归查询&amp;lt;/a&amp;gt;：你问我问题，我想方设法帮你找到最终答案。
&lt;img src=&quot;image-109.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV19E411D78Q?t=1628.8&amp;amp;p=90 target=&quot;_balnk&quot;&amp;gt;递归查询&amp;lt;/a&amp;gt;：你问我问题，我如果不知道最终答案，就告诉你你“下一个该问谁”（踢皮球）
&lt;img src=&quot;image-108.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;FTP&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;登录&lt;/strong&gt;
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=91&amp;amp;t=647.3&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据传输&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主动模式&lt;/strong&gt;：客户端告诉Server，想要Server主动传输数据
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=91&amp;amp;t=947.6&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;被动模式&lt;/strong&gt;：Client传给Server
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=91&amp;amp;t=1298.8&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;总结
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=91&amp;amp;t=2088.3&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;电子邮件&lt;/h2&gt;
&lt;p&gt;过程
&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://player.bilibili.com/player.html?bvid=BV19E411D78Q&amp;amp;p=92&amp;amp;t=1469.4&amp;amp;danmaku=0&amp;amp;autoplay=0&quot; title=&quot;Bilibili video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h2&gt;万维网 www&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;访问网络的背后&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应报文的分类&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非连续连接&lt;/strong&gt;：可以连续建立3个/图片.png的TCP连接
&amp;lt;div style=&quot;flex: 1; text-align: center;margin-top:0px&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-112.png&quot; alt=&quot;区域划分&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续连接&lt;/strong&gt;：流水线方式/非流水线方式
&amp;lt;div style=&quot;flex: 1; text-align: center;margin-top:0px&quot;&amp;gt;
&amp;lt;img src=&quot;/images/http1.png&quot; alt=&quot;区域划分&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;img src=&quot;/images/http2.png&quot; alt=&quot;区域划分&quot; style=&quot;width: 100%;margin: 0; padding: 0;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>数据管理基础</title><link>https://lilyly9.github.io/posts/%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86%E5%9F%BA%E7%A1%80/</guid><description>PPT字好多，😵‍💫笔者晕字ing…</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;成绩组成 4:6&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#c1-%E7%BB%AA%E8%AE%BA&quot;&gt;C1 绪论&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5&quot;&gt;数据库的基本概念&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B%E7%9A%84%E7%BB%84%E6%88%90%E8%A6%81%E7%B4%A0--%E5%B8%B8%E7%94%A8%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B&quot;&gt;数据模型的组成要素 &amp;amp; 常用数据模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%B8%89%E7%BA%A7%E6%A8%A1%E5%BC%8F&quot;&gt;数据库的三级模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%A4%E7%A7%8D%E6%95%B0%E6%8D%AE%E7%8B%AC%E7%AB%8B%E6%80%A7&quot;&gt;两种数据独立性&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#c2-%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E5%BA%93&quot;&gt;C2 关系数据库&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84&quot;&gt;关系数据结构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%85%B3%E7%B3%BB%E7%9A%84%E5%AE%8C%E6%95%B4%E6%80%A7%E7%BA%A6%E6%9D%9F&quot;&gt;⭐关系的完整性约束&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0&quot;&gt;⭐关系代数&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#c3-sql&quot;&gt;C3 SQL&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%9F%BA%E6%9C%AC%E8%A1%A8-table&quot;&gt;基本表 TABLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%A7%86%E5%9B%BE-view&quot;&gt;视图 VIEW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BE%8B%E9%A2%98&quot;&gt;⭐例题&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%89%E5%85%A8%E6%80%A7&quot;&gt;⭐数据库安全性&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#sql%E6%95%B0%E6%8D%AE%E5%AE%9A%E4%B9%89&quot;&gt;SQL数据定义&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AE%9A%E4%B9%89%E5%88%A0%E9%99%A4%E6%A8%A1%E5%BC%8Fcreatedrop-schema&quot;&gt;定义/删除模式（CREATE/DROP SCHEMA）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%B4%A2%E5%BC%95-index&quot;&gt;索引 INDEX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0-vs-sql%E8%AF%AD%E8%A8%80&quot;&gt;关系代数 vs SQL语言&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sql%E6%95%B0%E6%8D%AE%E6%9F%A5%E8%AF%A2&quot;&gt;SQL数据查询&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%8D%95%E8%A1%A8%E6%9F%A5%E8%AF%A2&quot;&gt;单表查询&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A2%E5%A4%9A%E8%A1%A8&quot;&gt;连接查询（多表）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%B5%8C%E5%A5%97%E6%9F%A5%E8%AF%A2%E5%AD%90%E6%9F%A5%E8%AF%A2&quot;&gt;嵌套查询（子查询）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%81%9A%E9%9B%86%E5%87%BD%E6%95%B0%E7%BB%9F%E8%AE%A1%E5%87%BD%E6%95%B0&quot;&gt;聚集函数/统计函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AF%B9%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%9C%E7%9A%84%E5%A4%84%E7%90%86&quot;&gt;对查询结果的处理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%9B%86%E5%90%88%E6%93%8D%E4%BD%9C&quot;&gt;集合操作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%9F%BA%E4%BA%8E%E6%B4%BE%E7%94%9F%E8%A1%A8%E7%9A%84%E6%9F%A5%E8%AF%A2&quot;&gt;基于派生表的查询&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E6%9B%B4%E6%96%B0&quot;&gt;数据更新&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BA%8B%E5%8A%A1&quot;&gt;事务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sql%E4%B8%AD%E7%9A%84%E7%A9%BA%E5%80%BC&quot;&gt;SQL中的空值&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%A7%86%E5%9B%BE&quot;&gt;视图&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#c4-%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7&quot;&gt;C4 数据库的安全性&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E6%80%A7%E6%A6%82%E8%BF%B0&quot;&gt;数据安全性概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%89%E5%85%A8%E6%80%A7%E6%8E%A7%E5%88%B6&quot;&gt;数据库安全性控制&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E9%89%B4%E5%88%AB&quot;&gt;用户身份鉴别&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6&quot;&gt;存取控制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%87%AA%E4%B8%BB%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6-dac&quot;&gt;自主存取控制 DAC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A7%92%E8%89%B2-role&quot;&gt;数据库角色 ROLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%BC%BA%E5%88%B6%E5%AD%98%E5%8F%96%E6%8E%A7%E5%88%B6-mac&quot;&gt;强制存取控制 MAC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%85%B6%E4%BB%96%E5%AE%89%E5%85%A8%E6%8A%80%E6%9C%AF&quot;&gt;其他安全技术&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#grant%E8%AF%AD%E5%8F%A5&quot;&gt;GRANT语句&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#c6-%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E7%90%86%E8%AE%BA&quot;&gt;C6 关系数据理论&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%97%AE%E9%A2%98%E7%9A%84%E6%8F%90%E5%87%BA&quot;&gt;问题的提出&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%85%B3%E7%B3%BB%E6%A8%A1%E5%BC%8F--%E7%AC%AC%E4%B8%80%E8%8C%83%E5%BC%8F1nf&quot;&gt;关系模式 &amp;amp; 第一范式(1NF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%8D%E8%89%AF%E5%85%B3%E7%B3%BB%E6%A8%A1%E5%BC%8F%E7%9A%84%E9%97%AE%E9%A2%98&quot;&gt;不良关系模式的问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E4%BE%9D%E8%B5%96%E5%9F%BA%E7%A1%80&quot;&gt;数据依赖基础&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%8C%83%E5%BC%8F%E4%B8%8E%E8%A7%84%E8%8C%83%E5%8C%96&quot;&gt;范式与规范化&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96--%E7%A0%81&quot;&gt;函数依赖 &amp;amp; 码&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%80%E5%B8%B8%E7%94%A8%E7%AC%A6%E5%8F%B7%E8%A1%A8%E7%A4%BA&quot;&gt;一、常用符号表示&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BA%8C%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96-fd&quot;&gt;二、函数依赖 FD&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-%E5%B9%B3%E5%87%A1%E9%9D%9E%E5%B9%B3%E5%87%A1%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96&quot;&gt;1. 平凡/非平凡函数依赖&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%E5%AE%8C%E5%85%A8%E9%83%A8%E5%88%86%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96&quot;&gt;2. 完全/部分函数依赖&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%E4%BC%A0%E9%80%92%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96&quot;&gt;3. 传递函数依赖&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%89%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96%E7%9A%84%E5%88%A4%E5%AE%9A%E8%A7%84%E5%88%99&quot;&gt;三、函数依赖的判定规则&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%9B%9B%E7%A0%81%E4%B8%8E%E7%9B%B8%E5%85%B3%E6%A6%82%E5%BF%B5&quot;&gt;四、⭐码与相关概念&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BE%8B&quot;&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%8C%83%E5%BC%8F--%E8%A7%84%E8%8C%83%E5%8C%96&quot;&gt;范式 &amp;amp; 规范化&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%80%E6%A0%B8%E5%BF%83%E6%A6%82%E8%BF%B0&quot;&gt;一、核心概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BA%8C1nf%E7%AC%AC%E4%B8%80%E8%8C%83%E5%BC%8F&quot;&gt;二、1NF（第一范式）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%892nf%E7%AC%AC%E4%BA%8C%E8%8C%83%E5%BC%8F&quot;&gt;三、2NF（第二范式）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%9B%9B3nf%E7%AC%AC%E4%B8%89%E8%8C%83%E5%BC%8F&quot;&gt;四、3NF（第三范式）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BA%94bcnf%E5%B7%B4%E6%96%AF%E8%8C%83%E5%BC%8F&quot;&gt;五、BCNF（巴斯范式）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4nf%E7%AC%AC%E5%9B%9B%E8%8C%83%E5%BC%8F&quot;&gt;4NF（第四范式）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#armstrong%E5%85%AC%E7%90%86%E7%B3%BB%E7%BB%9F&quot;&gt;Armstrong公理系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%A8%A1%E5%BC%8F%E5%88%86%E8%A7%A3&quot;&gt;模式分解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%88%86%E8%A7%A3%E5%90%8E%E5%8E%9F%E6%9D%A5%E7%9A%84%E5%87%BD%E6%95%B0%E4%BE%9D%E8%B5%96%E8%83%BD%E5%9C%A8%E5%AD%90%E5%85%B3%E7%B3%BB%E4%B8%AD%E7%9B%B4%E6%8E%A5%E6%A3%80%E6%9F%A5&quot;&gt;分解后，&lt;strong&gt;原来&lt;/strong&gt;的函数依赖能在&lt;strong&gt;子关系&lt;/strong&gt;中&lt;strong&gt;直接检查&lt;/strong&gt;。&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#3nf%E6%A8%A1%E5%BC%8F%E5%88%86%E8%A7%A3&quot;&gt;🌟3NF模式分解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bcnf-%E6%A8%A1%E5%BC%8F%E5%88%86%E8%A7%A3&quot;&gt;🌟BCNF 模式分解&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%A4%9A%E5%80%BC%E4%BE%9D%E8%B5%96&quot;&gt;多值依赖&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#c6%E4%BE%8B%E9%A2%98&quot;&gt;🌟C6例题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#c7-%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1&quot;&gt;C7 数据库设计&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%96%B9%E6%B3%95&quot;&gt;数据库设计的基本方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1%E5%9F%BA%E6%9C%AC%E6%AD%A5%E9%AA%A4%E6%96%B0%E5%A5%A5%E5%B0%94%E8%89%AF%E6%B3%95&quot;&gt;数据库设计基本步骤（新奥尔良法）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90&quot;&gt;1. 需求分析&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%E6%A6%82%E5%BF%B5%E7%BB%93%E6%9E%84%E8%AE%BE%E8%AE%A1&quot;&gt;2. 概念结构设计&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#e-r%E6%A8%A1%E5%9E%8B&quot;&gt;E-R模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%81%94%E7%B3%BB&quot;&gt;联系&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%80%8E%E4%B9%88%E7%94%BBe-r%E5%9B%BE&quot;&gt;⭐怎么画E-R图？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ee-r%E6%A8%A1%E5%9E%8B&quot;&gt;EE-R模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#e-r%E6%A8%A1%E5%9E%8B%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99&quot;&gt;E-R模型设计原则&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#i%E5%AE%9E%E4%BD%93-or-%E5%B1%9E%E6%80%A7&quot;&gt;i、实体 or 属性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ii%E5%AE%9E%E4%BD%93-or-%E8%81%94%E7%B3%BB&quot;&gt;ii、实体 or 联系&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#iii%E4%BA%8C%E5%85%83%E8%81%94%E7%B3%BB-or-%E5%A4%9A%E5%85%83%E8%81%94%E7%B3%BB&quot;&gt;iii、二元联系 or 多元联系&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#iv%E5%B1%9E%E6%80%A7%E4%BE%9D%E9%99%84%E4%BA%8E%E5%AE%9E%E4%BD%93-or-%E8%81%94%E7%B3%BB&quot;&gt;iv、属性依附于实体 or 联系&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#e-r%E5%9B%BE%E9%9B%86%E6%88%90&quot;&gt;E-R图集成&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%E9%80%BB%E8%BE%91%E7%BB%93%E6%9E%84%E8%AE%BE%E8%AE%A1&quot;&gt;3. 逻辑结构设计&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B%E4%BC%98%E5%8C%96&quot;&gt;数据模型优化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%89%A9%E7%90%86%E7%BB%93%E6%9E%84%E8%AE%BE%E8%AE%A1&quot;&gt;物理结构设计&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%9E%E6%96%BD&quot;&gt;数据库实施&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#c8-%E6%95%B0%E6%8D%AE%E5%BA%93%E7%BC%96%E7%A8%8B&quot;&gt;⭐C8 数据库编程&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%B5%8C%E5%85%A5%E5%BC%8Fsql&quot;&gt;嵌入式SQL&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86&quot;&gt;异常处理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%B8%8D%E7%94%A8%E6%B8%B8%E6%A0%87%E7%9A%84sql%E8%AF%AD%E5%8F%A5&quot;&gt;不用游标的SQL语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E6%B8%B8%E6%A0%87%E7%9A%84sql%E8%AF%AD%E5%8F%A5&quot;&gt;使用游标的SQL语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%8A%A8%E6%80%81sql&quot;&gt;动态SQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%BF%87%E7%A8%8B%E5%8C%96sql&quot;&gt;过程化SQL&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%BF%87%E7%A8%8B%E5%8C%96sql%E7%9A%84%E5%9D%97%E7%BB%93%E6%9E%84&quot;&gt;过程化SQL的块结构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#plsql%E5%8F%98%E9%87%8F%E5%92%8C%E5%B8%B8%E9%87%8F%E7%9A%84%E5%AE%9A%E4%B9%89&quot;&gt;PL/SQL变量和常量的定义&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6&quot;&gt;流程控制&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B%E5%92%8C%E5%87%BD%E6%95%B0&quot;&gt;存储过程和函数&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;C1 绪论&lt;/h1&gt;
&lt;h3&gt;数据库的基本概念&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;⭐数据库、DBMS、数据库系统&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数据库 DB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;长期存储、有组织、可共享的大量&lt;strong&gt;数据的集合&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数据库管理系统 DBMS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;管理数据库的&lt;strong&gt;软件&lt;/strong&gt;，位于应用程序和数据库之间（如 MySQL、Oracle、SQLSever）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;**数据库系统 DBS **&lt;/td&gt;
&lt;td&gt;数据库、DBMS、应用程序、数据库管理员、硬件等构成的整体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数据库应用系统&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;面向具体业务开发的&lt;strong&gt;应用程序&lt;/strong&gt;及其&lt;strong&gt;数据库环境&lt;/strong&gt; = 数据库 + DBMS + 应用程序 + 数据库管理员 +硬件环境&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⭐文件系统 vs 数据库&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比角度&lt;/th&gt;
&lt;th&gt;文件方式&lt;/th&gt;
&lt;th&gt;数据库方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;分散/统一&lt;/td&gt;
&lt;td&gt;数据分散在不同文件&lt;/td&gt;
&lt;td&gt;数据统一组织和管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;共享&lt;/td&gt;
&lt;td&gt;共享困难&lt;/td&gt;
&lt;td&gt;支持多用户共享&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;冗余&lt;/td&gt;
&lt;td&gt;冗余较多&lt;/td&gt;
&lt;td&gt;可以控制冗余&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;耦合/独立&lt;/td&gt;
&lt;td&gt;程序与数据耦合较强&lt;/td&gt;
&lt;td&gt;具有数据独立性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性质&lt;/td&gt;
&lt;td&gt;一致性、安全性难保证&lt;/td&gt;
&lt;td&gt;DBMS 统一保证完整性、安全和并发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用场景&lt;/td&gt;
&lt;td&gt;适合简单、独立的小规模数据&lt;/td&gt;
&lt;td&gt;适合长期、共享、结构化业务数据&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据管理技术的**&lt;em&gt;产生和发展&lt;/em&gt;**：人工管理阶段 → 文件系统阶段 → 数据库系统阶段&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据库系统的&amp;lt;u&amp;gt;&lt;strong&gt;&lt;em&gt;特点&lt;/em&gt;&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据结构化&lt;/li&gt;
&lt;li&gt;数据共享性高，冗余度低、易扩充&lt;/li&gt;
&lt;li&gt;数据独立性高&lt;/li&gt;
&lt;li&gt;数据由数据库管理系统 统一管理和控制&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;数据模型的组成要素 &amp;amp; 常用数据模型&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;⭐数据模型&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;两大类、共三种数据模型：&lt;strong&gt;概念&lt;/strong&gt;数据模型、 &lt;strong&gt;逻辑&lt;/strong&gt;数据模型、&lt;strong&gt;物理&lt;/strong&gt;数据模型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据模型的&lt;strong&gt;组成要素&lt;/strong&gt;：&amp;lt;u&amp;gt;数据结构、数据操作、数据约束&amp;lt;/u&amp;gt;
（二维关系表、原则/插入等、实体完整性）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;⭐关系模型基本概念&lt;/h4&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 100%; gap: 0px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/relationModel1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/relationModel2.png&quot; alt=&quot;象集2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;!-- ii. 规范化（要满足1FN：每个分量是原子的）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;image-29.png&quot; alt=&quot;alt text&quot; /&gt; --&amp;gt;
&amp;lt;!-- 2.  #### 概念模型
&amp;lt;span id=&quot;概念模型&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实体之间的联系/实体内部的联系
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 0px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/stzj.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/stnb.png&quot; alt=&quot;象集2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;实体-联系方法 E-R模型
&amp;lt;div style=&quot;display: flex; width: 100%; gap: -10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er1.png&quot; alt=&quot;er1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er2.png&quot; alt=&quot;er2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er3.png&quot; alt=&quot;er3&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;display: flex; width: 100%; gap: -10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er4.png&quot; alt=&quot;er4&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er5.png&quot; alt=&quot;er5&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er6.png&quot; alt=&quot;er6&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;数据库的三级模式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;从数据库应用开发人员角度看，数据库通常采用 &amp;lt;u&amp;gt;&lt;strong&gt;三级模式结构&lt;/strong&gt;&amp;lt;/u&amp;gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层次&lt;/th&gt;
&lt;th&gt;描述内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;外模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;某一类用户看到的局部数据，也叫用户视图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;模式/概念模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;整个数据库的全局逻辑结构&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;内模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;数据的物理存储结构、文件组织和存取路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;img_17.png&quot; alt=&quot;图片描述&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;两种数据独立性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;逻辑数据独立性&lt;/strong&gt;：&amp;lt;u&amp;gt;概念模式&amp;lt;/u&amp;gt;改变时，外模式和应用程序尽量不用改变。
&amp;lt;br&amp;gt;例如增加一个属性，只需调整外模式与概念模式之间的映像，原有应用仍可使用原来的视图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;物理数据独立性&lt;/strong&gt;：&amp;lt;u&amp;gt;内模式&amp;lt;/u&amp;gt;改变时，概念模式和应用程序不用改变。
&amp;lt;br&amp;gt;例如把顺序文件改成 B+ 树索引，应用程序仍然执行相同的 SQL。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;C2 关系数据库&lt;/h1&gt;
&lt;h3&gt;关系数据结构&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;关系
&lt;ol&gt;
&lt;li&gt;关系模型只有单一的数据结构：关系；&amp;lt;br&amp;gt;关系模型的逻辑结构：二维表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关系&lt;/strong&gt;：在域 $D_1, D_2, \dots, D_n$ 上的关系 $R$ 也是一个 $n$ 元有序组的集合，
并且是其笛卡尔积的一个 &lt;strong&gt;子集&lt;/strong&gt;：$R \subseteq D_1 \times D_2 \times \dots \times D_n$
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;属性&lt;/strong&gt;：二维表中的 &lt;strong&gt;每一列&lt;/strong&gt;，被称为是该关系中的一个‘属性’&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;元组 tuple&lt;/strong&gt;：二维表中的 &lt;strong&gt;每一行&lt;/strong&gt;，$(d_1,d_2,…,d_n)$，$t[A_i]$表示元组t在属性 $A_i$上的取值；$t[i]$
表示元组t在第i列上的取值。如：(李敏君，软件工程专业，19)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分量&lt;/strong&gt;：元组中的每一个值$d_i$叫做一个分量.如：李敏君、软件工程专业、19
&amp;lt;br&amp;gt;元组连接：$t_r t_s$上弧线，表示把两个表连接起来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基数&lt;/strong&gt;：一个域允许的不同取值个数&lt;/li&gt;
&lt;li&gt;关系的表示：在域 $D_1,D_2,…,D_n$ 上的关系R可以被表示为 $R(A_1,A_2,…,A_n)$
&amp;lt;br&amp;gt;其中 $A_i$ 是属性名 eg:“专业”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域&lt;/strong&gt;
&amp;lt;br&amp;gt;相同数据类型的值的集合，域内元素互不相同。如：整数集合、{男，女}、char (25) 字符串集合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;（候选）码 Key&lt;/strong&gt;
&amp;lt;br&amp;gt;若关系中的某一 &lt;strong&gt;属性组&lt;/strong&gt; 的值能唯一地标识一个元组，而其所有的真子集都不能，则称该 &lt;strong&gt;属性组&lt;/strong&gt; 为关系的 ‘候选码’
，简称 ‘码’&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主码&lt;/strong&gt;：&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全码 All-key&lt;/strong&gt;：关系中的所有属性构成的属性组是这个关系的候选码，称为 ‘全码’（All-key）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主属性&lt;/strong&gt; 与 &lt;strong&gt;非主属性/非码属性&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;u&amp;gt;候选码&amp;lt;/u&amp;gt;中的诸属性称为该关系的 ‘主属性’（Prime attribute）&lt;/li&gt;
&lt;li&gt;不包含在任何侯选码中的属性称为该关系的 ‘非主属性’/‘非码属性’&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;⭐关系的完整性约束&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;实体完整性&lt;/strong&gt;
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;主码属性不能为空 NULL&amp;lt;/u&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参照完整性&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;u&amp;gt;外码值要么为空，要么等于被参照关系的主码值&amp;lt;/u&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外码&lt;/strong&gt;：
&amp;lt;br&amp;gt;参照关系：R（拿着外码的表，比如学生表）
&amp;lt;br&amp;gt;被参照关系：S（被引用主键的表，比如专业表）
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/outerMa1.png&quot; alt=&quot;外码1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/outerMa2.png&quot; alt=&quot;外码2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/outerMa3.png&quot; alt=&quot;外码2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户定义的完整性&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;⭐关系代数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关系运算&lt;/strong&gt;
&lt;img src=&quot;img_7.png&quot; alt=&quot;img_7.png&quot; /&gt;
选择：$\sigma_{Sdept=&apos;IS&apos;}(Student)$、投影：$\pi_{Sdept}(Student)$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;所有&lt;/strong&gt;：除运算÷；&lt;strong&gt;只&lt;/strong&gt;：
&lt;img src=&quot;image-111.png&quot; alt=&quot;alt text&quot; /&gt; &lt;img src=&quot;image-112.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;最大/最高&lt;/strong&gt;
在当前的所有顾客中, 查询折扣(discnt)最高的顾客的编号？
&amp;lt;br&amp;gt;令 $S := C$, “折扣不是最高的顾客的id”&lt;br /&gt;
$R_2 := \pi_{C.cid}(\sigma_{C.discnt &amp;lt; S.discnt}(C \times S))$
&amp;lt;br&amp;gt;答案是 $\pi_{cid}(C) - \pi_{C.cid}(\sigma_{C.discnt &amp;lt; S.discnt}(C \times S))$
&amp;lt;div style=&quot;display: flex; width:100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/tj.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/max1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width:100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/max2.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/max3.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;象集&lt;/strong&gt;
&amp;lt;br&amp;gt;该属性值对应的其他属性值集合，相当于除法
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 10px; margin: 5px 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/xj1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/xj2.png&quot; alt=&quot;象集2&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;!-- 3. 相容表（关系模式）
&amp;lt;br&amp;gt;目的：两个关系能不能做并、交、差运算。
&amp;lt;br&amp;gt;要求：（有相同的关系模式）属性个数相同，属性来自相同的域
&lt;img src=&quot;image-36.png&quot; alt=&quot;alt text&quot; /&gt; --&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;!-- ### 关系代数的基本运算
&lt;img src=&quot;img_9.png&quot; alt=&quot;img_9.png&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;并$\cup$、差-、笛卡尔积$\times$
&amp;lt;div style=&quot;display: flex; width: 100%; margin: -20px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exam1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exam2.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择 $\sigma_{Sub}=_{限定条件}(Obj)$  /   Student  where  SC = &apos;ISE&apos;
&amp;lt;br&amp;gt;题干：
&amp;lt;div style=&quot;display: flex; width: 100%; margin: -10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/course.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/student.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/sc.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/select1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/select2.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;投影 $\pi_{property1,property2}(Domain)$  /  $Domain[property]$
&amp;lt;div style=&quot;display: flex; width: 100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/ty1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/ty2.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/xt.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; --&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- ---&lt;/p&gt;
&lt;h3&gt;关系代数的补充运算&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;例
&lt;img src=&quot;image-111.png&quot; alt=&quot;alt text&quot; /&gt;  --&amp;gt;
&amp;lt;!-- &lt;img src=&quot;img_8.png&quot; alt=&quot;img_8.png&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;$\theta-$连接 $R \underset{C &amp;lt; E}{\bowtie} S$
&amp;lt;br&amp;gt;等值连接 $R \underset{C.B = E.B}{\bowtie} S$
&amp;lt;br&amp;gt;自然连接 $R \bowtie S$：把相同属性全都尽可能拼接到一起
&amp;lt;br&amp;gt;(左/右)外连接：加上悬浮元组
&amp;lt;div style=&quot;display: flex; width:100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/connect1.png&quot; alt=&quot;θ连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/connect2.png&quot; alt=&quot;等值连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/connect3.png&quot; alt=&quot;自然连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;display: flex; width:100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/connect4.png&quot; alt=&quot;外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/connect4.png&quot; alt=&quot;左右外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例
&amp;lt;div style=&quot;display: flex; width:100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/example1.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/example2.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/example3.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;除运算 R ÷ S&lt;/strong&gt;
&amp;lt;span id=&quot;除运算&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;br&amp;gt;找出R、S中相同的属性列(B、C)，R 剩下的属性列(A) 作为结果。
&amp;lt;br&amp;gt;$a_i$的所有($b_j$,$c_j$)，$a_i$包含S中的全部b、c。&lt;br /&gt;
&amp;lt;div style=&quot;display: flex; width:100%; margin: 2px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/div1.png&quot; alt=&quot;外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/div2.png&quot; alt=&quot;左右外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例
&amp;lt;div style=&quot;display: flex; width:100%; margin: 2px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/divExample.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/divExample2.png&quot; alt=&quot;象集1&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- - 综合例题
&amp;lt;span id=&quot;综合例题&quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;div style=&quot;display: flex; width:100%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/zhexamle1.png&quot; alt=&quot;外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/zhexamle2.png&quot; alt=&quot;左右外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/zhexamle3.png&quot; alt=&quot;左右外连接&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; --&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;C3 SQL&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;SQL基本执行结构&lt;pre&gt;&lt;code&gt;SELECT ...
 FROM ...
 WHERE ...
 GROUP BY ...
 HAVING ...
 ORDER BY ...;
&lt;/code&gt;&lt;/pre&gt;
逻辑顺序：&lt;code&gt;FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;基本表 TABLE&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;定义基本表
&amp;lt;br&amp;gt;&lt;strong&gt;PRIMARY KEY 主键&lt;/strong&gt;，唯一标识一行数据，不能重复、不能为空
&amp;lt;br&amp;gt;&lt;strong&gt;UNIQUE 唯一&lt;/strong&gt;，不能重复，但能为空
&amp;lt;br&amp;gt;&lt;strong&gt;外键&lt;/strong&gt; &lt;code&gt;FOREIGN KEY (cno) PREFERENCE course(cno) ON UPDATE/DELETE 规约条件&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE Student
    (Sno CHAR(9) PRIMARY KEY,  /* 列级完整性约束条件, Sno是**主码**/
    Sname CHAR(20) UNIQUE,  /* **约束**，Sname的取值具有唯一性*/
    Ssex CHAR(2) NOT NULL CHECK (Ssex IN (&apos;男&apos;, &apos;女&apos;)),/*  非空且只能是男/女 */
    Sage SMALLINT,
    Sdept CHAR(20)
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE enrollment(
    sno char(9) NOT NULL,
    clsno char(8) NOT NULL,
    grade INT CHECK (grade BETWEEN 0 AND 100),
    PRIMARY KEY(sno,clsno), -- 课程班代码和学号联合构成PRIMARY KEY
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE courseclass(
clsno char(8) PRIMARY KEY,
cno char(8) NOT NULL,
tno char(9) ,
-- 先定义再外键 + 违约规则
FOREIGN KEY (cno) REFERENCES coures(cno) ON UPDATE CASCADE ON DELETE RESTRICT,
FOREIGN KEY (tno) REFERENCES teachers(tno) ON UPDATE CASCADE ON DELETE SET NULL
-- 父表更新cno，子表cno自动同步更新；父表删除cno，子表还有该课程就禁止删除
-- 父表更新tno，子表tno自动同步更新；父表删除tno，子表对应的tno自动设为NULL
);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;违约规则
&amp;lt;br&amp;gt;什么是违约？ 父表更新主键/删除父表记录会破坏参照关系，触发违约
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;关键字&lt;/th&gt;
&lt;th&gt;中文&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CASCADE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;级联&lt;/td&gt;
&lt;td&gt;父表改 / 删 → 子表自动跟着改 / 删&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SET NULL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;置空&lt;/td&gt;
&lt;td&gt;父表删 → 子表外键自动设为 &lt;strong&gt;NULL&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RESTRICT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;限制 / 拒绝&lt;/td&gt;
&lt;td&gt;数据库直接&lt;strong&gt;禁止&lt;/strong&gt;父表的改/删操作&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;修改基本表&lt;/strong&gt;（ALTER TABLE）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ADD新增列/完整性约束&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
ADD COLUMN S_email VARCHAR(50) NOT NULL UNIQUE;  -- 增加邮箱列，要求非空且唯一
ADD CONSTRAINT chk_sex CHECK (Ssex IN (&apos;男&apos;, &apos;女&apos;));  -- 为 Ssex 增加 CHECK 约束（性别只能是男 / 女）
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;DROP 删除列&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
DROP COLUMN S_email CASCADE; --删除“邮箱”列，默认RESTRICT
DROP CONSTRAINT chk_sex; -- 删除性别CHECK约束
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;修改列的定义&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
ALTER COLUMN Sage INT;  -- 修改数据类型：年龄从SMALLINT改为INT
ALTER COLUMN Sname CHAR(30); -- 修改列长度（姓名从 CHAR (20) 改为 CHAR (30)）
ALTER TABLE Course ADD UNIQUE(Cname); -- 增加课程名称必须取唯一值的约束条件
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除基本表&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DROP TABLE &amp;lt;表名&amp;gt;［RESTRICT| CASCADE］;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RESTRICT&lt;/strong&gt;：只有在该表没有被其他数据库对象依赖时，才能删除。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CASCADE&lt;/strong&gt;：删除该表的同时，还会删除依赖于该表的相关对象或依赖关系&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;视图 VIEW&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;视图的作用？
&amp;lt;br&amp;gt;简化复杂查询；
&amp;lt;br&amp;gt;为不同用户提供不同数据视图；
&amp;lt;br&amp;gt;隐藏敏感属性，提高安全性；
&amp;lt;br&amp;gt;阻止不符合条件的数据加入/修改成不符合条件的数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定义视图 AS&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;CREATE VIEW S_G(Sno,Gavg) -- 可选：列名
AS
 SELECT Sno,AVG(Grade)
 FROM SC
 GROUP BY Sno;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查询视图&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新视图&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除视图&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;DROP VIEW S_G [RESTRICT | CASCADE]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;字符串匹配&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;⭐字符匹配 &lt;strong&gt;LIKE&lt;/strong&gt;/&lt;strong&gt;=&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT* FROM Student WHERE Sno LIKE &apos;24%&apos;  -- 通配符，查询学号以24开头的学生的详细信息
SELECT* FROM Student WHERE Sno = &apos;24%&apos; -- 查询学号就是&apos;24%&apos;学生的详细信息
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;⭐字符串中的通配符&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE &apos;刘%&apos;;  -- 查询所有姓刘学生的姓名、学号和性别

SELECT Sname
FROM Student
WHERE Sname LIKE &apos;欧阳_&apos;; -- 查询姓&quot;欧阳&quot;且全名为三个汉字的学生的姓名

SELECT Sname, Sno
FROM Student
WHERE Sname LIKE &apos;_阳%&apos;; -- 查询名字中第2个字为&quot;阳&quot;字的学生的姓名和学号

SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname NOT LIKE &apos;刘%&apos;; -- 查询所有不姓刘的学生姓名、学号和性别
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多表连接 JOIN&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;SELECT DISTINCT s.sid, s.sname
FROM Student s
JOIN Enroll e ON s.sid = e.sid
JOIN Course c ON e.cid = c.cid
WHERE c.cname = &apos;数据管理基础&apos;
AND c.dept = &apos;智软学院&apos;;
&lt;/code&gt;&lt;/pre&gt;
使用 DISTINCT 是为了消除同一学生由于多条匹配记录产生的重复
&lt;ul&gt;
&lt;li&gt;DISTINCT 的位置：SELECT 子句；聚集函数内部。&lt;pre&gt;&lt;code&gt;SELECT DISTINCT dept
FROM Student;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;COUNT(DISTINCT sid)
AVG(DISTINCT score)
SUM(DISTINCT amount)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分组与 HAVING&lt;/strong&gt;先Group 分组后 HAVING
&amp;lt;div style=&quot;display: flex; width:50%; margin: -2px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/GroupHaving.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EXISTS&lt;/strong&gt;
子查询有结果，返回TRUE；子查询无结果，返回FALSE&lt;pre&gt;&lt;code&gt;SELECT Sname
FROM Student S
WHERE EXISTS (
    SELECT *
    FROM SC
    WHERE SC.Sno = S.Sno
    AND Cno = &apos;1&apos; -- 从 Student 表里，找出那些‘存在’选修 1 号课程记录的学生
); -- 查询选修了 1 号课程的学生

SELECT Sname
FROM Student S
WHERE NOT EXISTS (
    SELECT *
    FROM SC
    WHERE SC.Sno = S.Sno
    AND Cno = &apos;1&apos;
); -- 查询没选1号课程的学生
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查询选修全部课程的学生&lt;pre&gt;&lt;code&gt;SELECT Sname
FROM Student
WHERE NOT EXISTS ( -- ③ 除去没有选择课程的学生
    SELECT *
    FROM Course -- ② 有NOT EXISTS学生选择的课程中的：学生没有选择的课程
    WHERE NOT EXISTS (
        SELECT *
        FROM SC
        WHERE SC.Sno = Student.Sno  
        AND SC.Cno = Course.Cno -- ① 对SC中的每门课程，去Student、Course中寻找有无记录
    ) -- 学生选择的课程
);
✅ 理解：不存在一门课是这个学生没选的
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists1.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists2.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists3.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists4.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;⭐例题&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;所有课程都及格&lt;/strong&gt;：HAVING MIN(grade)&amp;gt;=60
&amp;lt;div style=&quot;display: flex; width:50%; gap: 1px;margin-top: -2px;margin-bottom: 20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qq2.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;修完本院所有必修课&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width:50%; gap: 1px;margin-top: -2px;margin-bottom: 20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qq3.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每组最大值
&amp;lt;div style=&quot;display: flex; width:50%; gap: 1px;margin-top: -2px;margin-bottom: 20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qq1.png&quot; alt=&quot;分组&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;只讲授本院课程&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SQL（Structured Query Language）结构化查询语言，是关系数据库的标准语言&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SQL与关系数据库的三级模式&lt;img src=&quot;image-8.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;核心功能：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;数据定义：CREATE，DROP，ALTER
- 数据查询：SELECT
- 数据操作：INSERT，UPDATE，DELETE
- 数据控制：GRANT，REVOKE&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;⭐数据库安全性&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;授权：授予GRANT 与 回收REVOKE
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;授予 GRANT&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;GRANT SELECT,INSERT
ON Student
TO U1 -- 把对Student的查询、插入权限授予用户U1

GRANT ALL PRIVILIGES
ON TABLE Student,Course
TO U2,U3 -- 把对Student表和Course表的全部权限授予用户U2和U3
&lt;/code&gt;&lt;/pre&gt;
&lt;strong&gt;转授 WITH GRANT OPTION&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;GRANT SELECT
ON Student
TO user2
WITH GRANT OPTION;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回收 REVOKE&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;REVOKE UPDATE(Sno) ON STUDENT FROM U4 -- 把用户U4修改学生学号的权限收回
REVOKE SELECT ON SC FROM PUBLIC -- 收回所有用户对表SC的查询权限
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;SQL数据定义&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作对象&lt;/th&gt;
&lt;th&gt;创建&lt;/th&gt;
&lt;th&gt;删除&lt;/th&gt;
&lt;th&gt;修改&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;模式 &lt;strong&gt;SCHEMA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CREATE SCHEMA&lt;/td&gt;
&lt;td&gt;DROP SCHEMA&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;表 &lt;strong&gt;TABLE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CREATE&lt;/strong&gt; TABLE&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DROP&lt;/strong&gt; TABLE&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ALTER&lt;/strong&gt; TABLE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;视图 &lt;strong&gt;VIEW&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CREATE VIEW&lt;/td&gt;
&lt;td&gt;DROP VIEW&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;索引 &lt;strong&gt;INDEX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CREATE INDEX&lt;/td&gt;
&lt;td&gt;DROP INDEX&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ALTER&lt;/strong&gt; INDEX&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;定义/删除模式（CREATE/DROP SCHEMA）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;例：为用户WANG 定义一个学生-课程模式S-T&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE SCHEMA “S_T” AUTHORIZATION WANG;
CREATE SCHEMA AUTHORIZATION WANG;  -- 该语句没有指定&amp;lt;模式名&amp;gt;，&amp;lt;模式名&amp;gt;隐含为&amp;lt;用户名&amp;gt; WANG
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模式中定义其他
&amp;lt;br&amp;gt;为用户ZHANG创建了一个模式TEST，并且在其中定义一个表TAB1&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;CREATE SCHEMA TEST AUTHORIZATION ZHANG
    CREATE TABLE TAB1 ( 
        COL1 SMALLINT,
        COL2 INT,
        COL3 CHAR(20),
        COL4 NUMERIC(10,3),
        COL5 DECIMAL(5,2) );
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;删除模式&lt;pre&gt;&lt;code&gt;DROP SCHEMA &amp;lt;模式名&amp;gt; &amp;lt;CASCADE|RESTRICT&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;CASCADE（级联）：删除模式的同时，把里面所有表/数据/对象全部删除；&lt;/li&gt;
&lt;li&gt;RESTRICT（限制）：模式里有任何东西(表/视图/数据)，就禁止删除
&amp;lt;br&amp;gt;eg:DROP SCHEMA ZHANG CASCADE;
删除模式ZHANG，同时该模式中定义的表TAB1也被删除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- ### 基本表 TABELE&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;定义基本表 -三大核心完整性约束：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PRIMARY KEY 主键&lt;/strong&gt;，唯一标识一行数据，不能重复、不能为空&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UNIQUE 唯一&lt;/strong&gt;，不能重复，但能为空&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE Student
    (Sno CHAR(9) PRIMARY KEY,  /* 列级完整性约束条件, Sno是**主码**/
    Sname CHAR(20) UNIQUE,  /* **约束**，Sname的取值具有唯一性*/
    Ssex CHAR(2) NOT NULL CHECK (Ssex IN (&apos;男&apos;, &apos;女&apos;)),/*  非空且只能是男/女 */
    Sage SMALLINT,
    Sdept CHAR(20)
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE enrollment(
    sno char(9) NOT NULL,
    clsno char(8) NOT NULL,
    grade INT CHECK (grade BETWEEN 0 AND 100),
    PRIMARY KEY(sno,clsno), -- 课程班代码和学号联合构成PRIMARY KEY
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;外键&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;两张表关联起来，SC表里的Cno必须来自Student里的Cno&lt;pre&gt;&lt;code&gt;CREATE TABLE courseclass(
clsno char(8) PRIMARY KEY,
cno char(8) NOT NULL,
tno char(9) ,
-- 先定义再外键 + 违约规则
FOREIGN KEY (cno) REFERENCES coures(cno) ON UPDATE CASCADE ON DELETE RESTRICT,
FOREIGN KEY (tno) REFERENCES teachers(tno) ON UPDATE CASCADE ON DELETE SET NULL
-- 父表更新cno，子表cno自动同步更新；父表删除cno，子表还有该课程就禁止删除
-- 父表更新tno，子表tno自动同步更新；父表删除tno，子表对应的tno自动设为NULL
);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;违约规则
&amp;lt;br&amp;gt;什么是违约？ 父表更新主键/删除父表记录会破坏参照关系，触发违约
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;关键字&lt;/th&gt;
&lt;th&gt;中文&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CASCADE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;级联&lt;/td&gt;
&lt;td&gt;父表改 / 删 → 子表自动跟着改 / 删&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SET NULL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;置空&lt;/td&gt;
&lt;td&gt;父表删 → 子表外键自动设为 &lt;strong&gt;NULL&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RESTRICT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;限制 / 拒绝&lt;/td&gt;
&lt;td&gt;数据库直接&lt;strong&gt;禁止&lt;/strong&gt;父表的改/删操作&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改基本表（ALTER TABLE）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ADD新增列/完整性约束&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
ADD COLUMN S_email VARCHAR(50) NOT NULL UNIQUE;  -- 增加邮箱列，要求非空且唯一
ADD CONSTRAINT chk_sex CHECK (Ssex IN (&apos;男&apos;, &apos;女&apos;));  -- 为 Ssex 增加 CHECK 约束（性别只能是男 / 女）
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;DROP 删除列&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
DROP COLUMN S_email CASCADE; --删除“邮箱”列，默认RESTRICT
DROP CONSTRAINT chk_sex; -- 删除性别CHECK约束
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;修改列的定义&lt;pre&gt;&lt;code&gt;ALTER TABLE Student 
ALTER COLUMN Sage INT;  -- 修改数据类型：年龄从SMALLINT改为INT
ALTER COLUMN Sname CHAR(30); -- 修改列长度（姓名从 CHAR (20) 改为 CHAR (30)）
ALTER TABLE Course ADD UNIQUE(Cname); -- 增加课程名称必须取唯一值的约束条件
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除基本表&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DROP TABLE &amp;lt;表名&amp;gt;［RESTRICT| CASCADE］;
``` --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;索引 INDEX&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;建立索引 CREATE INDEX&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;CREATE UNIQUE INDEX Coucno ON Course(Cno); -- Course表按课程号
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC); -- 升序建唯一索引，SC表按学号升序和课程号降序建唯一索引
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;修改索引 ALTER INDEX&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ALTER INDEX SCno RENAME TO SCSno; -- 将SC表的SCno索引名改为SCSno
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;删除索引 DROP INDEX&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; DROP INDEX Stusname; -- 删除Student表的Stusname索引
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;关系代数 vs SQL语言&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;$$ \pi_{A_1, A_2, ..., A_m} \left( \sigma_F ( R ) \right) $$其中 $A_i \in head(R)$ for $i = 1, 2, \dots, m$
&amp;lt;br&amp;gt;SQL表示&lt;pre&gt;&lt;code&gt;SELECT A_1, A_2, ..., A_m
FROM   R
WHERE  F
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;笛卡尔积 $R\times S$
&amp;lt;br&amp;gt;SQL表示&lt;pre&gt;&lt;code&gt;SELECT R.A_1,...,R.A_n,s.b_1,...,s.b_m
FROM   R,S
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;$\theta-$连接
$R\underset{F}\bowtie S$
&amp;lt;br&amp;gt;SQL表示&lt;pre&gt;&lt;code&gt;    SELECT R.A_1,...,R.A_n,s.b_1,...,s.b_m
    FROM R,S
    WHERE F
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;自然连接
$R\bowtie S$
&amp;lt;br&amp;gt;SQL表示&lt;pre&gt;&lt;code&gt;    SELECT R.A_1,...,R.A_n,s.b_1,...,s.b_m
    FROM R,S
    WHERE R.B_1 = S.B_1 and R.B_2 = S.B_2 and ... and R.B_k = S.B_k
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;$\pi_{attr_1, attr_2, ..., attr_x} (\sigma_F (R \times S))$
&amp;lt;br&amp;gt;SQL表示&lt;pre&gt;&lt;code&gt;SELECT attr_1, attr_2, ..., attr_x
FROM   R,S
WHERE  F
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;SQL数据查询&lt;/h2&gt;
&lt;h3&gt;单表查询&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;基本格式：&lt;code&gt;SELECT SNO   FROM Student   WHERE Sage&amp;lt;18&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SELECT 目标子句
&lt;ul&gt;
&lt;li&gt;查所有列：SELECT * FROM Student&lt;/li&gt;
&lt;li&gt;查指定列：SELECT Sno, Sname FROM Student; 查询全体学生的学号与姓名&lt;/li&gt;
&lt;li&gt;起别名：SELECT Sname,2026-Sage AS 计算(2026-Sage)结果出生年份起名为AS&lt;/li&gt;
&lt;li&gt;列去重：SELECT &lt;strong&gt;DISTINCT&lt;/strong&gt; Sno FROM SC; 查询学号
&lt;img src=&quot;image-9.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;计算&lt;pre&gt;&lt;code&gt;SELECT ordno, year(orddate), month(orddate), day(orddate)
FROM orders;  -- 查询每一份订单的编号、订购的年、月、日；

SELECT ordno, orddate, datediff(curdate(), orddate)
FROM orders ;  -- 查询每一份订单的编号、订购日期、距离至今相隔的天数；
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例：查询全体学生的姓名、出生年份和所在的院系，要求用小写字母表示系名。&lt;pre&gt;&lt;code&gt;SELECT Sname,&apos;Year of Birth: &apos;, 2014 - Sage, LOWER(Sdept)
FROM Student;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;span id=&quot;FROM 范围子句&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;FROM 范围子句&lt;pre&gt;&lt;code&gt;SELECT S.Sno, S.Sname 
FROM Student S;  //S是Student的别名
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;span id=&quot;WHERE条件子句&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;WHERE 条件子句
&lt;ul&gt;
&lt;li&gt;比较&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT Sname
FROM Student
WHERE Sdept = ‘CS’ ;
WHERE Sdept &amp;lt;&amp;gt; ‘CS’;//过滤条件，相当于!=不等于
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;确定范围&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage (NOT) BETWEEN 20 AND 23; -- 查询年龄(不)在[20,23]的学生的姓名、系别和年龄
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;确定集合&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT Sname, Ssex
FROM Student
WHERE Sdept (NOT) IN ( &apos;CS&apos;,&apos;MA&apos;,&apos;IS&apos; );-- 查询(不是)计算机科学系（CS）、数学系（MA）和信息系（IS）学生的姓名和性别。
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&apos;字符串常量&apos;加单引号&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT Sname,&apos;Year of Birth: &apos;, 2014 - Sage, LOWER(Sdept)  FROM Student;//系名小写
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;字符匹配 &lt;strong&gt;LIKE&lt;/strong&gt;/&lt;strong&gt;=&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT* FROM Student WHERE Sno LIKE &apos;24%&apos;  -- 通配符，查询学号以24开头的学生的详细信息
SELECT* FROM Student WHERE Sno = &apos;24%&apos; -- 查询学号就是&apos;24%&apos;学生的详细信息
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;字符串中的通配符&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE &apos;刘%&apos;;  -- 查询所有姓刘学生的姓名、学号和性别

SELECT Sname
FROM Student
WHERE Sname LIKE &apos;欧阳_&apos;; -- 查询姓&quot;欧阳&quot;且全名为三个汉字的学生的姓名

SELECT Sname, Sno
FROM Student
WHERE Sname LIKE &apos;_阳%&apos;; -- 查询名字中第2个字为&quot;阳&quot;字的学生的姓名和学号

SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname NOT LIKE &apos;刘%&apos;; -- 查询所有不姓刘的学生姓名、学号和性别
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;转义字符
用 ESCAPE &apos;&apos; 表示字符\为换码字符（转义指示符）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;查询DB_Design课程的课程号和学分。
SELECT Cno，Ccredit
FROM Course
WHERE Cname LIKE &apos;DB\_Design&apos; ESCAPE &apos;\&apos; ;
WHERE Cname = &apos;DB_Design&apos;;  -- 等效
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;涉及空值的查询&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SELECT Sno，Cno
FROM SC
WHERE Grade IS NOT NULL; -- 查所有有成绩的学生学号和课程号
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;多重条件查询（&lt;strong&gt;AND&lt;/strong&gt;/&lt;strong&gt;OR&lt;/strong&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;连接查询（多表）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;等值连接/自然连接查询&lt;/strong&gt;=
&amp;lt;div style=&quot;display: flex; gap: 8px; align-items: center; margin: 4px 0;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-14.png&quot; alt=&quot;等值连接&quot; style=&quot;width: 60%; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自身连接&lt;/strong&gt; 起别名 =
&amp;lt;br&amp;gt;查询每一门课的间接先修课（即先修课的先修课）&lt;pre&gt;&lt;code&gt;SELECT FIRST.Cno, SECOND.Cpno
FROM Course FIRST, Course SECOND -- 需要给表起别名
WHERE FIRST.Cpno = SECOND.Cno;
&lt;/code&gt;&lt;/pre&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-15.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外连接&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno); -- 左外连接：左边为标准，右边不存在的填NULL
FROM Student RIGHT OUTER JOIN SC ON (Student.Sno=SC.Sno); -- 右外连接：右边为标准，右边不存在的填NULL
FROM Student FULL OUTER JOIN SC ON S.Sno = SC.Sno; -- 全外连接，全部补NULL
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;嵌套查询（子查询）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;IN
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qt1.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qt2.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/qt3.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;带有比较运算符的子查询&lt;pre&gt;&lt;code&gt;SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept = (SELECT Sdept FROM Student WHERE Sname = &apos;刘晨&apos;);
-- 在[例3.55]中，由于一个学生只可能在一个系学习，则可以用 = 代替IN 
SELECT Sno, Cno
FROM SC x
WHERE Grade &amp;gt;= ( SELECT AVG(Grade)
FROM SC y
WHERE y.Sno = x.Sno ); -- 找出每个学生超过他选修课程平均成绩的课程号。
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;限定比较谓词(SOME/ANY/ALL)&lt;pre&gt;&lt;code&gt;-- 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage &amp;lt; ANY (
        SELECT Sage
        FROM Student
        WHERE Sdept = &apos;CS&apos;)
    AND Sdept &amp;lt;&amp;gt; &apos;CS&apos; ;
-- 聚集函数
SELECT Sname,Sage
FROM Student
WHERE Sage &amp;lt; (
        SELECT MAX（Sage）
        FROM Student
        WHERE Sdept= &apos;CS &apos; )
    AND Sdept &amp;lt;&amp;gt; &apos;CS&apos;;
&lt;/code&gt;&lt;/pre&gt;
&amp;lt; ANY → 小于最大值；&lt;pre&gt;&lt;code&gt;SELECT * FROM SC
WHERE Grade &amp;lt; ANY (80,90,70); -- 任意一个，小于最大值。成绩 &amp;lt; 90

SELECT * FROM SC
WHERE Grade &amp;lt; ALL (80,90,70); -- 所有，小于最小值。成绩 ＜ 70
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;EXISTS谓词
子查询有结果，返回TRUE；子查询无结果，返回FALSE&lt;pre&gt;&lt;code&gt;SELECT Sname
FROM Student S
WHERE EXISTS (
    SELECT *
    FROM SC
    WHERE SC.Sno = S.Sno
    AND Cno = &apos;1&apos; -- 从 Student 表里，找出那些‘存在’选修 1 号课程记录的学生
); -- 查询选修了 1 号课程的学生

SELECT Sname
FROM Student S
WHERE NOT EXISTS (
    SELECT *
    FROM SC
    WHERE SC.Sno = S.Sno
    AND Cno = &apos;1&apos;
); -- 查询没选1号课程的学生
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;查询选修全部课程的学生&lt;pre&gt;&lt;code&gt;SELECT Sname
FROM Student
WHERE NOT EXISTS ( -- ③ 除去没有选择课程的学生
    SELECT *
    FROM Course -- ② 有NOT EXISTS学生选择的课程中的：学生没有选择的课程
    WHERE NOT EXISTS (
        SELECT *
        FROM SC
        WHERE SC.Sno = Student.Sno  
        AND SC.Cno = Course.Cno -- ① 对SC中的每门课程，去Student、Course中寻找有无记录
    ) -- 学生选择的课程
);
✅ 理解：不存在一门课是这个学生没选的
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists1.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists2.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists3.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/exists4.png&quot; alt=&quot;exists&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;聚集函数/统计函数&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;COUNT&lt;/strong&gt; 统计元组个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SUM&lt;/strong&gt; 计算一列的总和/&lt;strong&gt;AVG&lt;/strong&gt; 计算一列的平均值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MIN&lt;/strong&gt; 一列值中的最大值/&lt;strong&gt;MIN&lt;/strong&gt; 一列值中的最小值
&amp;lt;div style=&quot;display: flex; gap: 8px; align-items: center; margin: 4px 0;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/jjhs1.png&quot; alt=&quot;聚集函数1&quot; style=&quot;width: 60%; height: auto;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/jjhs2.png&quot; alt=&quot;聚集函数2&quot; style=&quot;width: 40%; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;对查询结果的处理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;对查询结果&lt;strong&gt;排序&lt;/strong&gt; &lt;strong&gt;ORDER BY 属性名 ASC升序/DESC降序&lt;/strong&gt;
查询选修了3号课程的学生的学号及其成绩，查询结果按分数降序排列。&lt;pre&gt;&lt;code&gt;SELECT Sno, Grade
FROM SC
WHERE Cno= &apos;3&apos;
ORDER BY Grade DESC;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;对查询结果&lt;strong&gt;分组&lt;/strong&gt; &lt;strong&gt;GROUP BY&lt;/strong&gt;/&lt;strong&gt;HAVING&lt;/strong&gt;
求各个课程号及相应的选课人数。&lt;pre&gt;&lt;code&gt;SELECT Cno，COUNT(Sno)
FROM SC
GROUP BY Cno; // 按照Cno为一行,相同Cno为一行
&lt;/code&gt;&lt;/pre&gt;
查询选修了3门以上课程的学生学号。&lt;pre&gt;&lt;code&gt;SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) &amp;gt;3;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;辨析 HAVING 与 WHERE
&lt;img src=&quot;image-11.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;指定结果列的列标题&lt;pre&gt;&lt;code&gt;SELECT Sname NAME,&apos;Year of Birth:&apos; BIRTH,2014-Sage BIRTHDAY,
-- Sname一列的结果列标题为NAME，&apos;Year of Birth:&apos;常量列的列标题为BIRTH…
FROM Student;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;查询结果
&amp;lt;br&amp;gt;WHERE → GROUP → &lt;strong&gt;SELECT&lt;/strong&gt; → ORDER   WHERE → GROUP → HAVING → &lt;strong&gt;SELECT&lt;/strong&gt; → ORDER
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/checking2.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/checking1.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;集合操作&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;并操作 UNION [ALL]&lt;/strong&gt;
&lt;img src=&quot;image-12.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交操作 INTERSECT [ALL]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;差操作 EXCEPT [ALL]&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/intersect1.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/intersect2.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;基于派生表的查询&lt;/h3&gt;
&lt;hr /&gt;
&lt;h2&gt;数据更新&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;插入&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;格式&lt;pre&gt;&lt;code&gt;INSERT
INTO &amp;lt;表名&amp;gt; (属性名1，属性名2,…)
VALUES (expr1|NULL , expr2|NULL ,…)
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;image-7.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;插入子查询结果&lt;pre&gt;&lt;code&gt;INSERT
INTO &amp;lt;表名&amp;gt;(属性1，属性2，…)
子查询
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;image-16.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;修改&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;格式&lt;pre&gt;&lt;code&gt;UPDATE &amp;lt;表名&amp;gt;
SET &amp;lt;属性1&amp;gt;=&amp;lt;expr1&amp;gt;，&amp;lt;属性2&amp;gt;=&amp;lt;expr2&amp;gt;
WHERE &amp;lt;条件&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;image-17.png&quot; alt=&quot;alt text&quot; /&gt;  &lt;img src=&quot;image-18.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;删除&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;格式&lt;pre&gt;&lt;code&gt;DELETE
FROM &amp;lt;表名&amp;gt;
[WHERE &amp;lt;条件&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;image-19.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;事务&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;定义
是用户定义的一个数据库操作序列，这些操作要么全做，要么全不做&lt;/li&gt;
&lt;li&gt;例
&lt;img src=&quot;image-20.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;事务的特性（ACID）
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)&lt;/li&gt;
&lt;li&gt;定义事务
&lt;ul&gt;
&lt;li&gt;事物的启动：&lt;strong&gt;隐式&lt;/strong&gt;方式（由数据库管理系统来决定，何时为何用户启动一个新的事务）&lt;/li&gt;
&lt;li&gt;事物的结束：用户调用commit或rollback命令，&lt;strong&gt;显式&lt;/strong&gt;地结束当前事务；由数据库管理系统强行结束一个用户的当前正在运行中的事务&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;事务启动方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据定义命令 DDL&lt;/strong&gt;
&amp;lt;br&amp;gt;只要你执行 CREATE、ALTER 等定义语句，系统自动把这一条语句当成一个独立事务。
&amp;lt;br&amp;gt;执行前，如果你正在做其他操作，系统会&lt;strong&gt;自动先提交之前&lt;/strong&gt;的事务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;将系统设为自动提交方式（打开自动提交标志）&lt;/strong&gt;
&amp;lt;br&amp;gt;这是最常见的默认状态。每一条 SELECT、UPDATE 等操作，做完后&lt;strong&gt;系统自动帮你 COMMIT&lt;/strong&gt;，立即生效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据操纵命令(DML)&lt;/strong&gt;
&amp;lt;br&amp;gt;如果你没有开启自动提交，当你执行 INSERT/UPDATE/DELETE 时，系统检测到你没有事务，就&lt;strong&gt;自动帮你开启&lt;/strong&gt;一个新事务，等着你手动提交或回滚。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;事务结束方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;事务提交：COMMIT&lt;/strong&gt;
&amp;lt;br&amp;gt;事务正常结束，确认所有操作生效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事务回滚：ROLLBACK&lt;/strong&gt;
&amp;lt;br&amp;gt;事务异常终止，撤销所有操作。&lt;strong&gt;保存点&lt;/strong&gt; savepoint，支持部分回滚。只撤销保存点后的操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;相关的SQL语句
&lt;ul&gt;
&lt;li&gt;事务结束命令
事务提交命令：&lt;strong&gt;COMMIT&lt;/strong&gt;/事务放弃命令：&lt;strong&gt;ROLLBACK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;事务设置命令
&lt;ul&gt;
&lt;li&gt;设置事务的自动提交命令：SET AUTOCOMMIT ON | OFF&lt;/li&gt;
&lt;li&gt;设置事务的类型：SET TRANSACTION READONLY | READWRITE&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在MySQL数据库中，设置事务自动提交功能的SQL命令格式是
&lt;ul&gt;
&lt;li&gt;SET AUTOCOMMIT = 0; /* 关闭事务自动提交功能 */&lt;/li&gt;
&lt;li&gt;SET AUTOCOMMIT = 1; /* 打开事务自动提交功能 */&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;只读/读写型事务
SET TRANSACTION READONLY | READWRITE ;&lt;/li&gt;
&lt;li&gt;事隔离级别——解决相互干扰
&lt;ol&gt;
&lt;li&gt;READ UNCOMMITTED 读未提交&lt;/li&gt;
&lt;li&gt;READ COMMITTED 读已提交&lt;/li&gt;
&lt;li&gt;REPEATABLE READ 可重复读&lt;/li&gt;
&lt;li&gt;SERIALIZABLE 串行化&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;基于封锁的并发控制（Locking）——具体执行策略
&lt;ol&gt;
&lt;li&gt;读锁（共享锁/S锁）
事务 T 持有读锁时，只允许别人读，不允许写。作用：保证大家看到的是同一时刻的数据。&lt;/li&gt;
&lt;li&gt;写锁（排他锁/X锁）
事务 T 持有写锁时，别人既不能读，也不能写。作用：保证修改操作不被打断，原子性执行。&lt;/li&gt;
&lt;li&gt;互斥原则
一个数据对象上，同一时刻只能有一种锁（要么一堆读锁，要么一个写锁），不能混着来。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;SQL中的空值&lt;/h2&gt;
&lt;p&gt;注意取值
&lt;img src=&quot;image-21.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;视图&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;格式&lt;pre&gt;&lt;code&gt;CREATE VIEW &amp;lt;视图名&amp;gt; [(&amp;lt;列名&amp;gt; [,&amp;lt;列名&amp;gt;]…)]
AS &amp;lt;子查询&amp;gt;
[WITH CHECK OPTION];
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例-&lt;strong&gt;行列子集视图&lt;/strong&gt;
若一个视图是从单个基本表导出的，并且只是去掉了基本表的某些行和某些列，但保留了&lt;strong&gt;主码&lt;/strong&gt;，我们称这类视图为&lt;strong&gt;行列子集视图&lt;/strong&gt;。
&lt;img src=&quot;image-22.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;WITH CHECK OPTION
&lt;img src=&quot;image-23.png&quot; alt=&quot;alt text&quot; /&gt;
阻止不符合条件的数据加入/修改成不符合条件的数据…/而基本表没有限制&lt;/li&gt;
&lt;li&gt;建立视图
&lt;img src=&quot;image-24.png&quot; alt=&quot;alt text&quot; /&gt;&lt;img src=&quot;image-25.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;删除视图
DROP VIEW &amp;lt;视图名&amp;gt; [CASCADE]
&lt;img src=&quot;image-26.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;查询视图&lt;/li&gt;
&lt;li&gt;更新视图&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;C4 数据库的安全性&lt;/h1&gt;
&lt;h2&gt;数据安全性概述&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;数据库安全性：保护数据库防止非法使用造成的数据泄露、更改或破坏，是数据库系统核心性能指标之一&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;数据库不安全因素 &amp;amp; 安全措施&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;非授权用户对数据库的恶意存取和破坏：用户身份鉴别、存取控制、视图&lt;/li&gt;
&lt;li&gt;数据库中重要或敏感的数据被泄露：强制存取控制、数据加密存储、加密传输&lt;/li&gt;
&lt;li&gt;安全环境的脆弱性：建立可信计算机系统&lt;/li&gt;
&lt;li&gt;故障/误操作/并发访问&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;安全标准&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;美国国防部颁布TCSEC(DoD85) → 不同国家在其基础上建立的评估准则ITSEC/CTCPEC/FC → CC (国际通用标准)&lt;/li&gt;
&lt;li&gt;TCSEC/TDI安全级别划分（从低到高）/ CC评估保证级(EAL)划分
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/TCSEC.png&quot; alt=&quot;TCSEC划分&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/CC.png&quot; alt=&quot;CC评估保证级划分&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;中国标准：GB 17859-1999
&lt;img src=&quot;image-42.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;计算机系统的安全模型
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/computersyssafemodel.png&quot; alt=&quot;计算机系统的安全模型&quot; style=&quot;width: 80%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据库管理系统安全性控制模型
&lt;img src=&quot;image-43.png&quot; alt=&quot;alt text&quot; /&gt;
数据库安全性控制的常用方法:用户标识和鉴定、存取控制、视图、审计、数据加密&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;数据库安全性控制&lt;/h2&gt;
&lt;p&gt;数据库安全性控制的常用方法：用户标识和鉴定、存取控制、视图、审计、数据加密&lt;/p&gt;
&lt;h3&gt;用户身份鉴别&lt;/h3&gt;
&lt;p&gt;系统提供的&lt;strong&gt;最外层&lt;/strong&gt;安全保护措施
&amp;lt;br&amp;gt;用户标识 = 用户名 + 用户标识号（用户标识号在系统整个生命周期内唯一）
&amp;lt;br&amp;gt;用户身份鉴别的方法：静态口令鉴别、动态口令鉴别、生物特征鉴别(掌纹/虹膜)、智能卡鉴别&lt;/p&gt;
&lt;h3&gt;存取控制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;组成：定义用户权限，并将用户权限登记到数据字典中 + 合法权限检查(用户发出存取数据库的操作请求后,DBMS根据字典检查权限)&lt;/li&gt;
&lt;li&gt;存取控制方法:自主存取控制、强制存取控制&lt;br /&gt;
&lt;img src=&quot;image-14.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;自主存取控制 DAC&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;SQL支持：通过 &lt;strong&gt;GRANT语句&lt;/strong&gt;、&lt;strong&gt;REVOKE语句&lt;/strong&gt; 提供支持&lt;/li&gt;
&lt;li&gt;核心目标：&lt;/li&gt;
&lt;li&gt;用户权限的组成要素：数据库对象 + 操作类型
&lt;img src=&quot;image-15.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;用户存取权限的方式
&amp;lt;br&amp;gt;(i) 客体的属主(客体的创建者)自动拥有客体上的所有存取权限
&amp;lt;br&amp;gt;(ii) 拥有权限的用户可以自主地将他拥有的权限传授给在数据库系统中注册的其他用户
5. 访问控制检查流程
&lt;img src=&quot;image-28.png&quot; alt=&quot;alt text&quot; /&gt;
第一步：是不是管理员？第二步：是不是客体的属主？第三步：有没有被授予对应的权限？(检查用户 S 是否被授予了“以方式A 访问 客体O”的权限)
&amp;lt;!-- ### 授权：授予GRANT 与 收回REVOKE
&amp;lt;span id=&quot;GRANT&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;基础GRANT&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;GRANT SELECT
ON TABLE Student
TO U1 -- 把查询Student表权限授给用户U1

GRANT ALL PRIVILIGES
ON TABLE Student,Course
TO U2,U3 -- 把对Student表和Course表的全部权限授予用户U2和U3

GRANT SELECT
ON TABLE SC
TO PUBLIC; -- 把对表SC的查询权限授予所有用户

GRANT SELECT,UPDATE(Sno)
ON TABLE Student
TO U4-- 把查询Student表和修改学生学号的权限授给用户U4
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;再授权&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION -- 把对表SC的INSERT权限授予U5用户，并允许他再将此权限授予其他用户
-- 用户U5可以执行下述命令，将之前获得的表SC的INSERT权限及传播权限 授予用户U6。
GRANT INSERT ON TABLE SC TO U6 WITH GRANT OPTION;
-- 同样，U6还可以将此权限授予U7，但U7不能再传播此权限。
GRANT INSERT ON TABLE SC TO U7;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;span id=&quot;REVOKE&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;REVOKE&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;REVOKE UPDATE(Sno) ON STUDENT FROM U4 -- 把用户U4修改学生学号的权限收回
REVOKE SELECT ON SC FROM PUBLIC -- 收回所有用户对表SC的查询权限
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;创建数据库模式的权限&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;拥有的权限&lt;/th&gt;
&lt;th&gt;CREATE USER&lt;/th&gt;
&lt;th&gt;CREATE SCHEMA&lt;/th&gt;
&lt;th&gt;CREATE TABLE&lt;/th&gt;
&lt;th&gt;登录数据库，执行数据查询和操纵&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DBA&lt;/td&gt;
&lt;td&gt;可以&lt;/td&gt;
&lt;td&gt;可以&lt;/td&gt;
&lt;td&gt;可以&lt;/td&gt;
&lt;td&gt;可以&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RESOURCE&lt;/td&gt;
&lt;td&gt;不可以&lt;/td&gt;
&lt;td&gt;不可以&lt;/td&gt;
&lt;td&gt;可以&lt;/td&gt;
&lt;td&gt;可以&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CONNECT&lt;/td&gt;
&lt;td&gt;不可以&lt;/td&gt;
&lt;td&gt;不可以&lt;/td&gt;
&lt;td&gt;不可以&lt;/td&gt;
&lt;td&gt;可以，但必须拥有相应权限&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;数据库角色 ROLE&lt;/h3&gt;
&lt;h3&gt;强制存取控制 MAC&lt;/h3&gt;
&lt;h3&gt;其他安全技术&lt;/h3&gt;
&lt;p&gt;视图机制、审计（Audit）、数据加密、其他安全性保护&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ### GRANT语句&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一般格式&lt;pre&gt;&lt;code&gt;GRANT &amp;lt;权限&amp;gt; [ , &amp;lt;权限&amp;gt; ] ... 
ON &amp;lt;对象类型&amp;gt; &amp;lt;对象名&amp;gt; [ , &amp;lt;对象类型&amp;gt; &amp;lt;对象名&amp;gt; ]…
TO &amp;lt;用户&amp;gt; [ , &amp;lt;用户&amp;gt; ] ... 
[ WITH GRANT OPTION ];
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;C6 关系数据理论&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;如何评价关系模式设计的好坏？&lt;/li&gt;
&lt;li&gt;如何设计性能良好的关系模式？
&amp;lt;br&amp;gt;关系数据库的规范化理论，就是为了解决上述两个问题而提出的关系数据库设计理论&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;问题的提出&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;为什么数据库表不能随便设计？为什么需要“规范化理论”？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;关系模式 &amp;amp; 第一范式(1NF)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;关系模式结构&lt;/h4&gt;
完整五元组：R(U,D,DOM,F) 简化三元组：R&amp;lt;U,F&amp;gt;
关系名(属性名集合，属性取值域，属性到域的映射，属性间数据依赖)&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;第一范式(1NF)的 6 条核心性质&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;列同质：每列数据来自同一域（同类型或范围）&lt;/li&gt;
&lt;li&gt;不同列可同域（“学生姓名”和“教师姓名”都可以是字符串）&lt;/li&gt;
&lt;li&gt;列无序（属性顺序不影响语义）&lt;/li&gt;
&lt;li&gt;行唯一（无重复元组/行）&lt;/li&gt;
&lt;li&gt;行无序（元组顺序不影响语义）&lt;/li&gt;
&lt;li&gt;⭐&lt;strong&gt;分量必须取原子值&lt;/strong&gt;：数据项不可再分
&amp;lt;br&amp;gt;第一范式（1NF）地位：关系数据库最基础范式，是所有高级范式的前提&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;不良关系模式的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;单一的关系模式/三个关系模式
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px; margin-bottom: -30px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/Rmodel1.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/Rmodel2.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;带来的问题：数据冗余、更新异常、插入异常、删除异常
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px; margin-bottom: -10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-41.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/yic2.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-43.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-44.png&quot; alt=&quot;计算机网络基本概念总结&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据依赖基础&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;定义：关系内部属性与属性间的语义约束&lt;/li&gt;
&lt;li&gt;核心类型
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;函数依赖&lt;/strong&gt;（FD）：一个属性值确定，另一属性值唯一确定（如Sno→Sdept）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多值依赖&lt;/strong&gt;（MVD）：高级数据依赖，后续章节讲解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;范式与规范化&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;范式（NF）：是对一个关系中允许存在的&lt;strong&gt;数据依赖&lt;/strong&gt;的要求&lt;/li&gt;
&lt;li&gt;范式等级（从低到高包含关系）：
$$1NF \supset 2NF \supset 3NF \supset BCNF \supset 4NF \supset 5NF$$&lt;/li&gt;
&lt;li&gt;规范化：将&lt;strong&gt;低范式&lt;/strong&gt;通过&lt;strong&gt;模式分解&lt;/strong&gt;转为&lt;strong&gt;高范式&lt;/strong&gt;，消除不良数据依赖
&amp;lt;br&amp;gt;范式越高，对表中数据依赖的要求越严格。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;函数依赖 &amp;amp; 码&lt;/h2&gt;
&lt;p&gt;函数依赖的定义
Ø 非平凡函数依赖，平凡函数依赖
q 定义6.2 完全函数依赖，部分函数依赖
q 定义6.3 传递函数依赖（直接函数依赖）&lt;/p&gt;
&lt;h3&gt;一、常用符号表示&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;符号表示&lt;/th&gt;
&lt;th&gt;含义说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$A, B, C$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;属性名&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$ABC$&lt;/td&gt;
&lt;td&gt;代表由 $A$、$B$、$C$ 三个属性组成的&lt;strong&gt;属性&lt;/strong&gt;集合，即：$ABC = {A, B, C}$&amp;lt;br&amp;gt;有时候也用 $(\dots)$ 代替其中的 ${\dots}$，即表示为：$ABC = (A, B, C)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$X, Y, Z$&lt;/td&gt;
&lt;td&gt;关系的&lt;strong&gt;属性子集&lt;/strong&gt;(subset)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$XY$&lt;/td&gt;
&lt;td&gt;表示 $X$ 和 $Y$ 的&lt;strong&gt;并集&lt;/strong&gt;，即：$XY = X \cup Y$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$R, S, T$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;关系名&lt;/strong&gt;（关系模式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$R(U)$&lt;/td&gt;
&lt;td&gt;关系模式：关系名 $R$，关系中的属性集合 $U$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$R(U, F)$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;关系模式&lt;/strong&gt;：关系名 $R$，属性集合 $U$，函数依赖集 $F$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$r, s, t$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;关系实例&lt;/strong&gt;（一个关系中的元组集合）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$r_1, r_2, r_3$&lt;/td&gt;
&lt;td&gt;关系中的&lt;strong&gt;元组&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$r_1[A]$&lt;/td&gt;
&lt;td&gt;元组 $r_1$ 在属性（集）$A$ 上的&lt;strong&gt;取值&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;二、函数依赖 FD&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;定义
&amp;lt;br&amp;gt;&lt;strong&gt;X确定唯一Y&lt;/strong&gt;，则称“X函数确定Y”或“Y函数依赖于X”，记作 $X \to Y$。
&lt;ul&gt;
&lt;li&gt;$X$：决定因素&lt;/li&gt;
&lt;li&gt;$Y$：依赖因素
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px; margin-bottom: -10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/FDli1.png&quot; alt=&quot;函数依赖例1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;1. 平凡/非平凡函数依赖&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;平凡函数依赖&lt;/strong&gt;：$X \to Y$ 且 $Y \subseteq X$（Sno&lt;strong&gt;本来就在左边&lt;/strong&gt;）
例：$(Sno,Cno) \to Sno$ $(Sno, Cno) → Cno$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非平凡函数依赖&lt;/strong&gt;：$X \to Y$ 且 $Y \nsubseteq X$
例：$(Sno,Cno) \to Grade$&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. 完全/部分函数依赖&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;完全函数依赖&lt;/strong&gt;：要决定Y，X的所有部分都要用上，如要确定一门课的成绩，需要同时知道&lt;strong&gt;学号+课程名&lt;/strong&gt;
&amp;lt;br&amp;gt;例：$(Sno,Cno) \stackrel{F}{\to} Grade$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部分函数依赖&lt;/strong&gt;：要决定Y，只需要X中的一部分属性就可以，如确定专业，只需知道&lt;strong&gt;Sno&lt;/strong&gt;就行，Cno是不必要的
&amp;lt;br&amp;gt;例：$(Sno,Cno) \stackrel{P}{\to} Sdept$&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. 传递函数依赖&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;定义：若 $X \to Y$，$Y \nrightarrow X$，$Y \to Z$（$Y \nsubseteq X$ $Z \nsubseteq Y$），则 $X \stackrel{\text{传递}}{\to} Z$&lt;/li&gt;
&lt;li&gt;例：$Sno \to Sdept$，$Sdept \to Mname$ $\Rightarrow$ $Sno \stackrel{\text{传递}}{\to} Mname$ --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;!-----&lt;/p&gt;
&lt;h3&gt;三、函数依赖的判定规则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;实例判定逻辑&lt;/h4&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对任意元组 $r_1,r_2$：
若 $r_1[X] = r_2[X]$，则必有 $r_1[Y] = r_2[Y]$ $\Rightarrow$ $X \to Y$。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;数量对应关系判断&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一对一(1:1)&lt;/strong&gt;：$X \to Y$ 且 $Y \to X$（如 身份证号 ↔ 学号）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多对一(n:1)&lt;/strong&gt;：多端属性 $\to$ 一端属性（如 $Sno \to Sdept$）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多对多(m:n)&lt;/strong&gt;：不存在函数依赖（如：Sno $$\nrightarrow$$ Cno）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;关键结论 &amp;amp; ⭐函数依赖集&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;$B \nrightarrow 所有$ $D \rightarrow 所有$（同一个值是否只能最初一个值）&lt;/li&gt;
&lt;li&gt;$所有 \rightarrow B$（一定不会对应两个）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px; top&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/hanshuylj1.png&quot; alt=&quot;函数依赖集1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/hanshuylj2.png&quot; alt=&quot;函数依赖集2&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; --&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;!-- ### 四、⭐码与相关概念&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;超码&lt;/h4&gt;
&lt;p&gt;能 &amp;lt;u&amp;gt;唯一标识&amp;lt;/u&amp;gt; 元组的任意属性集。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关系：&lt;strong&gt;候选码&lt;/strong&gt;是&lt;strong&gt;最小超码&lt;/strong&gt;，候选码的任意超集都是超码。&lt;/li&gt;
&lt;li&gt;例如：S(Sno, Sdept, Sage)，若：Sno → Sno, Sdept, Sage，
&amp;lt;br&amp;gt;{Sno}是&amp;lt;u&amp;gt;候选码&amp;lt;/u&amp;gt; 也是&amp;lt;u&amp;gt;超码&amp;lt;/u&amp;gt;，(Sno, Sdept)也是&amp;lt;u&amp;gt;超码&amp;lt;/u&amp;gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;候选码（码）&lt;/h4&gt;
&lt;p&gt;能够唯一标识元组的 &amp;lt;u&amp;gt;最小&amp;lt;/u&amp;gt; 超码
&amp;lt;br&amp;gt;{Sno}是候选码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;全码&lt;/h4&gt;
&lt;p&gt;如果关系的&lt;strong&gt;所有属性&lt;/strong&gt;U才是R的码，称为&lt;strong&gt;全码&lt;/strong&gt;
&amp;lt;br&amp;gt;例：$R(P,W,A)$（演奏者、作品、听众），全码为 $(P,W,A)$。P, W, A 都是关系R的主属性，在关系R中没有非主属性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;主码&lt;/h4&gt;
&lt;p&gt;如果一个关系模式有多个候选码，则从中选一个作为主码。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例如：Student(Sno, Sname, Ssex, Sage, Sdept)：Sno 是候选码，Sname 也是候选码。
&amp;lt;br&amp;gt;  → 可以选 Sno 作为主码。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;外码&lt;/h4&gt;
&lt;p&gt;R中 $X$ 不是当前关系R的码，&lt;strong&gt;是另一关系的码&lt;/strong&gt;，则 $X$ 为 $R$ 的外码。
&amp;lt;br&amp;gt;例：$SC(&amp;lt;u&amp;gt;Sno,Cno&amp;lt;/u&amp;gt;,Grade)$ 中 Sno不是码，Sno是 S(&amp;lt;u&amp;gt;Sno&amp;lt;/u&amp;gt;,Sdept,Sage)的码，
&amp;lt;br&amp;gt;  则 $Sno$ 是 $SC$ 的外码
&amp;lt;br&amp;gt;  &lt;code&gt;FOREIGN KEY (deptno) REFERENCES Department(deptno)&lt;/code&gt;
&amp;lt;br&amp;gt;  外码的&lt;strong&gt;作用&lt;/strong&gt;是：建立表之间的引用联系，并保证参照完整性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;主属性与非主属性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主属性&lt;/strong&gt;：包含在&lt;strong&gt;任意候选码&lt;/strong&gt;中的属性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非主属性&lt;/strong&gt;：不包含在任何候选码中的属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;例&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;S(&amp;lt;u&amp;gt;Sno&amp;lt;/u&amp;gt;, Sdept, Sage)中，只有一个&lt;strong&gt;候选码Sno&lt;/strong&gt;，所以：&lt;strong&gt;Sno&lt;/strong&gt;是关系S的&lt;strong&gt;主属性&lt;/strong&gt;，&lt;strong&gt;Sdept&lt;/strong&gt;和&lt;strong&gt;Sage&lt;/strong&gt;是关系S的2个&lt;strong&gt;非主属性&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;SC(&amp;lt;u&amp;gt;Sno, Cno&amp;lt;/u&amp;gt;, Grade)中，只有一个&lt;strong&gt;候选码(Sno, Cno)&lt;/strong&gt;，所以：&lt;strong&gt;Sno&lt;/strong&gt;和&lt;strong&gt;Cno&lt;/strong&gt;是关系SC的2个&lt;strong&gt;主属性&lt;/strong&gt;，&lt;strong&gt;Grade&lt;/strong&gt;是关系SC的&lt;strong&gt;非主属性&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;Student(Sno, Sname, Ssex, Sage, Sdept)中。有两个&lt;strong&gt;候选码&lt;/strong&gt;：&lt;strong&gt;Sno&lt;/strong&gt; 和 &lt;strong&gt;Sname&lt;/strong&gt;（不允许学生同名），所以：&lt;strong&gt;Sno&lt;/strong&gt; 和 &lt;strong&gt;Sname&lt;/strong&gt;是关系Student的2个&lt;strong&gt;主属性&lt;/strong&gt;，&lt;strong&gt;Ssex,&lt;/strong&gt; &lt;strong&gt;Sage&lt;/strong&gt;, Sdept&lt;strong&gt;是关系Student的3个&lt;/strong&gt;非主属性。 --&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- ---&lt;/p&gt;
&lt;h2&gt;范式 &amp;amp; 规范化&lt;/h2&gt;
&lt;h3&gt;一、核心概述&lt;/h3&gt;
&lt;p&gt;范式是关系模式的规范化标准，用于消除数据冗余与插入、更新、删除异常；
&amp;lt;br&amp;gt;规范化通过投影分解将低范式转换为高范式。
&amp;lt;br&amp;gt;层级关系(从低到高)：&lt;strong&gt;1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF ⊃ 4NF ⊃ 5NF&lt;/strong&gt;，高&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;范式&lt;/th&gt;
&lt;th&gt;主要解决的问题&lt;/th&gt;
&lt;th&gt;一句话理解&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1NF&lt;/td&gt;
&lt;td&gt;属性不可再分&lt;/td&gt;
&lt;td&gt;每个格子只能放一个值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2NF&lt;/td&gt;
&lt;td&gt;部分函数依赖&lt;/td&gt;
&lt;td&gt;非主属性&lt;strong&gt;不能&lt;/strong&gt;由主属性&lt;strong&gt;部分函数依赖&lt;/strong&gt;推出，必须完全依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3NF&lt;/td&gt;
&lt;td&gt;传递函数依赖&lt;/td&gt;
&lt;td&gt;不存在&lt;strong&gt;非主属性&lt;/strong&gt;对&lt;strong&gt;候选码&lt;/strong&gt;的传递函数依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BCNF&lt;/td&gt;
&lt;td&gt;决定因素不是码&lt;/td&gt;
&lt;td&gt;所有非平凡函数依赖中的决定因素（&lt;strong&gt;左边&lt;/strong&gt;），都必须是包含&lt;strong&gt;候选码&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4NF&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;每个非平凡多值依赖 X →→ Y 都满足 &lt;strong&gt;X含有码&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;二、1NF（第一范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;定义&lt;/h4&gt;
关系模式的所有属性均为 &lt;strong&gt;不可再分的原子数据项&lt;/strong&gt;，是关系数据库的最低要求。&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;实例&lt;/h4&gt;
关系模式 &lt;code&gt;SLC(Sno, Sdept, Sloc, Cno, Grade)&lt;/code&gt; 中，所有属性均为原子属性，满足 1NF。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;三、2NF（第二范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;
&amp;lt;br&amp;gt;非主属性&lt;strong&gt;不能&lt;/strong&gt;由候选码&lt;strong&gt;部分函数依赖&lt;/strong&gt;推出，必须完全依赖。
&lt;ul&gt;
&lt;li&gt;如：AF 是候选码，D 是非主属性。
&amp;lt;br&amp;gt;若A → D，说明非主属性 D对候选码部份依赖 $\Rightarrow$ 不满足2NF&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实例&lt;/strong&gt;：SLC 关系
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin: -20px; top&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/2NF1.png&quot; alt=&quot;函数依赖集1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solution&lt;/strong&gt;
&amp;lt;br&amp;gt;分解成2个关系模式（但插入异常、删除异常任然存在）
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -20px; top&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/2NF1.png&quot; alt=&quot;函数依赖集1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;四、3NF（第三范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;
&amp;lt;br&amp;gt;不存在&lt;strong&gt;非主属性&lt;/strong&gt;对&lt;strong&gt;候选码&lt;/strong&gt;的传递函数依赖，&lt;strong&gt;没有非主属性&lt;/strong&gt; → 3NF
&amp;lt;br&amp;gt;不存在码X、属性Y、非主属性Z使得 $X→Y，Y→Z$ 成立 $\Rightarrow Y \nrightarrow X$
&amp;lt;br&amp;gt;&lt;strong&gt;码&lt;/strong&gt; ~不能~和 &lt;strong&gt;非主属性&lt;/strong&gt; 有&lt;strong&gt;传递依赖&lt;/strong&gt;关系&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;实例&lt;/strong&gt;：SL 关系
&lt;img src=&quot;image-41.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;五、BCNF（巴斯范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;
&amp;lt;br&amp;gt;所有非平凡函数依赖中的决定因素（&lt;strong&gt;左边&lt;/strong&gt;），都必须是包含&lt;strong&gt;候选码&lt;/strong&gt;（都必须是&lt;strong&gt;超码&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实例 1：仓库管理关系&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -20px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/BCNF.png&quot; alt=&quot;BCNF1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 4; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/BCNF2.png&quot; alt=&quot;BCNF1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4NF（第四范式）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;
&amp;lt;br&amp;gt;每个非平凡多值依赖 X →→ Y 都满足 &lt;strong&gt;X含有码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分解&lt;/strong&gt;
&amp;lt;br&amp;gt;把独立的多值事实拆开 --&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-----&lt;/p&gt;
&lt;h2&gt;Armstrong公理系统&lt;/h2&gt;
&lt;p&gt;用于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从已有函数依赖推出&lt;em&gt;新的函数依赖&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;计算&lt;em&gt;属性集闭包&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;计算&lt;em&gt;候选码&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;支持&lt;em&gt;模式分解算法&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;Armstrong公理系统 - 基本规则&lt;/h3&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;u&amp;gt;&lt;strong&gt;A1 自反律&lt;/strong&gt;&amp;lt;/u&amp;gt;：知道一组属性，一定知道&lt;strong&gt;部分&lt;/strong&gt;
&amp;lt;br&amp;gt;   {Cno, Sname} → Cno&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;u&amp;gt;&lt;strong&gt;A2 增广律&lt;/strong&gt;&amp;lt;/u&amp;gt;：若 $X \rightarrow Y$，则 $XZ \rightarrow YZ$
&amp;lt;br&amp;gt;   Cno → Sname $\Rightarrow$ {Cno, clsno} → {Sname, clsno}&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;u&amp;gt;&lt;strong&gt;A3 传递律&lt;/strong&gt;&amp;lt;/u&amp;gt;：若 $X\rightarrow Y$ 且 $Y\rightarrow Z$，则 $X\rightarrow Z$
&amp;lt;br&amp;gt;   Cno → Class、Class → Teacher $\Rightarrow$ Cno → Teacher&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;Armstrong公理系统 -扩充规则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;合并规则&lt;/strong&gt;&amp;lt;/u&amp;gt;：若 X $\to$ Y 且 X $\to$ Z，则 X → YZ&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;分解规则&lt;/strong&gt;&amp;lt;/u&amp;gt;：若：X → YZ，则：X → Y，X → Z&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;伪传递规则&lt;/strong&gt;&amp;lt;/u&amp;gt;：若 X $\to $Y 且 WY $\to$ Z，则 XW $\to$ Z&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;引理：$X \to A_1A_2\cdots A_k \Rightarrow   X \to A_i( i=1,2,\dots,k)$ 成立
&amp;lt;br&amp;gt;学号 → (姓名, 班级, 专业) $\Rightarrow$ 学号 → 姓名，学号 → 班级，学号 → 专业&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;3.1 函数依赖的逻辑蕴涵&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;F 的所有规则，必然导致 X→Y 成立（X Y是属性/属性集）。是由F带来的，没有写出但必然成立的规则。
&amp;lt;br&amp;gt;则称：F &lt;strong&gt;逻辑蕴涵&lt;/strong&gt; X → Y，记作 &lt;strong&gt;F ⊨ X → Y&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;例：F = {学号 → 系名, 系名 → 系主任 }，则：F ⊨ 学号 → 系主任&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;3.2 函数依赖集的闭包 F^+&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;定义：$F^+ = { X \to Y \mid F \vDash X \to Y }$，即：所有被 F 逻辑蕴涵的&lt;strong&gt;函数依赖的集合&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;属性集 U={A,B,C}，函数依赖集 F={A→B, B→C} → $F^+$ ={ A→A, A→B, A→C, A→BC, A→AB, A→AC, A→ABC,
B→B, B→C, B→BC,
C→C,
AB→A, AB→B, AB→C, AB→AB, AB→AC, AB→BC, AB→ABC,
AC→A, AC→B, AC→C, AC→AB, AC→AC, AC→BC, AC→ABC,
BC→B, BC→C, BC→BC,
ABC→A, ABC→B, ABC→C, ABC→AB, ABC→AC, ABC→BC, ABC→ABC }&lt;/li&gt;
&lt;li&gt;直接计算 F⁺ 很麻烦。因为可能推出非常多的函数依赖。所以实际做题时，一般不直接求 F⁺，而是用 &lt;strong&gt;属性集闭包&lt;/strong&gt; X⁺ 👇来判断某个依赖是否成立。
​&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;3.3 属性集的闭包 $X_F^+$&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;从 属性A 出发，用 F 中的依赖能推导出的&lt;strong&gt;所有属性&lt;/strong&gt;的集合，$A_F^+$称为属性A关于函数依赖集F的闭包。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⭐例：计算A关于F的闭包 $A_F^+$
&amp;lt;br&amp;gt;初始：$A_F^+ = {A}$   用 A→B：$A_F^+ = {A,B}$   用 B→C：$A_F^+ = {A,B,C}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;计算方法：迭代算法
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-62.png&quot; alt=&quot;属性集的闭包&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;函数依赖集的覆盖与等价&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心概念
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;覆盖&lt;/strong&gt;：若 F 能推出 G 里的所有依赖 ($G\subseteq F^+$) ，就说 F覆盖G&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;等价&lt;/strong&gt;：若 F覆盖G 且 G覆盖F（$F^+ = G^+$），就说 F和G等价（充要关系）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;例
&amp;lt;br&amp;gt;设：F = { A → B, A → C }，设：G = { A → BC }
&amp;lt;br&amp;gt;$\Rightarrow$ F 和 G 等价。
&amp;lt;br&amp;gt;因为：由 F 可用合并规则推出 A → BC；由 G 可用分解规则推出 A → B 和 A → C
&amp;lt;br&amp;gt;所以：F⁺ = G⁺（“分开写”和“合起来写”本质上表达的是同一件事）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;极小函数依赖集 / 最小依赖集 / 最小覆盖&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;需满足 3 个条件：&lt;/h4&gt;
&lt;p&gt;设 F 为函数依赖集，F_m 是其极小依赖集，需满足：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;右边只有一个属性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;左边没有多余属性&lt;/strong&gt;
&amp;lt;br&amp;gt;AB → C，如果：A⁺ 中已经包含 C说明只用 A 就能推出 C，B 是多余的。
&amp;lt;br&amp;gt;于是：AB → C可以简化为：A → C&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有冗余函数依赖&lt;/strong&gt;
&amp;lt;br&amp;gt;F={A → B，B → C，A → C}，其中A → C 可由前两个推出来，所以A → C是冗余依赖，可删除
&lt;ul&gt;
&lt;li&gt;例：$F&apos; = { Sno \rightarrow Sdept, Sno \rightarrow Mname, Sdept \rightarrow Mname, $
&amp;lt;br&amp;gt; $(Sno, Cno) \rightarrow Grade, (Sno, Sdept) \rightarrow Sdept } $
&amp;lt;br&amp;gt;不是最小覆盖，上是冗余依赖，下是左边多于属性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;计算算法&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;右部拆分&lt;/strong&gt;：AD → EF 拆成：AD → E，AD → F；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删左边多余属性&lt;/strong&gt;：对于 ADF→ C：∵AD → F ，故可简化为 AD → C；
&amp;lt;br&amp;gt;对于 ADF → D：∵D已经包含在左边 $\rightarrow$ 可以删除该平凡函数依赖；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删冗余依赖&lt;/strong&gt;：对于C → B，可以由C → F，F → B推出。 &lt;strong&gt;删除&lt;/strong&gt; C → B；&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;特性：每个函数依赖集都等价于一个极小依赖集，且&lt;strong&gt;不唯一&lt;/strong&gt;。 --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- ---&lt;/p&gt;
&lt;h2&gt;模式分解&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h3&gt;模式分解的三个理解&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;无损连接&lt;/strong&gt;：自然连接后完全等于原表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保持函数依赖&lt;/strong&gt;：分解后所有依赖规则都能找到&lt;/li&gt;
&lt;li&gt;既 &lt;strong&gt;无损连接&lt;/strong&gt; 又 &lt;strong&gt;保持函数依赖&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐无损连接&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;有损连接：会产生多余元组。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定义：R = R1 ⋈ R2 ⋈ ... ⋈ Rn，能 &lt;strong&gt;自然连接&lt;/strong&gt;$\bowtie$ 回来，完全等于&lt;strong&gt;原表&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;💫判定：两张表的&amp;lt;u&amp;gt;&lt;em&gt;公共属性&lt;/em&gt;&amp;lt;/u&amp;gt;，如果能推出某一张表的&amp;lt;u&amp;gt;&lt;em&gt;非公共属性&lt;/em&gt;&amp;lt;/u&amp;gt;，就是无损连接。
&amp;lt;br&amp;gt;例如1：A是公共属性，能推出T1的非公共属性B。故满足无损连接性&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数依赖集&lt;/th&gt;
&lt;th&gt;分解ρ&lt;/th&gt;
&lt;th&gt;是否满足无损连接性？&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;{A→B}&lt;/td&gt;
&lt;td&gt;$T_1(A,B) T_2(A,C)$&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{A→C，B→C}&lt;/td&gt;
&lt;td&gt;$T_1(A,B) T_2(A,C)$&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{A→B}&lt;/td&gt;
&lt;td&gt;$T_1(A,B) T_2(B,C)$&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{A→B，B→C&lt;/td&gt;
&lt;td&gt;$T_1(A,B) T_2(B,C)$}&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐保持函数依赖&lt;/h3&gt;
&lt;p&gt;分解后，&lt;strong&gt;原来&lt;/strong&gt;的函数依赖能在&lt;strong&gt;子关系&lt;/strong&gt;中&lt;strong&gt;直接检查&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;🌟3NF模式分解&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;目标：得到 满足3NF 且 既有无损连接性又保持函数依赖 的分解&lt;/li&gt;
&lt;li&gt;步骤：&amp;lt;u&amp;gt;每条依赖建一张表，最后检查有没有候选码，没有就补上&amp;lt;/u&amp;gt;
&lt;ol&gt;
&lt;li&gt;求 F 的&lt;strong&gt;极小函数依赖集 Fmin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;求&lt;strong&gt;候选码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;谁决定谁，就把它们放在一张表里。
&amp;lt;br&amp;gt;例如：Sno → Sdept就建：SD(Sno, Sdept)&lt;/li&gt;
&lt;li&gt;检查是否需要补&lt;strong&gt;候选码表&lt;/strong&gt;：如果没有任何子关系包含原关系的&lt;strong&gt;候选码&lt;/strong&gt; K，则补一个关系 R(K)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;💫例：到3NF的模式分解示例
&lt;img src=&quot;image-44.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🌟BCNF 模式分解&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;目标：分解到 BCNF，并且保证无损连接。&lt;/li&gt;
&lt;li&gt;步骤：
&lt;ol&gt;
&lt;li&gt;初始 ρ = {R}&lt;/li&gt;
&lt;li&gt;检查每个关系是否满足 BCNF&lt;/li&gt;
&lt;li&gt;如果某个关系不满足 BCNF，则存在：X → Y，且 X 不是候选码&lt;/li&gt;
&lt;li&gt;分解为：&lt;strong&gt;R₁ = XY&lt;/strong&gt;，&lt;strong&gt;R₂ = U - Y&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;继续检查，直到全部满足 BCNF&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;💫例：转换为BCNF的无损连接分解
&amp;lt;br&amp;gt;STJ(S学生,T老师,J课程)，依赖包括：T → J，(S,J) → T，(S,T) → J
&amp;lt;br&amp;gt;STJ 满足 3NF，但不满足 BCNF。&lt;/p&gt;
&lt;p&gt;原因：T → J 中，T 不是超码。&lt;/p&gt;
&lt;p&gt;所以分解为：TJ(T,J) ST(S,T)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;多值依赖&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;定义：一个属性决定的不是一个值，而是&lt;strong&gt;一组值&lt;/strong&gt;。记作 &lt;strong&gt;X →→ Y&lt;/strong&gt;，读作Y多值依赖于X（有其他属性Z，Y、Z都多值依赖于X的充要条件是 X、Y可以自由组合）&lt;/li&gt;
&lt;li&gt;多值依赖 vs 函数依赖
&lt;ol&gt;
&lt;li&gt;跟&lt;strong&gt;Z&lt;/strong&gt;的关系
&amp;lt;br&amp;gt;函数依赖：只问“X 能不能唯一确定 Y”。
&amp;lt;br&amp;gt;多值依赖：还要问“Y 和剩下的属性是不是独立”。&lt;/li&gt;
&lt;li&gt;跟&lt;strong&gt;子集&lt;/strong&gt;的关系
&amp;lt;br&amp;gt;A → BC，则：A → B A → C
&amp;lt;br&amp;gt;多值依赖不一定成立
--- --&amp;gt;
&amp;lt;!-- # 🌟C6例题&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3&gt;⭐例1：属性集闭包算法 -计算A关于F的闭包 $A_F^+$&lt;/h3&gt;
&amp;lt;br&amp;gt;初始：$A_F^+ = {A}$   用 A→B：$A_F^+ = {A,B}$   用 B→C：$A_F^+ = {A,B,C}$
&lt;ul&gt;
&lt;li&gt;计算方法：迭代算法
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -30px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-62.png&quot; alt=&quot;属性集的闭包&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐例：等价/最小函数依赖集 -属性集闭包算法&lt;/h3&gt;
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image44.png&quot; alt=&quot;属性集的闭包&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐例2：极小函数依赖集算法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;右部拆分&lt;/strong&gt;：AD → EF 拆成：AD → E，AD → F；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删左边多余属性&lt;/strong&gt;：对于 ADF→ C：∵AD → F ，故可简化为 AD → C；
&amp;lt;br&amp;gt;对于 ADF → D：∵D已经包含在左边 $\rightarrow$ 可以删除该平凡函数依赖；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删冗余依赖&lt;/strong&gt;：对于C → B，可以由C → F，F → B推出。 &lt;strong&gt;删除&lt;/strong&gt; C → B；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐（补充3）例：判断冗余依赖&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;函数依赖集 M = {C → E，E → B，BCD → A}，断言：BCD → A 可以简化成 CD → A（C可以推出B），它是一个冗余函数依赖
&amp;lt;br&amp;gt;构造 N = {C → E，E → B，CD → A}，只需证明：$M^+ = N^+$（M能推出的=N能推出的）
&amp;lt;br&amp;gt;✅只需证明：M ⊨ CD → A？ N ⊨ BCD → A？&lt;/p&gt;
&lt;p&gt;① 证明：M ⊨ CD → A
&amp;lt;br&amp;gt;只需证明 ${C，D}_M^+$ 中包含 A，就能证明 CD → A
&amp;lt;br&amp;gt;初始值：{CD}_M^+ = {C，D}
&amp;lt;br&amp;gt;第一遍：{CD}_M^+ = {C，D，E}（C → E）
&amp;lt;br&amp;gt;第二遍：{CD}_M^+ = {B，C，D，E}（E → B）
&amp;lt;br&amp;gt;第三遍：{CD}_M^+ = {A，B，C，D，E}（BCD → A）&lt;/p&gt;
&lt;p&gt;② 同理得证：N ⊨ BCD → A&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;函数依赖集 M = {B → D，D → E，C → F，BC → A，EF → A}，断言：B→ A 是一个冗余的函数依赖
&amp;lt;br&amp;gt;构造 N = {B → D，D → E，C → F，EF → A}，要证明 $M^+ = N^+$，&amp;lt;br&amp;gt;只需证明：N ⊨ BC → A，即：${BC}_N^+$ 包含A&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;函数依赖集 F = {A → B，B → A，AB → C}，判断 AB → C 是否为部分函数依赖？
&amp;lt;br&amp;gt;只需假设把AB → C 换成 A → C/B → C是否依然成立。同上。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐例3：计算候选码&lt;/h3&gt;
要求候选码K，只需找到能推出全部属性U的 $K_R^+=U$ 即可。
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;没有出现在右边&lt;/strong&gt;的属性 → 一定在&lt;strong&gt;候选码&lt;/strong&gt;内（因为没有属性能推出它）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只出现在右边&lt;/strong&gt;的属性 → 一般&lt;strong&gt;不&lt;/strong&gt;放在候选码（因为可以由其他属性推出）&lt;/li&gt;
&lt;li&gt;其他属性待选跟1结合&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;先算1必须出现在候选码中的属性K，是否有 $K_R^+ = U$&lt;/li&gt;
&lt;li&gt;再依次跟3中属性结合。候选码可能不止1个。 --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;C7 数据库设计&lt;/h1&gt;
&lt;h2&gt;数据库设计的基本方法&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;设计方法&lt;/th&gt;
&lt;th&gt;对象&lt;/th&gt;
&lt;th&gt;目的&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;新奥尔良法&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;整体的数据库设计流程方式&lt;/td&gt;
&lt;td&gt;覆盖各阶段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;基于E-R模型设计&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;概念结构设计&lt;/td&gt;
&lt;td&gt;用 E-R / EER 图把用户需求抽象成实体、属性、联系&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3NF设计方法&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;逻辑结构设计&lt;/td&gt;
&lt;td&gt;将概念模型转为关系表，并保证满足3NF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;面向对象的数据库设计方法&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;面向对象数据库&lt;/td&gt;
&lt;td&gt;把实体看作对象，属性/方法封装在对象中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;统一建模语言（UML）方法&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;概念建模/逻辑设计&lt;/td&gt;
&lt;td&gt;用类图、对象图、时序图等 UML 工具表示&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;数据库设计基本步骤（新奥尔良法）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 70%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/DBDP.png&quot; alt=&quot;数据库的设计&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工作&lt;/th&gt;
&lt;th&gt;所属阶段&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;收集业务需求、数据流&lt;/td&gt;
&lt;td&gt;需求分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;画 ER/EER 图&lt;/td&gt;
&lt;td&gt;概念结构设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ER 转关系模式、规范化&lt;/td&gt;
&lt;td&gt;逻辑结构设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;设计索引、文件组织、聚簇&lt;/td&gt;
&lt;td&gt;物理结构设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;建表、装载数据、编程&lt;/td&gt;
&lt;td&gt;数据库实施&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;1. 需求分析&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;目标：明确用户信息需求（What）与处理需求（How），为概念设计提供基础&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;需求分析产出结果&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;数据字典&lt;/strong&gt;&amp;lt;/u&amp;gt;（学号：字符型，10位，唯一标识学生）&lt;/li&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;用户需求规格说明书&lt;/strong&gt;&amp;lt;/u&amp;gt;（学生可以选课、退课、查成绩；教师可以录入成绩）&lt;/li&gt;
&lt;li&gt;这两个结果是&lt;strong&gt;概念结构设计&lt;/strong&gt;的基础输入（为下一步画 &lt;strong&gt;E-R 图&lt;/strong&gt;提供依据）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3&gt;数据字典 DD&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：&lt;strong&gt;数据字典&lt;/strong&gt;是对数据库中数据的&amp;lt;u&amp;gt;描述&amp;lt;/u&amp;gt;，也叫&lt;strong&gt;元数据/基础数据&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例：具体数据：张三，20240001，数据库原理，88
&amp;lt;br&amp;gt;元数据：学号是 CHAR(10)，姓名是 VARCHAR(20)，成绩是 0~100 的整数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;数据字典的内容&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4&gt;数据项&lt;/h4&gt;
&lt;p&gt;数据项是&lt;strong&gt;不可再分&lt;/strong&gt;的数据单位，是数据的最小组成单位&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;数据结构&lt;/h4&gt;
&lt;p&gt;数据结构：由若干数据项/数据结构组成，反映数据之间的&lt;strong&gt;组合关系&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;数据流&lt;/h4&gt;
&lt;p&gt;数据流：数据结构在系统内部传输的&lt;strong&gt;路径&lt;/strong&gt;(数据从哪里来，到哪里去)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;数据存储&lt;/h4&gt;
&lt;p&gt;数据存储：数据结构&lt;strong&gt;停留&lt;/strong&gt;或&lt;strong&gt;保存&lt;/strong&gt;的地方，也是数据流来源和去向之一（数据存在哪里）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;处理过程&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;处理过程：系统对数据进行加工处理的过程。处理过程的具体处理逻辑一般用&lt;strong&gt;判定表&lt;/strong&gt;或&lt;strong&gt;判定树&lt;/strong&gt;来描述。&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;判定表 &amp;amp; 判定树&lt;/h4&gt;
&lt;img src=&quot;image-70.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 概念结构设计&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;概念结构设计：把需求抽象成概念模型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;描述概念模型的工具：E-R 模型 / EER 模型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;概念结构设计方法&lt;/h3&gt;
&lt;p&gt;自顶向下、自下向上、二者混合策略、逐步扩张（学生的核心需求和概念结构 → 再扩展教师等其他需求和概念结构）
&lt;img src=&quot;image-71.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;!-- ### E-R模型&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;E-R 模型三要素：实体（学生，学生实体集 = 所有学生）、属性（姓名、年龄）、联系（学生“选修”课程）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;联系&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;联系的相关概念 &lt;code&gt;学生 —— 选修 —— 课程&lt;/code&gt;
&amp;lt;br&amp;gt;联系名：选修； 联系属性：成绩；
&amp;lt;br&amp;gt;联系的度：2（因为参与的是学生、课程两个实体）；函数关系：m:n，因为一个学生选多门课，一门课被多个学生选&lt;/li&gt;
&lt;li&gt;联系的分类
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;th&gt;例子&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;二元联系&lt;/td&gt;
&lt;td&gt;两个实体型之间&lt;/td&gt;
&lt;td&gt;学生-课程&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多元联系&lt;/td&gt;
&lt;td&gt;三个或更多实体型之间&lt;/td&gt;
&lt;td&gt;供应商-项目-零件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一元联系&lt;/td&gt;
&lt;td&gt;一个实体型内部&lt;/td&gt;
&lt;td&gt;职工领导职工 （联系的&lt;strong&gt;度&lt;/strong&gt;是&lt;strong&gt;2&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;⭐怎么画E-R图？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;三要素的表示
&lt;img src=&quot;image-46.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;联系的三种分类的表示
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -20px;margin-bottom: -10px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/relationship1.png&quot; alt=&quot;联系1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/relationship2.png&quot; alt=&quot;联系2&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/relationship3.png&quot; alt=&quot;联系3&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;li&gt;例
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -20px;margin-bottom: -10px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er1.png&quot; alt=&quot;er图1&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er2.png&quot; alt=&quot;er图2&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/er3.png&quot; alt=&quot;er图3&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;EE-R模型&lt;/h3&gt;
&lt;p&gt;扩展(Extended)E-R模型&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ISA联系&lt;/strong&gt;：不相交 &amp;amp; 完全特化
&lt;img src=&quot;image-61.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;img src=&quot;image-62.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part-of联系&lt;/strong&gt; 双菱形
&lt;img src=&quot;image-76.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;弱实体&lt;/strong&gt;：双矩形。自己的属性不一定能独立区分自己（有不同贷款但可能在同一天还款、金额也可能一样）
&lt;img src=&quot;image-87.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基数约束&lt;/strong&gt;表示：min（强制参与/非强制参与）..max（单值参与/多值参与）
&amp;lt;br&amp;gt;对联系R来说，当前实体可以对应多少个另一个实体
&lt;img src=&quot;image-89.png&quot; alt=&quot;alt text&quot; /&gt;&lt;img src=&quot;image-88.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标法&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0..1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可以不参与；如果参与，最多一次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1..1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;必须参与；且只能一次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0..*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可以不参与；也可以参与很多次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1..*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;必须至少参与一次；可以参与很多次&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;为什么引入：消除歧义
&lt;img src=&quot;image-90.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;属性的划分&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;th&gt;实例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;标识符&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;唯一标识&lt;/strong&gt;一个实体的属性&lt;/td&gt;
&lt;td&gt;学生的学号、职工的工号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;描述符&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;普通描述属性，&lt;strong&gt;不能唯一识别&lt;/strong&gt;实体&lt;/td&gt;
&lt;td&gt;姓名、性别、年龄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;单值属性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;一个实体在这个属性上只有一个值&lt;/td&gt;
&lt;td&gt;学生的学号、学生的姓名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;组合属性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;本身是一个属性，但内部由多个简单属性组成&lt;/td&gt;
&lt;td&gt;地址 = 省 + 市 + 区 + 街道&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;多值属性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;一个实体在这个属性上可以有多个值&lt;/td&gt;
&lt;td&gt;一个学生可以有多个兴趣爱好&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;组合属性&lt;/strong&gt; / &lt;strong&gt;多值属性&lt;/strong&gt;
&amp;lt;div style=&quot;display: flex; width: 120%; margin-left: 0; margin-top: -20px;margin-bottom: -10px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/zuheshux.png&quot; alt=&quot;组合属性的子属性表示&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/duozhishux1.png&quot; alt=&quot;多值属性的双线桥表示&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/duozhishux2.png&quot; alt=&quot;多值属性的基数约束表示&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;E-R模型设计原则&lt;/h3&gt;
&lt;h4&gt;i、实体 or 属性&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;原则：能作为属性处理的，尽量作为属性处理，以简化 E-R 图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;两条判断准则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果某个对象本身还需要描述其他性质，应作为实体&lt;/li&gt;
&lt;li&gt;如果某个对象还要和其他实体发生联系，应作为实体&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例
&amp;lt;div style=&quot;display: flex; width: 80%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-76.png&quot; alt=&quot;数据库的设计&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;ii、实体 or 联系&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;实体：可以独立存在的持久对象&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例：学生、课程、商品、顾客、订单&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;联系：因为某种事情发生而产生的信息，通常依赖多个实体&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例：学生选课、顾客购买商品、教师讲授课程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有些事件也可以被设计成实体&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例：订单
&lt;ul&gt;
&lt;li&gt;如果只是简单零售购买行为。&lt;br /&gt;
若购买动作有属性（购买时间、购买数量等），这些信息&amp;lt;u&amp;gt;只在购买发生时才存在&amp;lt;/u&amp;gt;，不能直接放在顾客/商品上 → 属于联系属性购买[时间、数量]
&lt;code&gt;顾客 —— 购买（时间，数量） —— 商品&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果大量购买，订单有订单号、时间、金额、状态等属性，应把订单作为实体
&lt;code&gt;顾客 —— 下达 —— 订单；订单 —— 包含 —— 订单明细&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;iii、二元联系 or 多元联系&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;二元联系：两个实体之间的联系
&lt;ul&gt;
&lt;li&gt;例：
&lt;code&gt;学生 —— 选修 —— 课程&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;多元联系：三个或更多实体之间的联系
&lt;ul&gt;
&lt;li&gt;例：供应商给某项目供应某零件
&amp;lt;br&amp;gt;联系上可以有属性：供应量、供应日期、价格
&lt;code&gt;供应商 —— 供应 —— 项目 —— 零件&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;iv、属性依附于实体 or 联系&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;实体属性：实体本身具有的属性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例：
&lt;code&gt;学生姓名 属于 学生；课程学分 属于 课程&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;联系属性：跟随联系存在而存在，消亡而消亡的属性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例：
&lt;code&gt;学生 —— 选修(成绩, 选课时间) —— 课程&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;E-R图集成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;处理冲突：命名冲突、属性冲突、结构冲突&lt;/li&gt;
&lt;li&gt;消除冗余：冗余数据可由基本数据推出，冗余联系可由其他联系推出（适当保留提高效率）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 逻辑结构设计&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;逻辑结构设计：把 E-R 图翻译成&lt;strong&gt;关系表&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;实体集 &amp;amp; 属性 → 表&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;规则1：&lt;strong&gt;实体集&lt;/strong&gt;转换为&lt;strong&gt;关系模式&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;E-R图中有实体：科室、医生、病人、病例
&amp;lt;br&amp;gt;→ 科室表、医生表、病人表、病例表&lt;/li&gt;
&lt;li&gt;E-R图中有实体：医生，有属性：医生号，姓名，职称
&amp;lt;br&amp;gt;→ &lt;strong&gt;医生（&amp;lt;u&amp;gt;医生号&amp;lt;/u&amp;gt;，姓名，职称）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;规则2：&lt;strong&gt;组合属性拆成子属性&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;不写emp_address，而是子属性（staddress、city、state、zipcode 要么全为空，要么全不为空）
&lt;img src=&quot;image-91.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;规则3：&lt;strong&gt;多值属性拆成新表&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;对于学号S1307，姓名王承志，选修课程（Database, Operating System, Computer Network）&lt;/li&gt;
&lt;li&gt;方法一：纵向展开；方法二：分解出去，单独成表
&lt;img src=&quot;image-92.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;联系转换 &amp;amp; 全参与/非全参与&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;补充：实体集与联系的&lt;strong&gt;全参与/非全参与&lt;/strong&gt;
&lt;img src=&quot;image-93.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1:1联系转换&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1:1 联系可以单独建表，也可以合并到任意一端（要考虑是否&lt;strong&gt;全参与&lt;/strong&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;规则&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参与情况&lt;/th&gt;
&lt;th&gt;建表方式&lt;/th&gt;
&lt;th&gt;例子&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;两边非全参与（0..1/0..1）&lt;/td&gt;
&lt;td&gt;联系&lt;strong&gt;单独建表&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;电单车—电池&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一边全参与(1..1)，一边非全参与(0..1)&lt;/td&gt;
&lt;td&gt;依赖存在方+&lt;strong&gt;依赖的主码&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;人—驾驶证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;两边全参与(1..1/1..1)&lt;/td&gt;
&lt;td&gt;联系和实体&lt;strong&gt;合并成一个表&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;学生—校园卡&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例：非全参与、非全参与（&lt;strong&gt;分开单独建表&lt;/strong&gt;）
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-94.png&quot; alt=&quot;数据库的设计&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例：全参与、非全参与（依赖存在的全参与端驾驶证要&lt;strong&gt;加上&lt;/strong&gt;依赖存在的&lt;strong&gt;人&lt;/strong&gt;的&lt;strong&gt;主码&lt;/strong&gt;）
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px;margin-bottom: -20px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-95.png&quot; alt=&quot;数据库的设计&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例：全参与、全参与（&lt;strong&gt;合并&lt;/strong&gt;）
&amp;lt;div style=&quot;display: flex; width: 100%; margin-left: 0; margin-top: -40px;margin-bottom: -10px&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 6; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/image-96.png&quot; alt=&quot;数据库的设计&quot; style=&quot;width: 100%; max-width: 600px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1:n联系转换&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1:n 联系通常把 &lt;strong&gt;1 端的主码&lt;/strong&gt;加入到 n 端作为外码&lt;/li&gt;
&lt;li&gt;多端全参与：多方加上&lt;strong&gt;外码&lt;/strong&gt;
&lt;img src=&quot;image-94.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;多端非全参与：&lt;strong&gt;3张表&lt;/strong&gt;
&lt;img src=&quot;image-95.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;m:n联系转换&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;建&lt;strong&gt;3张表&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;例：病人去医生那就诊（一个医生有多个病人，一个病人也有多个医生）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;病人（病人号，姓名）
医生（医生号，姓名）
就诊（病人号，医生号，就诊时间，就诊记录）
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多元联系转换&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;实体&lt;/strong&gt;建表之外，&lt;strong&gt;多元联系&lt;/strong&gt;也建一个表&lt;/li&gt;
&lt;li&gt;例：供应商向项目供应零件（E-R图中E-R 图：供应商 —— 供应 —— 项目 —— 零件）
&amp;lt;br&amp;gt;某供应商给某项目供应某零件，供应量是多少。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;供应商(供应商号, 供应商名)
项目(项目号, 项目名)
零件(零件号, 零件名)

供应(供应商号, 项目号, 零件号, 供应量)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单个实体集&lt;strong&gt;内部&lt;/strong&gt;的联系转换&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例：职工之间存在领导关系
&amp;lt;br&amp;gt;这里“领导职工号”也是职工号，表示该职工的上级（1：1）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;职工(职工号, 姓名, 领导职工号)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果是 m:n 的内部关系，需要新建关系&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt; 职工(职工号, 姓名)
 合作(职工号1, 职工号2, 项目名)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;例：一个职工可以管理多个下级职工、一个职工只能有一个上级职工
&lt;img src=&quot;image-96.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ISA&lt;/strong&gt;联系转换（父子类）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;方法一：建3个表（不相交 + 部分特化）
&amp;lt;br&amp;gt;建&lt;code&gt;学生（），教师（），职工（），硕导（），博导（）&lt;/code&gt;
&lt;img src=&quot;image-97.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;方法二：只建2个子表（不相交 + 完全特化II）&lt;/li&gt;
&lt;li&gt;方法三：建1个表&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;具有相同码的关系模式合并&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果两个关系模式具有相同主码，且语义上属于同一对象，可以考虑合并&lt;/li&gt;
&lt;li&gt;例：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;学生基本信息(学号, 姓名, 性别)
学生学籍信息(学号, 专业, 入学年份)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以合并为：&lt;code&gt;学生(学号, 姓名, 性别, 专业, 入学年份)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;数据模型优化&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;数据模型优化通常用规范化理论作指导&lt;/li&gt;
&lt;li&gt;目标：
&lt;ul&gt;
&lt;li&gt;减少数据冗余（拆成多个表）&lt;/li&gt;
&lt;li&gt;避免更新异常&lt;/li&gt;
&lt;li&gt;避免插入异常&lt;/li&gt;
&lt;li&gt;避免删除异常&lt;/li&gt;
&lt;li&gt;提高数据一致性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;分解方法：&lt;strong&gt;水平分解&lt;/strong&gt;（分行：分成23级学生、24级学生）、&lt;strong&gt;垂直分解&lt;/strong&gt;（分列：分成学生基本信息+联系方式）&lt;/li&gt;
&lt;li&gt;设计用户&lt;strong&gt;子模式&lt;/strong&gt;（&lt;strong&gt;视图&lt;/strong&gt;）
&lt;ul&gt;
&lt;li&gt;视图作用：
&amp;lt;br&amp;gt;简化用户操作；
&amp;lt;br&amp;gt;满足不同用户需求；
&amp;lt;br&amp;gt;隐藏敏感数据，保证安全性；
&amp;lt;br&amp;gt;封装复杂查询。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;物理结构设计&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;物理结构设计：为逻辑数据结构选择最适合应用环境的物理结构&lt;/li&gt;
&lt;li&gt;常见的存取方法
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;适合场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;B+ 树索引&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;范围查询/连接/排序/最值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hash 索引&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;等值查询/连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;聚簇存取&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;经常按某属性集中访问的数据&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;数据库实施&lt;/h2&gt;
&lt;hr /&gt;
&lt;h1&gt;⭐C8 数据库编程&lt;/h1&gt;
&lt;p&gt;SQL语言的三种使用方式：&lt;strong&gt;交互式SQL&lt;/strong&gt;(可独立运行)、&lt;strong&gt;嵌入式SQL&lt;/strong&gt;(主语言+ESQL)、&lt;strong&gt;过程化SQL&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;嵌入式SQL&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;嵌入式SQL是将SQL语句嵌入程序设计语言中，被嵌入的程序设计语言称为 (宿)主语言。如Java、C++&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;格式&lt;/h3&gt;
前缀 &lt;strong&gt;EXEC SQL&lt;/strong&gt;  后缀 &lt;strong&gt;;&lt;/strong&gt;   &lt;strong&gt;into&lt;/strong&gt;获取结果元组值   前缀 &lt;strong&gt;:&lt;/strong&gt; 来区分主变量&lt;pre&gt;&lt;code&gt;EXEC SQL select Sno, Sname, Sage
    into :hsno, :hsname, :hsage -- 输出主变量（由SQL语句对其赋值/设置状态信息，返回给应用程序）
    from Student
    where Sno = :givensno ; -- 输入主变量（由应用程序对其赋值，在SQL语句引用）
    -- 根据程序传入的学号，从 Student 表查询单个学生的学号、姓名、年龄，并把结果存入主变量
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;SQL通信区（SQLCA）&lt;/h3&gt;
SQL语句执行后，数据库系统需要反馈给应用程序的信息：&amp;lt;u&amp;gt;描述系统当前工作状态&amp;lt;/u&amp;gt;、&amp;lt;u&amp;gt;描述运行环境&amp;lt;/u&amp;gt;
&amp;lt;br&amp;gt;这些信息将送到并保存在SQL通信区中、应用程序从SQL通信区中获取这些状态信息。
&lt;ul&gt;
&lt;li&gt;定义SQLCA
&amp;lt;br&amp;gt;用 &lt;code&gt;EXEC SQL INCLUDE SQLCA&lt;/code&gt; 定义&lt;/li&gt;
&lt;li&gt;使用SQLCA
&amp;lt;br&amp;gt;SQLCA中有一个用于存放每次执行SQL语句后返回当前SQL语句执行状态的代码变量&lt;strong&gt;SQLCODE&lt;/strong&gt;；
&amp;lt;br&amp;gt;每执行完一条SQL语句之后都测试：执行成功返回SUCCESS（0），否则表示出错或异常。
SQLCODE的值，以了解该SQL语句执行情况并做相应处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;主变量&lt;/h3&gt;
嵌入式SQL语句中可以使用的主语言程序变量
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;指示变量&lt;/strong&gt;
&amp;lt;br&amp;gt;是一个整型变量，是一种特殊的主变量，用来“指示”相关主变量的值是否为 &lt;strong&gt;空值&lt;/strong&gt;
&amp;lt;br&amp;gt;指示变量的用途：指示输入主变量是否为空值；检测输出变量是否为空值，值是否被截断&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指示变量取值&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;主变量正常接收到了非空的数据库值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; 0&lt;/td&gt;
&lt;td&gt;数据库字符串被截断，只存了部分到主变量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;数据库值是NULL，主变量里的值无意义&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例：查询返回的Grade属性值是否为NULL/根据课程号把该课程的成绩都置为空。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EXEC SQL SELECT Sno, Cno, Grade
    INTO :Hsno, :Hcno, :Hgrade :Gradeid 
    -- 多一个:Gradeid。:Hgrade 是接收成绩的主变量，:Gradeid 就是它的指示变量
    FROM SC
    WHERE Sno = :givensno AND Cno = :givencno;
-- 如果数据库里 Grade 不是空值 → Gradeid = 0，可以直接用 Hgrade 的值
-- 如果数据库里 Grade 是 NULL → Gradeid = -1，说明 Hgrade 里的值是无效的，不能直接用
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;gra_ind = -1 ;  -- 要把数据库里的值改成 NULL
EXEC SQL UPDATE SC
    SET Grade = :Hgrade INDICATOR :gra_ind 
    -- 把 Grade 字段的值设置成 :Hgrade，但要首先参考指示变量 gra_ind
    -- 数据库会忽略 :Hgrade 里的数字，直接把 Grade 设为 NULL
    WHERE cno = :givencno; -- 根据学号查找
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为了使用主语言变量，必须首先在DECLARE SECTION部分声明这些变量
&amp;lt;br&amp;gt;Why? 编译时类型检查、预先申请内存空间。只有在declare section中定义的主语言变量才能被用在ESQL中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;exec sql begin declare section; -- 主变量声明开始
char hsno[10]，givensno[10], hsname[21];
int hsage;
exec sql end declare section; -- 主变量生声明结束

EXEC SQL select Sno, Sname, Sage
into :hsno, :hsname, :hsage
from Student
where Sno = :givensno ; --根据学号查询学号、姓名、年龄
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;⭐游标 Cursor&lt;/h3&gt;
游标是系统为用户开设的一个&lt;strong&gt;数据缓冲区&lt;/strong&gt;，用于存放SQL查询的&lt;strong&gt;执行结果&lt;/strong&gt;。解决SQL批量返回数据、主语言单条处理之间的矛盾
&lt;ul&gt;
&lt;li&gt;声明游标 &lt;code&gt;EXEC SQL DECLARE 游标名 CURSOR FOR 查询语句;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;打开游标 &lt;code&gt;EXEC SQL OPEN 游标名;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;提取数据 &lt;code&gt;EXEC SQL FETCH 游标名 INTO 主变量;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;关闭游标 &lt;code&gt;EXEC SQL CLOSE 游标名;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;过程&lt;/h3&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;建立/关闭数据库连接&lt;pre&gt;&lt;code&gt;EXEC SQL CONNECT TO target [AS 连接名] [USER 用户名]; -- 建立连接
EXEC SQL SET CONNECTION 连接名 | DEFAULT; -- 切换连接
EXEC SQL DISCONNECT 连接名 | DEFAULT; -- 关闭连接
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例
依次检查某个系的学生记录，交互式更新某些学生年龄。&lt;pre&gt;&lt;code&gt;EXEC SQL BEGIN DECLARE SECTION; /*主变量声明开始*/
    char Deptname[21];
    char Hsno[10];
    char Hsname[21];
    char Hssex[3];
    int HSage;
    int NEWAGE;
EXEC SQL END DECLARE SECTION; /*主变量声明结束*/

long SQLCODE;
EXEC SQL INCLUDE SQLCA; /*定义SQL通信区*/

#include &amp;lt;sqlca.h&amp;gt;

int main(void) /*C语言主程序开始*/
{
    int count = 0;
    char yn; /*变量yn代表yes或no*/
    printf(&quot;Please choose the department name(CS/MA/IS): &quot;);
    scanf(&quot;%s&quot;,deptname); /*为主变量deptname赋值*/
    EXEC SQL CONNECT TO TEST@localhost:54321 USER &quot;SYSTEM&quot;/&quot;MANAGER&quot;; /*连接数据库TEST*/
    -- 我现在要登录连接到数据库，数据库地址是本机，端口是 54321，数据库名字叫 TEST，登录账号是 SYSTEM，密码是 MANAGER
    EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/
        SELECT Sno,Sname,Ssex,Sage /*游标SX对应的查询语句*/
        FROM Student
        WHERE SDept = :deptname;
    EXEC SQL OPEN SX;
/*打开游标SX，执行游标对应的查询，并指向查询结果的第一行*/

    for (;;) -- 循环读取游标里的每一条数据，直到游标读完 / 出错时退出
    {
        /* 推进游标，将当前数据放入主变量 */
        EXEC SQL FETCH SX INTO :Hsno, :Hsname, :Hssex, :HSage;
        if (sqlca.sqlcode != 0) { -- 操作不成功时退出
            break;
        }

        /* 是第一行的话，打印表头和学生信息 */
        if (count++ == 0) {
            printf(&quot;\n%-10s %-20s %-10s %-10s\n&quot;, &quot;Sno&quot;, &quot;Sname&quot;, &quot;Ssex&quot;, &quot;Sage&quot;);
        }

        /* 打印当前学生信息 */
        printf(&quot;%-10s %-20s %-10s %-10d\n&quot;, Hsno, Hsname, Hssex, HSage);

        /* 询问用户是否要更新该学生的年龄 */
        printf(&quot;UPDATE AGE(y/n)? &quot;);
        do {
            scanf(&quot;%c&quot;, &amp;amp;yn);
            -- getchar();  --吃掉多余的换行符
        } while (yn != &apos;N&apos; &amp;amp;&amp;amp; yn != &apos;n&apos; &amp;amp;&amp;amp; yn != &apos;Y&apos; &amp;amp;&amp;amp; yn != &apos;y&apos;);
        -- 强制让用户必须输入 Y/y/ N/n 才往下走，输错就一直重新输

        /* 如果选择更新操作 */
        if (yn == &apos;y&apos; || yn == &apos;Y&apos;) {
            printf(&quot;INPUT NEW AGE: &quot;);
            scanf(&quot;%d&quot;, &amp;amp;NEWAGE);
            getchar();

            /* 嵌入式SQL更新语句*/
            EXEC SQL UPDATE Student
                SET Sage = :NEWAGE  -- Sage更新为读入的NWEAGE
                WHERE CURRENT OF SX;
        } /* 对当前游标指向的学生年龄进行更新 */
    }

    /* 收尾 */
    EXEC SQL CLOSE SX; -- 关闭游标SX，不再和查询结果对应
    EXEC SQL COMMIT WORK; -- 提交更新
    EXEC SQL DISCONNECT TEST; -- 断开数据库连接
} -- 只在 EXEC SQL FETCH SX INTO 语句之后检查了状态码 SQLCA.SQLCODE
-- 在其他嵌入式SQL语句之后，都没有检查SQL语句的执行状态码！
-- Solution：添加异常处理👇
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;异常处理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;whenever&lt;/code&gt;是嵌入式SQL的全局异常捕获机制&lt;pre&gt;&lt;code&gt;EXEC SQL WHENEVER 条件 动作;
&lt;/code&gt;&lt;/pre&gt;
&lt;strong&gt;预编译器&lt;/strong&gt;在处理过程中，会根据WHENEVER语句的定义，在每一条&lt;strong&gt;嵌入式SQL语句&lt;/strong&gt;之后添加下面的异常状态检查命令： &lt;code&gt;if ( condition ) { action }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;常见执行异常
&amp;lt;br&amp;gt;&lt;strong&gt;SQLERROR&lt;/strong&gt;、&lt;strong&gt;NOT FOUND&lt;/strong&gt;、&lt;strong&gt;SQLWARNING&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;处理方法
&lt;strong&gt;CONTINUE&lt;/strong&gt;、&lt;strong&gt;GOTO&lt;/strong&gt;、&lt;strong&gt;STOP&lt;/strong&gt;、&lt;strong&gt;DO function &lt;strong&gt;| &lt;strong&gt;BREAK&lt;/strong&gt; |&lt;/strong&gt; CONTINUE&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;例&lt;pre&gt;&lt;code&gt;exec sql whenever sqlerror goto report_error ;
exec sql whenever not found goto notfound ;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;不用游标的SQL语句&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;说明性语句、数据定义 / 控制语句&lt;pre&gt;&lt;code&gt;-- 1. 主变量声明（必须用固定段包裹）
EXEC SQL BEGIN DECLARE SECTION;
    char givensno[10];  
    char hsno[10], hsname[21];  
EXEC SQL END DECLARE SECTION;

-- 2. 定义SQL通信区（获取SQL执行状态）
EXEC SQL INCLUDE SQLCA;

-- 3. 异常处理声明（出错跳转、无数据跳转）
EXEC SQL WHENEVER SQLERROR GOTO error_handle;  
EXEC SQL WHENEVER NOT FOUND GOTO no_    data;  

-- 创建学生表 CREATE
EXEC SQL CREATE TABLE Student (
    Sno CHAR(9) PRIMARY KEY,   
    Sname CHAR(20) NOT NULL,    
    Sage SMALLINT,              
    Sdept CHAR(20)             
);   
--删除表DROP
EXEC SQL DROP TABLE TEST;
-- 修改ALTER:为Student表添加手机号字段
EXEC SQL ALTER TABLE Student ADD Sphone CHAR(11); 

-- 授权：给用户user1授予Student表的查询、修改权限
EXEC SQL GRANT SELECT, UPDATE ON Student TO user1;
-- 回收user1对Student表的修改权限
EXEC SQL REVOKE UPDATE ON Student FROM user1;
-- 事务控制：提交数据库更新（如增删改）
EXEC SQL COMMIT WORK;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;单条结果查询：SELECT ... INTO ...&lt;pre&gt;&lt;code&gt;EXEC SQL SELECT Sno,Cno,Grade
    INTO :Hsno, :Hname, :Hcno, :Hgrade, :Gradeid /* 指示变量Gradeid */
    FROM SC
    WHERE Sno = :givensno AND Cno = :givencno;
if(Gradeid &amp;lt; 0){ 
  ……    -- 学生givensno在课程givencno上的成绩为空值
}else{ 
  …… 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;普通增删改（非 CURRENT 形式的 INSERT、DELETE、UPDATE）
&amp;lt;br&amp;gt;增：某个学生新选修了某门课程，将有关记录插入SC表中。假设插入的学号已赋给主变量stdno，课程号已赋给主变量couno。&lt;pre&gt;&lt;code&gt;gradeid = −1； /* gradeid为指示变量 */
EXEC SQL INSERT
INTO SC(Sno, Cno, Grade)
VALUES(:stdno, :couno, :gr :gradeid);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使用游标的SQL语句&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用语句多条结果的 SELECT 查询、CURRENT 形式的 UPDATE/DELETE 语句&lt;/li&gt;
&lt;li&gt;游标(Cursor)的使用操作
&lt;ol&gt;
&lt;li&gt;声明游标 &lt;code&gt;EXEC SQL DECLARE 游标名 CURSOR FOR 查询语句;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;打开游标 &lt;code&gt;EXEC SQL OPEN 游标名;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;提取数据 &lt;code&gt;EXEC SQL FETCH 游标名 INTO 主变量;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;关闭游标 &lt;code&gt;EXEC SQL CLOSE 游标名;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;可滚动游标 &lt;strong&gt;SCROLL&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;-- 加SCROLL
EXEC SQL DECLARE agent_dollars SCROLL CURSOR FOR
SELECT aid, sum(dollars)
FROM orders
WHERE cid = :cust_id
GROUP BY aid;

EXEC SQL OPEN agent_dollars;

EXEC SQL FETCH FIRST agent_dollars INTO :agent_id,:dollar_sum;
EXEC SQL FETCH LAST agent_dollars INTO :agent_id,:dollar_sum;
EXEC SQL FETCH PRIOR agent_dollars INTO :agent_id,:dollar_sum; -- 上一个
EXEC SQL FETCH NEXT agent_dollars INTO :agent_id,:dollar_sum; -- 下一个
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例&lt;pre&gt;&lt;code&gt;EXEC SQL INCLUDE SQLCA; --定义SQL状态区
-- 声明主变量
EXEC SQL BEGIN DECLARE SECTION;
    char cust_id[10];   
    char agent_id[10];  
    float dollar_sum; 
EXEC SQL END DECLARE SECTION;

-- 声明异常处理（必须写在最前面！）
EXEC SQL WHENEVER NOT FOUND GOTO finish;  

/* 声明游标 agent_dollars */
EXEC SQL DECLARE agent_dollars CURSOR FOR
    SELECT aid,sum(dollars)
    FROM orders
    WHERE cid=:cust_id
    GROUP BY aid;
/* 打开游标 */
EXEC SQL OPEN agent_dollars;
/* 提取数据 */
while (TRUE) { 
    EXEC SQL FETCH agent_dollars INTO :agent_id, :dollar_sum;
    -- 推动游标指针至下一条记录，同时将当前记录取出来送至主变量
    printf(&quot;%s %11.2f\n&quot;, agent_id, dollar_sum);
}
/* 关闭游标 */
finish: EXEC SQL CLOSE agent_dollars;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;CURRENT 形式的 UPDATE/DELETE 语句&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要对查询结果集做差异化修改（如有的行改、有的不改、有的改的数值不同），而不是批量UPDATE/DELETE
&lt;code&gt;WHERE CURRENT OF 游标名&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EXEC SQL DECLARE SX CURSOR FOR
    SELECT Sno,Sname,Ssex,Sage
    FROM Student
    WHERE Sdept=:deptname;
EXEC SQL OPEN SX;
for(;;){
    EXEC SQL FETCH SX INTO :HSno,:Hname,:HSsex,:HSage;
    if (SQLCA.SQLCODE != 0) break; -- 操作不成功，则退出循环
    ……
    EXEC SQL UPDATE Student
        SET Sage=:NEWAGE
        WHERE CURRENT OF SX;  -- 只对当前游标指向的一行记录
    ……
}
EXEC SQL CLOSE SX;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;动态SQL&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;使用SQL语句主变量&lt;/strong&gt;
&amp;lt;br&amp;gt;程序主变量包含的内容是SQL语句的内容**&lt;pre&gt;&lt;code&gt;EXEC SQL BEGIN DECLARE SECTION;
    const char *stmt = &quot;CREATE TABLE test(a int);&quot;;
    -- 定义了一个字符串指针变量stmt，内容是一条完整的 SQL 语句文本
    -- CREATE TABLE test(a int);（功能是创建一张名为test的表，包含一个int类型的列a）
    const char *stmt = &quot;CREATE TABLE student(sno char(9), sname char(20));&quot;;
    -- 或者这么写
EXEC SQL END DECLARE SECTION;
/* 执行动态SQL语句,可以动态创建TABLE   */
EXEC SQL EXECUTE IMMEDIATE :stmt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态参数&lt;/strong&gt;
&amp;lt;br&amp;gt;用？当占位符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行准备好的语句（EXECUTE）&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;EXEC SQL BEGIN DECLARE SECTION;
    const char *stmt=&quot;INSERT INTO test VALUES(?);&quot;;-- 动态参数
EXEC SQL END DECLARE SECTION;
/* 准备语句 */
EXEC SQL PREPARE mystmt FROM :stmt;
/*执行INSERT语句，设定参数为100*/
EXEC SQL EXECUTE mystmt USING 100;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;过程化SQL&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;what？写在数据库中的带编程逻辑的SQL语言，可用于定义触发器、存储过程、存储函数对应的SQL程序块。&lt;/li&gt;
&lt;li&gt;过程化SQL vs 嵌入式SQL
&amp;lt;br&amp;gt;可独立编程，不再需要区分 主变量 与 SQL变量
&amp;lt;br&amp;gt;不需要经历从预编译到编译的处理
&amp;lt;br&amp;gt;在数据库服务器内部实现数据交换与处理&lt;/li&gt;
&lt;li&gt;常用的两种过程化SQL：Oracle：PL/SQL；SQL Server：T-SQL&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;过程化SQL的块结构&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;过程化SQL的基本单位是&lt;strong&gt;块&lt;/strong&gt; Block&lt;/li&gt;
&lt;li&gt;块结构拆解
&lt;ul&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;定义部分(DECLARE)&lt;/strong&gt;&amp;lt;/u&amp;gt;
&amp;lt;br&amp;gt;声明局部变量、常量、游标、自定义异常&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;DECLARE
    v_sname CHAR(20); -- 变量
    v_age CONSTANT INT := 18; -- 常量
    CURSOR c_stu IS SELECT Sname FROM Student; -- 游标
    e_age_too_old EXCEPTION; -- 自定义异常
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;u&amp;gt;&lt;strong&gt;执行部分(BEGIN…END)&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;BEGIN
    -- 正常执行的逻辑
    SELECT Sname INTO v_sname FROM Student WHERE Sno = &apos;241880543&apos;;
    
    IF v_age &amp;gt; 30 THEN
        RAISE e_age_too_old; -- 抛出自定义异常
    END IF;

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE(&apos;未找到该学生！&apos;);
    WHEN e_age_too_old THEN
        DBMS_OUTPUT.PUT_LINE(&apos;年龄超过限制！&apos;);
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(&apos;发生未知错误：&apos; || SQLERRM);
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;PL/SQL变量和常量的定义&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;变量定义&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;基本数据结构
Number、Char、Date、Long、Boolean、Varchar2&lt;/li&gt;
&lt;li&gt;注意：&lt;pre&gt;&lt;code&gt;char h_sno[10] = &quot;211210166&quot;; // 对应 char(9)，需 n+1 长度
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;例&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;DECLARE
-- ① 无初值、允许为NULL（PPT里的基础形式）
    v_name VARCHAR2(20); -- 变长字符型，最大为4000个字符/Char 字符型，最大2000个字符

    -- ② 带NOT NULL + 用:=赋值（语法1，严格按PPT）
    v_age NUMBER(3) NOT NULL := 18; 

    -- ③ 带NOT NULL + 用DEFAULT赋值（等价于PPT的语法2，效果和:=完全一致）
    v_score NUMBER NOT NULL DEFAULT 60; 
BEGIN
-- 赋值语句
    v_name := &apos;张三&apos;;
END;    
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常量定义&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;流程控制&lt;/h3&gt;
&lt;hr /&gt;
&lt;h2&gt;存储过程和函数&lt;/h2&gt;
</content:encoded></item><item><title>前端三件套</title><link>https://lilyly9.github.io/posts/%E5%89%8D%E7%AB%AF%E4%B8%89%E4%BB%B6%E5%A5%97/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/%E5%89%8D%E7%AB%AF%E4%B8%89%E4%BB%B6%E5%A5%97/</guid><description>HTML-CSS-JavaScript相关知识</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#html&quot;&gt;HTML&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#html%E7%AE%80%E4%BB%8B&quot;&gt;HTML简介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BA%86%E8%A7%A3%E5%9F%BA%E6%9C%AC%E9%AA%A8%E6%9E%B6&quot;&gt;了解基本骨架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%A0%87%E7%AD%BE&quot;&gt;标签&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AD%97%E4%BD%93%E5%B1%9E%E6%80%A7&quot;&gt;字体属性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%96%87%E6%9C%AC%E5%B1%9E%E6%80%A7&quot;&gt;文本属性&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#letter-spacing-2px&quot;&gt;letter-spacing: 2px;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%A0%B7%E5%BC%8F%E8%A1%A8&quot;&gt;样式表&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#javascript&quot;&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;HTML&lt;/h2&gt;
&lt;h3&gt;HTML简介&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;全称：Hyper Text Markup Language（超文本标记语言）&lt;/li&gt;
&lt;li&gt;作用：专门用来搭建网页的结构（骨架），比如文字、图片、按钮、表单、布局等。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;了解基本骨架&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 文档声明：告诉浏览器这是HTML5文档 --&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;!-- 网页语言是中文（简体） --&amp;gt;
&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;
  &amp;lt;!-- 头部：给浏览器看的配置，不显示在页面上 --&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;!-- 设置网页字符编码为 UTF-8，保证中文不乱码 --&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;!-- 网页适配手机，宽度跟随设备宽度，初始缩放比例 1:1 --&amp;gt;
    &amp;lt;title&amp;gt;我的第一个网页&amp;lt;/title&amp;gt;
    &amp;lt;!-- 显示在浏览器标签栏上--&amp;gt;
  &amp;lt;/head&amp;gt;

  &amp;lt;!-- 身体：页面所有可见内容都写在这里 --&amp;gt;
  &amp;lt;body&amp;gt;
    网页的文字、图片、按钮都在这里！
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;标签&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;基础文本标签
&amp;lt;span id=&quot;基础文本标签&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;一级标签&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;一段文字&amp;lt;/p&amp;gt;
&amp;lt;div&amp;gt;容器&amp;lt;/div&amp;gt;
&amp;lt;strong&amp;gt;加粗&amp;lt;/strong&amp;gt;
&amp;lt;em&amp;gt;斜体&amp;lt;/em&amp;gt;
&amp;lt;del&amp;gt;删除线&amp;lt;/del&amp;gt;
&amp;lt;ins&amp;gt;下划线&amp;lt;/ins&amp;gt;
&amp;lt;br&amp;gt;    &amp;lt;!-- 换行 --&amp;gt;
&amp;lt;hr&amp;gt;    &amp;lt;!-- 水平分割线 --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;超链接标签
&amp;lt;span id=&quot;超链接标签&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 基本用法 --&amp;gt;
&amp;lt;a href=&quot;https://www.baidu.com&quot;&amp;gt;百度一下&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.baidu.com&quot; target=&quot;_blank&quot;&amp;gt;新页面打开&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;href=&quot;地址&quot;跳转的目标链接    target=&quot;_blank&quot;  在新标签页打开链接&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;图片标签
&amp;lt;span id=&quot;图片标签&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img
        src=&quot;https://www.baidu.com/logo.png&quot;
        alt=&quot;百度Logo&quot;
        width=&quot;300&quot; height=&quot;200&quot;&amp;gt;
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;src=&quot;图片地址&quot;    alt = alternative（替代文字）图片加载失败时，显示这段文字&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;列表标签&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;无序列表 ul + li&lt;pre&gt;&lt;code&gt; &amp;lt;ul&amp;gt;
   &amp;lt;li&amp;gt;列表项1&amp;lt;/li&amp;gt;
   &amp;lt;li&amp;gt;列表项2&amp;lt;/li&amp;gt;
   &amp;lt;li&amp;gt;列表项3&amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;有序列表 ol + li&lt;pre&gt;&lt;code&gt;&amp;lt;ol&amp;gt;
  &amp;lt;li&amp;gt;第一项&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;第二项&amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;自定义列表 dl + dt +dd&lt;pre&gt;&lt;code&gt;&amp;lt;dl&amp;gt;
  &amp;lt;dt&amp;gt;标题&amp;lt;/dt&amp;gt;
  &amp;lt;dd&amp;gt;描述内容&amp;lt;/dd&amp;gt;
&amp;lt;/dl&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;表格标签&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基础表格 行tr  格子th/td（Table Header/Table Data）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;table border=&quot;1&quot; width=&quot;400&quot;&amp;gt; &amp;lt;!-- border=1 加边框，宽度width --&amp;gt;
  &amp;lt;tr&amp;gt;    &amp;lt;!-- 第一行：表头 --&amp;gt;
    &amp;lt;th&amp;gt;姓名&amp;lt;/th&amp;gt;
    &amp;lt;th&amp;gt;年龄&amp;lt;/th&amp;gt;
    &amp;lt;th&amp;gt;城市&amp;lt;/th&amp;gt;
  &amp;lt;/tr&amp;gt;

  &amp;lt;tr&amp;gt;     &amp;lt;!-- 第二行 --&amp;gt;
    &amp;lt;td&amp;gt;张三&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;北京&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;

  &amp;lt;tr&amp;gt;    &amp;lt;!-- 第三行 --&amp;gt;
    &amp;lt;td&amp;gt;李四&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;上海&amp;lt;/td&amp;gt;
  &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;合并单元格 rowspan/colspan=&quot;x&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;table border=&quot;1&quot;&amp;gt;
   &amp;lt;tr&amp;gt;
     &amp;lt;th colspan=&quot;2&quot;&amp;gt;学生信息&amp;lt;/th&amp;gt; &amp;lt;!-- 合并2列 --&amp;gt;
   &amp;lt;/tr&amp;gt;
   &amp;lt;tr&amp;gt;
     &amp;lt;td rowspan=&quot;2&quot;&amp;gt;张三&amp;lt;/td&amp;gt; &amp;lt;!-- 合并2行 --&amp;gt;
     &amp;lt;td&amp;gt;20岁&amp;lt;/td&amp;gt;
   &amp;lt;/tr&amp;gt;
   &amp;lt;tr&amp;gt;
     &amp;lt;!-- 这里原本应该有&amp;lt;td&amp;gt;，但被合并了，所以删掉！ --&amp;gt;
     &amp;lt;td&amp;gt;男&amp;lt;/td&amp;gt;
   &amp;lt;/tr&amp;gt;
 &amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;表单标签&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- 文本框 --&amp;gt;
&amp;lt;input type=&quot;text&quot; placeholder=&quot;请输入用户名&quot;&amp;gt;
&amp;lt;!-- 密码框 --&amp;gt;
&amp;lt;input type=&quot;password&quot; placeholder=&quot;请输入密码&quot;&amp;gt;
&amp;lt;!-- 单选框 --&amp;gt;
&amp;lt;input type=&quot;radio&quot; name=&quot;gender&quot;&amp;gt; 男
&amp;lt;input type=&quot;radio&quot; name=&quot;gender&quot;&amp;gt; 女
&amp;lt;!-- 复选框 --&amp;gt;
&amp;lt;input type=&quot;checkbox&quot;&amp;gt; 看书
&amp;lt;!-- 提交按钮 --&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;登录&quot;&amp;gt;
&amp;lt;!-- 普通按钮 --&amp;gt;
&amp;lt;input type=&quot;button&quot; value=&quot;点击&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下拉菜单 &amp;lt;select&amp;gt; + &amp;lt;option&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;select&amp;gt;
  &amp;lt;option&amp;gt;北京&amp;lt;/option&amp;gt;
  &amp;lt;option selected&amp;gt;上海&amp;lt;/option&amp;gt;     &amp;lt;!-- 默认选中 --&amp;gt;
  &amp;lt;option&amp;gt;广州&amp;lt;/option&amp;gt;
  &amp;lt;option&amp;gt;深圳&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;转义字符&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;空格	&amp;amp;nbsp;
&amp;lt;	&amp;amp;lt;
&amp;gt;	&amp;amp;gt;
&amp;amp;	&amp;amp;amp;
人民币	&amp;amp;yen;
版权	&amp;amp;copy;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;CSS&lt;/h2&gt;
&lt;h3&gt;css 简介&lt;/h3&gt;
&lt;p&gt;CSS 是层叠样式表(Cascading Style Sheets)的简称。
&amp;lt;br&amp;gt;CSS 主要用于设置HTML页面中的文本内容、图片外形以及版面的布局和外观显示样式。&lt;/p&gt;
&lt;h3&gt;选择器&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;标签选择器&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;h3 {
    color: pink;
    font-size: 20px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;id选择器&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;#d {
   color: darkblue;   
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类选择器&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;基本写法&lt;pre&gt;&lt;code&gt;.c {
   color: pink;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;c&quot;&amp;gt; 粉色 &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;多类名选择器
&amp;lt;br&amp;gt;无空格：同时选中 &amp;lt;u&amp;gt;c1、c2&amp;lt;/u&amp;gt;，优先级更高，会覆盖单个类名选择器&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;c1 c2&quot;&amp;gt; 多类名选择器 &amp;lt;/div&amp;gt;  /* 有空格 */
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.c1.c2{   /* 无空格 */
  color: blue;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;后代选择器
&amp;lt;br&amp;gt;选中 c1 里的子元素 &amp;lt;u&amp;gt;c2&amp;lt;/u&amp;gt;&lt;pre&gt;&lt;code&gt;.c1 .c2{
  color: yellow;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;通配符选择器
&amp;lt;br&amp;gt;给所有的元素使用样式&lt;pre&gt;&lt;code&gt;* {
  margin: 0;
  padding: 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;字体属性&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;body{font: italic bold 20px/1.5 &quot;Microsoft YaHei&quot;;} 
/* 字体格式 字体粗细 字体大小/一行文字高度 “字体” */
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;font-style&lt;/th&gt;
&lt;th&gt;font-weight&lt;/th&gt;
&lt;th&gt;font-size&lt;/th&gt;
&lt;th&gt;line-height&lt;/th&gt;
&lt;th&gt;font-family&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;italic&lt;/strong&gt; 斜体/normal&lt;/td&gt;
&lt;td&gt;字体粗细 normal(400)/bold(700)&lt;/td&gt;
&lt;td&gt;字体大小 20px&lt;/td&gt;
&lt;td&gt;一行文字所占的高度&lt;/td&gt;
&lt;td&gt;字体&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;文本属性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;文字颜色&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;预定义的颜色值&lt;/th&gt;
&lt;th&gt;十六进制&lt;/th&gt;
&lt;th&gt;RGB代码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;blue/red…&lt;/td&gt;
&lt;td&gt;#ff0000&lt;/td&gt;
&lt;td&gt;rgb{255,0,0}/rgb{100%,0%,0%}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;水平对齐&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;p{
   text-align: left;
   text-align: center;
   text-align: right;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文本装饰 &lt;strong&gt;text-decoration&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;默认&lt;/th&gt;
&lt;th&gt;下划线&lt;/th&gt;
&lt;th&gt;上划线&lt;/th&gt;
&lt;th&gt;删除线&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;underline&lt;/td&gt;
&lt;td&gt;overline&lt;/td&gt;
&lt;td&gt;line-through&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文本缩进
&amp;lt;br&amp;gt;&lt;strong&gt;text-indent&lt;/strong&gt;： 2em;
&amp;lt;br&amp;gt;&lt;strong&gt;em&lt;/strong&gt; 是一个相对单位，就是当前元素（font-size) 1 个文字的大小, 如果当前元素没有设置大小，则会按照父元素的 1 个文字大小。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;行间距 &lt;strong&gt;line-height&lt;/strong&gt;
line-height: 1.5;
line-height: 30px;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字间距 &lt;strong&gt;letter-spacing&lt;/strong&gt;
letter-spacing: 2px;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;样式表&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;行内样式表
&amp;lt;br&amp;gt;写在标签里&lt;pre&gt;&lt;code&gt;&amp;lt;div style=&quot;color:red; font-size:20px;&quot;&amp;gt;我是红色文字&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;内部样式表
&amp;lt;br&amp;gt;写在 head 里&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
  &amp;lt;style&amp;gt;
    div {
      color: blue;
      font-size: 20px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;外部样式表
新建 style.css，在HTML中引入，放在head&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&amp;gt;
/* rell=引入的是stylesheet样式表;href=引入的css文件路径*/
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;JavaScript&lt;/h2&gt;
</content:encoded></item><item><title>移动网络新技术</title><link>https://lilyly9.github.io/posts/%E7%A7%BB%E5%8A%A8%E7%BD%91%E7%BB%9C%E6%96%B0%E6%8A%80%E6%9C%AF/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/%E7%A7%BB%E5%8A%A8%E7%BD%91%E7%BB%9C%E6%96%B0%E6%8A%80%E6%9C%AF/</guid><description>选修课程</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;div style=&quot;display: flex; width: 80%; margin-left: 0;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/img_9.png&quot; alt=&quot;分数构成&quot; style=&quot;width: 80%; max-width: 800px; height: auto;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点对点通信Point to Point comm&lt;/li&gt;
&lt;li&gt;协议 Protocol
&lt;ol&gt;
&lt;li&gt;Protocols in ISO
&lt;ol&gt;
&lt;li&gt;第四层（TCP、UDP）
&lt;ol&gt;
&lt;li&gt;TCP（Transmission Control Protocol）先在 源地址-目的地址 之间建立联系；丢包则重传。流量控制；拥堵时放慢速度。（准确性）&lt;/li&gt;
&lt;li&gt;UDP（User Datagram Protocol）没有上述功能，eg：语音/视频。（时效性）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;地址 address
&lt;ol&gt;
&lt;li&gt;IP查找硬件设备（用 以太网 的服务，给上层的 TCP 提供服务）&lt;/li&gt;
&lt;li&gt;端口号 查找软件&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;复用技术
&lt;ol&gt;
&lt;li&gt;四维复用技术:时间、空间、频率、码字&lt;/li&gt;
&lt;li&gt;信道共享方法
&lt;ul&gt;
&lt;li&gt;频分复用&lt;/li&gt;
&lt;li&gt;时分复用&lt;/li&gt;
&lt;li&gt;时频空复用&lt;/li&gt;
&lt;li&gt;码分复用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;蜂窝网络
&lt;ul&gt;
&lt;li&gt;fluster &amp;amp; 频率复用距离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;VOIP&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Jitter抖动的影响：buffer 大，会带来大的时延，但是能承受大的抖动，需要买昂贵的网络资源。端系统-网络共同占有&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Loss丢包的影响：人耳20ms内反应不过来，若丢包过大，不能用replay解决。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单包丢失时：PLC 可以通过插值 / 重放前一帧音频来掩盖，人耳几乎听不出损伤。&lt;/li&gt;
&lt;li&gt;连续 2 包及以上丢失时：PLC 无法有效掩盖，才会产生可感知的 “可听失真（audible impairment）”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BER（bit error rate） /  PER\PLR（Packet error rate）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视频/音频编码/流媒体传输领域的核心标准化组织：MPEG/ITU-T&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MPEG 视频编码与帧类型&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MPEG 编码器的核心思想是利用视频帧间的时间冗余进行高效压缩&lt;/li&gt;
&lt;li&gt;三种 MPEG 帧类型
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;帧类型&lt;/th&gt;
&lt;th&gt;参考依赖&lt;/th&gt;
&lt;th&gt;压缩率&lt;/th&gt;
&lt;th&gt;数据量占比（相对 I-Frame）&lt;/th&gt;
&lt;th&gt;核心作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;I-Frame&lt;/td&gt;
&lt;td&gt;无（独立）&lt;/td&gt;
&lt;td&gt;最低&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;解码基准、随机访问、错误恢复&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P-Frame&lt;/td&gt;
&lt;td&gt;前向（I/P）&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;td&gt;10%~30%&lt;/td&gt;
&lt;td&gt;时间冗余压缩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B-Frame&lt;/td&gt;
&lt;td&gt;双向（I/P/B）&lt;/td&gt;
&lt;td&gt;最高&lt;/td&gt;
&lt;td&gt;5%~15%&lt;/td&gt;
&lt;td&gt;极致时间冗余压缩&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;I-Frame（Intra Frame，帧内编码帧）
定义：包含完整的视频帧数据，编码时不依赖任何其他帧，完全独立编码。
作用：
作为解码的基准参考点，是流中随机访问（跳播）和错误恢复的关键。
新接入的解码器必须从 I-Frame 开始才能正确解码后续内容。
特点：数据量最大，压缩率最低。&lt;/li&gt;
&lt;li&gt;P-Frame（Predictive Frame，预测编码帧）
定义：基于之前的 I-Frame 或 P-Frame，通过运动补偿预测当前帧内容，仅传输预测误差和运动向量。
作用：
相比 I-Frame 实现更高压缩率，通常仅为对应 I-Frame 大小的 10%~30%。
依赖关系：必须依赖前面的参考帧，无法独立解码。&lt;/li&gt;
&lt;li&gt;B-Frame（Bidirectional Frame，双向预测编码帧）
定义：同时参考前后的 I-Frame 或 P-Frame，通过双向运动补偿进行预测，仅传输差异数据。
作用：
压缩率最高，通常仅为对应 I-Frame 大小的 5%~15%。
依赖关系：依赖前后帧，解码顺序与播放顺序不一致，需要更多缓存。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;压缩本质：MPEG 压缩的核心是消除帧间时间冗余，通过预测编码只传输变化部分。
I-Frame 是基础：没有 I-Frame 就无法解码后续的 P/B 帧，同时 I-Frame 保证了视频流的可跳转性和抗误码能力。
P/B 帧提升效率：P/B 帧通过运动补偿大幅降低数据量，是实现高压缩比的关键，但也带来了帧间依赖和解码复杂度。
典型应用：在流媒体场景中，I-Frame 间隔通常为几秒（如 2~10 秒），中间插入大量 P/B 帧，平衡压缩效率和播放体验。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GOP（Group of Pictures）
视频帧会被组织成GOP（图像组），是一个以 I-Frame 开头、包含若干 P/B 帧的连续序列。
例：示例：15 帧、P 间隔为 3 的 15/3 GOP 结构：
B₁ B₂ I₃ B₄ B₅ P₆ B₇ B₈ P₉ B₁₀ B₁₁ P₁₂ B₁₃ B₁₄ P₁₅
&amp;lt;br&amp;gt;与 VoIP 的关键差异
VoIP：编解码器实现定义非常严格，格式固定。
流媒体视频：即使是同一种 MPEG 编码，也存在大量编码方式与 GOP 结构变体。
GOP 结构的重要性：具体的 GOP 结构会显著影响网络丢包、延迟、吞吐量对接收端视频播放效果的冲击，是流媒体 QoS 优化的关键变量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TCP
表格
对比维度	TCP (Transmission Control Protocol)	UDP (User Datagram Protocol)
连接特性	面向连接，通信前需通过三次握手建立连接，结束后通过四次挥手释放连接	无连接，发送前无需建立连接，直接封装数据报发送
可靠性	可靠传输：保证数据不丢失、不重复、按序到达，丢包会自动重传	不可靠传输：不保证数据到达，不处理丢包、乱序或重复
头部开销	头部最小 20 字节，最多 60 字节（含选项字段）	头部固定 8 字节，开销极小
流量 / 拥塞控制	内置流量控制（滑动窗口）和拥塞控制算法，避免网络过载	无任何流量 / 拥塞控制，发送速率由应用层决定
延迟表现	延迟较高（连接建立、重传、排序等机制带来额外开销）	延迟极低，无连接和重传机制，适合实时场景
数据单位	数据单位为段（Segment），受 MSS 限制	数据单位为数据报（Datagram），受 MTU 限制
典型应用场景	文件传输、网页浏览（HTTP/HTTPS）、电子邮件、远程登录	实时音视频通话、直播、在线游戏、DNS 查询、流媒体&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;QoS机制&lt;/h3&gt;
&lt;h3&gt;buffer 缓冲区&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;缓冲大小
&lt;ol&gt;
&lt;li&gt;RFC 2429：C = 10 Gbps link: 2.5 Gbit buffer&lt;/li&gt;
&lt;li&gt;N条流时。$buffer = RTT\times \frac{C}{}$&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>笔者的读书笔记</title><link>https://lilyly9.github.io/posts/%E7%AC%94%E8%80%85%E7%9A%84%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/%E7%AC%94%E8%80%85%E7%9A%84%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</guid><description>忙里偷闲，一些记录…</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;2025年&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;July ~ August 《窄门》&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;September 《月亮与六便士》&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2026年&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Jan. ~ March 《呼兰河传》&lt;/li&gt;
&lt;li&gt;March ~ April 《人鼠之间》&lt;/li&gt;
&lt;li&gt;《霍乱时期的爱情》&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>python</title><link>https://lilyly9.github.io/posts/2python/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/2python/</guid><description>python基础语法</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#python%E5%9F%BA%E7%A1%80&quot;&gt;python基础&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%B3%A8%E9%87%8A&quot;&gt;注释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BF%9E%E6%8E%A5&quot;&gt;字符串与字符串连接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B&quot;&gt;数据类型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E8%BE%93%E5%85%A5-input&quot;&gt;输入 input&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD%E8%AF%AD%E5%8F%A5&quot;&gt;条件判断语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%BE%AA%E7%8E%AF%E8%AF%AD%E5%8F%A5&quot;&gt;循环语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%80%BB%E8%BE%91%E8%BF%90%E7%AE%97&quot;&gt;逻辑运算&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%88%97%E8%A1%A8-list&quot;&gt;列表 List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%85%83%E7%BB%84-tuple&quot;&gt;元组 Tuple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%9B%86%E5%90%88-set&quot;&gt;集合 Set&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AD%97%E5%85%B8-&quot;&gt;字典 {}&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9D%97&quot;&gt;模块&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%B1%BB--%E6%96%B9%E6%B3%95&quot;&gt;类 &amp;amp; 方法&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%BB%A7%E6%89%BF&quot;&gt;继承&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%B1%9E%E6%80%A7%E5%B0%81%E8%A3%85property&quot;&gt;属性封装&amp;amp;property&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;python基础&lt;/h1&gt;
&lt;h3&gt;注释&lt;/h3&gt;
&lt;p&gt;#/三引号&quot;&quot;&quot;……&quot;&quot;&quot; 多行注释&lt;/p&gt;
&lt;h3&gt;字符串与字符串连接&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;字符串连接 +&lt;pre&gt;&lt;code&gt;print(&quot;Hello&quot;+&quot;World&quot;+&quot;!&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;双单引号转义&lt;pre&gt;&lt;code&gt; print(&apos;He said &quot;good!&quot;&apos;) # 单引号包裹 He said &quot;good&quot;
 print(&quot;He said &apos;good!&apos;&quot;) # 双引号包裹 He said &apos;good&apos;
 print(&quot;He said \&quot;Let&apos;s go!\&quot;&quot;) # 转义符 He said &quot;Let&apos;s go!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;三引号跨行字符串
自换行&lt;pre&gt;&lt;code&gt;print(&quot;&quot;&quot;Hello
World&quot;&quot;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;常用方法&lt;pre&gt;&lt;code&gt; s = &quot;hello&quot;
 s.upper()    # 转大写 HELLO
 s.lower()    # 转小写
 s.strip()    # 去掉首尾空格
 s.replace(&quot;h&quot;, &quot;H&quot;)  # 替换
 s.split(&quot;,&quot;) # 按符号分割成列表
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;格式化字符串&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;format()&lt;pre&gt;&lt;code&gt;print(&quot;My name is {0},I&apos;m {1} years old&quot;.format(&quot;Liz&quot;, 19))
 print(&quot;My name is {name},I&apos;m {age} years old&quot;.format(name=&quot;Liz&quot;, age=19))
 name = &quot;Yuzy&quot;
 age = 20
 print(f&quot;My name is {name},I&apos;m {age} years old&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;f-字符串&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;数据类型&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;字符串 str&lt;pre&gt;&lt;code&gt;len(&quot;Hello&quot;) # 5
len(&quot;哟! &quot;) # 2
len(&quot;\n&quot;) # 1
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;整型 int、浮点数 float&lt;pre&gt;&lt;code&gt;grade =93.546
 print(&quot;Your grade is: &quot; + f&quot;{grade:.2f}&quot;) # Your grade is: 93.55
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;布尔类型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;type&lt;/strong&gt; 输出数据类型&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;输入 input&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;user_name = str(input(&quot;请输入用户名：&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;条件判断语句&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;grade = int(input(&quot;please input your grade: &quot;))
if grade &amp;gt;= 90:
    print(&quot;A&quot;)
elif grade &amp;gt;= 80:
    print(&quot;B&quot;)
elif grade &amp;gt;= 65:
    print(&quot;C&quot;)
else:
    print(&quot;D&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;循环语句&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;constants = (&quot;Alice&quot;, &quot;Bob&quot;, &quot;Charlie&quot;, &quot;David&quot;, &quot;Eve&quot;)
for contant in constants:
    print(contant)

for i in range(5,10):  # [5,10)
    print(i)
for i in range(5,10,2):  # 5 7 9 步长为2
    print(i)
    
i = 0
while i &amp;lt;len(constants):
    print(constants[i])
    i += 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;逻辑运算&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;x = int(input(&quot;Enter a number: &quot;))
print(not(x&amp;gt;5 and x&amp;lt;10)) # 6 -False;2 - True
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;列表 List&lt;/h3&gt;
&lt;p&gt;有序、可重复、可扩展&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;shopping_list = [&quot;milk&quot;, &quot;eggs&quot;, &quot;bread&quot;]
shopping_list.append(&quot;bread&quot;) # [&apos;milk&apos;, &apos;eggs&apos;, &apos;bread&apos;, &apos;bread&apos;]
shopping_list.remove(&quot;eggs&quot;) # [&apos;milk&apos;, &apos;bread&apos;, &apos;bread&apos;]
len(shopping_list) # 3
print(shopping_list[1]) # eggs
print(shopping_list[0:2]) # [&apos;milk&apos;, &apos;eggs&apos;]
print(shopping_list[0:2]) # [&apos;milk&apos;, &apos;eggs&apos;]
shopping_list.insert(1, 15)  # 指定位置插入
shopping_list.pop()          # 删除最后一个
shopping_list.pop(0)         # 删除指定索引
shopping_list.clear()        # 清空
shopping_list.sort()         # 对于int排序
shopping_list.reverse()      # 反转
print(shopping_list)         # []
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;元组 Tuple&lt;/h3&gt;
&lt;p&gt;有序、可重复、不可扩展，当作键使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;example_tuple = (&quot;keyboard&quot;, &quot;mouse&quot;, &quot;monitor&quot;)
example_tuple.append(&quot;printer&quot;)  # ❌
example_tuple.remove(&quot;mouse&quot;)  # ❌
# 作为键
contacts = {
    (&quot;Lily&quot;,19):&quot;421880110&quot;,
    (&quot;Bob&quot;,25):&quot;421880111&quot;,
    (&quot;Tom&quot;,30):&quot;421880112&quot;
}
print(contacts[(&quot;Lily&quot;,19)])  # 输出：421880110
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;集合 Set&lt;/h3&gt;
&lt;p&gt;无序、不可重复、可扩展&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;names = {&quot;Lily&quot;,&quot;Rose&quot;,&quot;Daisy&quot;,&quot;Iris&quot;}
print(&quot;Lily&quot; in names) # True
print(type(names)) # &amp;lt;class &apos;set&apos;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;字典 {}&lt;/h3&gt;
&lt;p&gt;键 : 值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;contacts ={
    &quot;Alice&quot;: &quot;152-555-1234&quot;,
    &quot;Bob&quot;: &quot;152-555-5678&quot;,
}
print(contacts.get(&quot;Alice&quot;)) # 152-555-1234
print(contacts.get(&quot;Charlie&quot;)) # None
print(contacts[&quot;Alice&quot;]) # Output: 152-555-1234
print(&quot;Bob&quot; in contacts) # Output: True
# 删除键值对 del 字典名[键]
del contacts[&quot;Alice&quot;]
print(len(contacts)) # Output: 1
# 遍历字典
for name in contacts:
    print(name, contacts[name])
# 所有键
print(contacts.keys()) # Output: dict_keys([&apos;Bob&apos;])
# 所有值    
print(contacts.values()) # Output: dict_values([&apos;152-555-5678&apos;])
# 所有键值对
print(contacts.items()) # Output: dict_items([(&apos;Bob&apos;, &apos;152-555-5678&apos;)])
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;模块&lt;/h1&gt;
&lt;p&gt;继承很多功能的函数集合 称作模块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 自定义模块，导入module.py中的函数
import math
print(math.sqrt(16))
# 直接调用，不加模块名
from math import *
print(sqrt(16))
print(math.sqrt(16)) # math 本身没有被导入！NameError: name &apos;math&apos; is not defined

# 导入内置模块
import random
num = random.randint(1, 100)
print(num)
random_list = [11,22,33,44]
data = random.choice(random_list)
print(data)

# from 模块名 import sqrt
from math import sqrt
print(sqrt(16))

# import 模块名 as 别名
import math as m
print(m.sqrt(16))
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;类 &amp;amp; 方法&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;基本语法&lt;pre&gt;&lt;code&gt;class Dog:
 pass

 my_dog = Dog()          # 创建实例（对象）
 print(type(my_dog))     # &amp;lt;class &apos;__main__.Dog&apos;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;初始化方法__init__和实例属性
&amp;lt;br&amp;gt;双下划线：私有属性&lt;pre&gt;&lt;code&gt;class Dog:
    def __init__(self, name, age):
        self.name = name   # 实例属性
        self.age = age

my_dog = Dog(&quot;旺财&quot;, 3)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;魔术方法&lt;pre&gt;&lt;code&gt;class Cat:
    def __init__(self, name):
        self.name = name

    # 魔术方法：控制对象打印结果
    def __str__(self):
        return f&quot;猫咪：{self.name}&quot;

tom = Cat(&quot;汤姆&quot;)
print(tom)  # 自动执行 __str__，输出：猫咪：汤姆

class Book:
    def __len__(self):
        return 200  # 自定义页数

b = Book()
print(len(b))  # 自动调用 __len__，输出 200
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;实例方法&lt;pre&gt;&lt;code&gt; class Dog:
     def __init__(self, name, age):
         self.name = name
         self.age = age

     def get_human_age(self):
         return self.age * 7

 my_dog = Dog(&quot;旺财&quot;, 3)
 human_age = my_dog.get_human_age()  # 21
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;类属性 vs 实例属性&lt;pre&gt;&lt;code&gt;class Dog:
    species = &quot;Canis familiaris&quot;   # 类属性

    def __init__(self, name):
        self.name = name            # 实例属性

dog1 = Dog(&quot;旺财&quot;)
dog2 = Dog(&quot;来福&quot;)
print(dog1.species)  # Canis familiaris
print(dog2.species)  # Canis familiaris
print(Dog.species)  # 直接通过类名查询：Canis familiaris
Dog.species = &quot;狗&quot;    # 修改类属性会影响所有实例
print(dog1.species)  # 狗
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;类方法
&amp;lt;br&amp;gt;第一个参数是cls（类本身）&lt;pre&gt;&lt;code&gt;class Dog:
    total_dogs = 0

    def __init__(self, name):
        self.name = name
        Dog.total_dogs += 1

    @classmethod
    def get_total(cls):
        return cls.total_dogs

print(Dog.get_total())  # 0
d1 = Dog(&quot;旺财&quot;)
d2 = Dog(&quot;来福&quot;)
print(Dog.get_total())  # 2
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;静态方法
和普通函数的区别是：不能访问实例属性或类属性&lt;pre&gt;&lt;code&gt;class MathUtils:
    @staticmethod
    def add(x, y):
        return x + y

print(MathUtils.add(3, 5))  # 8
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;继承&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;基础格式&lt;pre&gt;&lt;code&gt;class Animal:
    ……
class Dog(Animal):
    ……
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;super()&lt;/code&gt;调用父类方法&lt;pre&gt;&lt;code&gt;class Cat(Animal):
 def speak(self):
     super().speak()      # 先调用父类方法
     print(&quot;喵喵喵&quot;)      # 再添加子类行为
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;属性封装&amp;amp;property&lt;/h2&gt;
&lt;p&gt;Python 没有严格的私有属性，但约定以 _ 开头的属性为“保护”的，不应当直接访问。可以使用&lt;code&gt;@property&lt;/code&gt;提供 getter/setter。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Person:
    def __init__(self, name):
        # 私有属性，外部不直接访问
        self._name = name

    # 取值方法：对象.name 自动调用
    @property
    def name(self):
        return self._name

    # 赋值方法：对象.name = 值 自动调用
    @name.setter
    def name(self, val):
        # 简单校验
        if len(val) &amp;lt; 2:
            raise ValueError(&quot;名字太短&quot;)
        self._name = val

# 使用
p = Person(&quot;小明&quot;)
print(p.name)     # 调用@property，取值

p.name = &quot;小红&quot;    # 调用setter，赋值
print(p.name)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>杂记</title><link>https://lilyly9.github.io/posts/bd%E6%9D%82%E8%AE%B0/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/bd%E6%9D%82%E8%AE%B0/</guid><description>扫盲中。。。</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Node.js&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;是什么？
&amp;lt;br&amp;gt;是一个能让JavaScript跑在电脑本地（服务器/Windows电脑上）的运行环境。
&amp;lt;br&amp;gt;浏览器里的JS只能在网页运行，Node.js 让 JS 变成了能直接操作电脑文件、装软件、跑脚本的 &lt;strong&gt;后台程序&lt;/strong&gt;
&amp;lt;br&amp;gt;&lt;strong&gt;npm&lt;/strong&gt; 是 Node.js 自带的软件商店/包管理器，要装的 claude-code 就是发布在 npm 上的一个命令行工具，必须靠 Node.js + npm 来安装。&lt;/li&gt;
&lt;li&gt;安装路径的影响为什么这么大？&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;关于prompt&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Java</title><link>https://lilyly9.github.io/posts/1java/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/1java/</guid><description>Java学习笔记</description><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;⭐&amp;lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/&quot; target=&quot;_blank&quot;&amp;gt;Oracle推出的Java SE文档-核心API&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
重写快捷键：按下 Fn+Alt+Insert / 右键 -&amp;gt; generate -&amp;gt; toString -&amp;gt; OK&amp;lt;br&amp;gt;
看方法的源码：选中方法，按 Ctrl+B&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#java-language-features&quot;&gt;Java语言的特点&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B&quot;&gt;数据类型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#MyGeneric&quot;&gt;泛型&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#class&quot;&gt;泛型类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#interface&quot;&gt;泛型接口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#function&quot;&gt;泛型方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;关键字
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#static&quot;&gt;static&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#super&quot;&gt;super&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#final&quot;&gt;final&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;常用类
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%8C%85%E8%A3%85%E7%B1%BB&quot;&gt;包装类&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%B1%BB%E5%9E%8B&quot;&gt;装箱/拆箱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E7%B1%BB%E5%9E%8B&quot;&gt;类型转换&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#zshc&quot;&gt;整数缓冲区&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Object&quot;&gt;Object类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#objects&quot;&gt;Objects类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Math%E7%B1%BB&quot;&gt;Math类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Arrays&quot;&gt;Arrays类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#String%E7%B1%BB&quot;&gt;String类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#stringbuffer&quot;&gt;StringBuffer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#stringbuffer&quot;&gt;StringBuilder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#BigDecimal&quot;&gt;BigDecimal类&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;集合结构体系
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E9%9B%86%E5%90%88%E5%9F%BA%E7%A1%80&quot;&gt;集合基础 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cls&quot;&gt;Collections 工具类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Collection&quot;&gt;Collection 接口&lt;/a&gt;     &lt;a href=&quot;#iterator&quot;&gt;迭代器&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#List&quot;&gt;List 子接口&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;ArrayList&lt;/li&gt;
&lt;li&gt;Vector&lt;/li&gt;
&lt;li&gt;LinkList&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Set&quot;&gt;Set 子接口&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;HashSet&lt;/li&gt;
&lt;li&gt;TreeSet  &lt;a href=&quot;#Comparator&quot;&gt;Comparator接口&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Map&quot;&gt;Map集合&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;HashMap&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;其他类
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#System&quot;&gt;System类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Calendar&quot;&gt;Calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;SimpleDateFormat/DateTimeFormatter&lt;/a&gt; 略&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%86%85%E9%83%A8%E7%B1%BB&quot;&gt;内部类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#jvm&quot;&gt;JVM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Java语言的特点&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;java-language-features&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;面向对象OOP&lt;/strong&gt;&lt;/em&gt;， 省略 C中一些难点(eg: 指针)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;平台无关性&lt;/em&gt;&lt;/strong&gt;：&lt;strong&gt;Java虚拟机&lt;/strong&gt; 实现，Java软件不受计算机硬件和操作系统的约束&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;健壮性&lt;/strong&gt;&lt;/em&gt;：Java的 &lt;strong&gt;安全检查机制&lt;/strong&gt;，将许多程序中的错误扼杀在摇篮之中&lt;/p&gt;
&lt;p&gt;具备许多保证程序稳定、健壮的特性（强类型机制、异常处理、垃圾的自动收集等），有效地减少了错误&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;安全性&lt;/strong&gt;&lt;/em&gt;：Java通常被用在网络环境中，为此，Java提供了一个 &lt;strong&gt;安全机制&lt;/strong&gt; 以防恶意代码的攻击&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;支持多线程&lt;/strong&gt;&lt;/em&gt;：多线程机制使应用程序在同一时间并行执行多项任务，该机制使得程序能够具有更好的交互性、实时性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;编译与解释共存&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;数据类型&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;数据类型&quot;&amp;gt;&amp;lt;/span&amp;gt;
&lt;img src=&quot;img.png&quot; alt=&quot;图片描述&quot; /&gt;&lt;/p&gt;
&lt;p&gt;基本数据类型：数值直接存储在栈空间；引用数据类型：引用类型在栈里，对象在堆里(堆中创建对象，存储属性，栈中存储对象的相应地址)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;泛型&lt;/h2&gt;
&lt;h3&gt;泛型类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;class&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public static class MyGeneric&amp;lt;T&amp;gt; {
    T t;

    public MyGeneric(T t) {
        this.t = t;
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}

public static void main(String[] args) {
    // 使用String类型的泛型对象
    MyGeneric&amp;lt;String&amp;gt; stringBox = new MyGeneric&amp;lt;&amp;gt;(&quot;Hello 泛型&quot;);
    String str = stringBox.getT();
    System.out.println(str); // 输出：Hello 泛型

    // 使用Integer类型的泛型对象
    MyGeneric&amp;lt;Integer&amp;gt; intBox = new MyGeneric&amp;lt;&amp;gt;(100);
    Integer num = intBox.getT();
    System.out.println(num); // 输出：100

    // intBox.setT(&quot;错误类型&quot;); // 编译失败：不兼容的类型
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;泛型接口&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;interface&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class code1 {
    public interface MyInterface&amp;lt;T&amp;gt; {
        String name = &quot;ZhangSan&quot;;

        T server(T t); //自定义抽象方法
    }

    /* 创建类的时候直接确定类型T */
    public static class MyInterfaceImpl1 implements MyInterface&amp;lt;String&amp;gt; {
        @Override
        public String server(String s) {
            return s;
        }
    }

    /* 之后确定 */
    public static class MyInterfaceIml2&amp;lt;T&amp;gt; implements MyInterface&amp;lt;T&amp;gt; {

        @Override
        public T server(T t) {
            return t;
        }
    }

    public static void main(String[] args) {
        MyInterfaceImpl1 impl = new MyInterfaceImpl1();
        System.out.println(impl.server(&quot;Hello&quot;));

        MyInterfaceIml2&amp;lt;Integer&amp;gt; impl2 = new MyInterfaceIml2&amp;lt;&amp;gt;();
        System.out.println(impl2.server(1000));
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;泛型方法&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;function &quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class MyGenericMethod {
    public &amp;lt;T&amp;gt; T show(T t){
        System.out.println(t);
        return t;
    }//整个方法中可以使用泛型T，作为返回值/参数类型

    public static void main(String[] args) {
        MyGenericMethod myGenericMethod = new MyGenericMethod();
        myGenericMethod.show(&quot;String&quot;);
        myGenericMethod.show(100);
        //相当于自动重载方法
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;关键字&lt;/h2&gt;
&lt;h3&gt;static&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;static&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态变量&lt;/strong&gt;：&amp;lt;u&amp;gt;静态变量&amp;lt;/u&amp;gt; 在内存中只有一个副本，当且仅当在类初次加载时会被初始化；而 &amp;lt;u&amp;gt;非静态变量&amp;lt;/u&amp;gt;
是对象所拥有的，在创建对象的时候被初始化，存在多个副本，各个对象拥有的副本互不影响。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态方法&lt;/strong&gt;：静态方法可以不依赖于任何对象进行访问（对于静态方法来说，是没有this的），在静态方法中 &amp;lt;u&amp;gt;&lt;strong&gt;不能&lt;/strong&gt;
访问类的非静态成员变量/非静态成员方法&amp;lt;/u&amp;gt;(因为非静态成员方法变量都是必须依赖具体的对象才能够被调用)；只 &lt;strong&gt;能&lt;/strong&gt; 调用&amp;lt;u&amp;gt;
静态对象/静态方法&amp;lt;/u&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;super&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;super&quot;&amp;gt;&amp;lt;/span&amp;gt;
super 代表的是 &lt;strong&gt;父类对象&lt;/strong&gt;。&amp;lt;br&amp;gt;
每一个子类的构造方法在没有显示调用 super() &amp;lt;u&amp;gt;系统&amp;lt;/u&amp;gt; 都会 &amp;lt;u&amp;gt;提供默认的 super()&amp;lt;/u&amp;gt;，super() 必须是构造器的 &amp;lt;u&amp;gt;
第一条语句&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;h3&gt;final&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;final&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;包装类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;包装类&quot;&amp;gt;&amp;lt;/span&amp;gt;
基本数据类型所对应的引用类型,在java.lang包中&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;基本数据类型&lt;/th&gt;
&lt;th&gt;包装类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;byte&lt;/td&gt;
&lt;td&gt;Byte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;short&lt;/td&gt;
&lt;td&gt;Short&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long&lt;/td&gt;
&lt;td&gt;Long&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;Float&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double&lt;/td&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;char&lt;/td&gt;
&lt;td&gt;Character&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;类型转换与装箱/拆箱&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;类型&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int num1 = 19;
// 装箱：基本数据类型/String → 引用数据类型
Integer integer1 = new Integer(num1);//每次调用都创建一个对象
Integer integer2 = Integer.valueOf(num1); //推荐使用，复用[-128~127]常量池对象
// 拆箱：引用数据类型 → 基本数据类型
Integer integer3 = new Integer(100);
int num2 = integer3.intValue();
/*-------------JDK1.5之后，提供自动装箱/拆箱-------------*/
int age = 30;
Integer integer4 = age;// 自动装箱
int age2 = integer4;// 自动拆箱
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;基本类型 ↔ 字符串&lt;/h3&gt;
&lt;p&gt;都是 &lt;strong&gt;包装类&lt;/strong&gt; 内的方法，&lt;strong&gt;目标类&lt;/strong&gt; 内的方法&amp;lt;br&amp;gt;
int → string   &lt;code&gt;String s = String.valueOf(number);&lt;/code&gt;&amp;lt;br&amp;gt;
string → int   &lt;code&gt;int i = Integer.parseInt(s);&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/*基本类型转换成字符串*/
int n1 = 100;
String s1 = n1+&quot;&quot;;
String s2 = Integer.toString(n1);//toString(n1,16)按照16进制转换/toOctalString(n1)
/*字符串转换成基本类型*/
String str = &quot;150&quot;;
int n2 = Integer.parseInt(str);
/*boolean类型 只有&quot;true&quot;才转化成true，其余都是false*/
String str2 = &quot;true&quot;;
boolean b1 = Boolean.parseBoolean(str2);// true
boolean b1 = Boolean.parseBoolean(&quot;treu&quot;);// false

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;整数缓冲区&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;zshc&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Integer int1 = new Integer(100);
Integer int2 = new Integer(100);
sout(int1 == int2);// false
/*------自动装箱------*/
Integer integer1 = 100;
Integer integer2 = 100;
sout(integer1 == integer2);// true

Integer integer3 = 200;
Integer integer4 = 200;
sout(integer3 == integer4);// false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;堆中有-128 ~ 127 之间的对象，在此范围内的数据把地址赋值给栈中，&amp;lt;br&amp;gt;
不在这个范围内的 new Integer(num);创建新对象&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Object类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;Object&quot;&amp;gt;&amp;lt;/span&amp;gt;
基类/超类，是所有类的父类。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;getClass()&lt;/code&gt; 返回对象类型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hashCode()&lt;/code&gt; 返回对象的哈希码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toString()&lt;/code&gt; 返回该对象的字符串表示，常在类内重写该方法&lt;/li&gt;
&lt;li&gt;&lt;code&gt;obj1.equals(obj2)&lt;/code&gt; 比较两个对象的地址是否相等,直接比较两个对象的地址是否完全相同，可以用&quot;==&quot;替代equals;常在类中重写&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;Objects类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id =&quot;objects&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Objects.equals(s1,s2);
Objects.isNull(s1);
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Math类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;Math类&quot;&amp;gt;&amp;lt;/span&amp;gt;
所有方法都是静态的（static修饰），通过类名直接调用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class MathDemo {
    public static void main(String[] args) {
        //1、public static int abs(int a)	a的绝对值
        System.out.println(Math.abs(88)); //88
        System.out.println(Math.abs(-88)); //88

        //2、public static double ceil(double a)	向上取整
        System.out.println(Math.ceil(12.34)); //13.0
        System.out.println(Math.ceil(12.56)); //13.0

        //3、public static double floor(double a)	向下取整
        System.out.println(Math.floor(12.34)); //12.0
        System.out.println(Math.floor(12.56)); //12.0

        //4、public static long round(double a)	四舍五入取整
        System.out.println(Math.round(12.34)); //12
        System.out.println(Math.round(12.56)); //13

        //5、public static int max(int a,int b)	返回两个数中较大值
        System.out.println(Math.max(66,88)); //88

        //6、public static int min(int a,int b)	返回两个数中较小值
        System.out.println(Math.min(66,88)); //66

        //7、public static double pow(double a,double b)	获取a的b次幂
        System.out.println(Math.pow(2.0,3.0)); //8.0

        //8、public static double random()	返回值为double类型随机数 [0.0~1.0）
        System.out.println(Math.random()); //0.36896250602163483
        System.out.println(Math.random()); //0.3507783145075083
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Arrays类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;Arrays&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    int[] arr = {21,56,15,89,62};
//toString 数组转化为字符串
    System.out.println(&quot;排序前：&quot;+ Arrays.toString(arr)); //排序前：[21, 56, 15, 89, 62]
//按照指定顺序排序
    Arrays.sort(arr);
    System.out.println(&quot;排序后：&quot;+Arrays.toString(arr)); //排序后：[15, 21, 56, 62, 89]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;String类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;String类&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;字符串是常量，创建之后不可改变；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字符串字面量存储在字符串池中，可以共享。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;String s = &quot;Hello&quot;&lt;/code&gt; 产生一个对象，&lt;strong&gt;字符串池&lt;/strong&gt;中存储&lt;/li&gt;
&lt;li&gt;&lt;code&gt;String s = new String(&quot;Hello&quot;)&lt;/code&gt; 产生两个对象，&lt;s&gt;&lt;strong&gt;堆&lt;/strong&gt;/&lt;strong&gt;池&lt;/strong&gt;中各存储一个&lt;/s&gt;（实际上是堆中对象指向常量池）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;String s1 = new String();
System.out.println(&quot;s1:&quot;+s1); //s1:（无内容）

char[] chs = {&apos;a&apos;,&apos;b&apos;,&apos;c&apos;};
String s2 = new String(chs);
System.out.println(&quot;s2:&quot;+s2); //s2:abc

byte[] bys = {97,98,99}; //对应计算机底层字符
String s3 = new String(bys);
System.out.println(&quot;s3:&quot;+s3); //s3:abc

String s4 = &quot;abc&quot;;
System.out.println(&quot;s4:&quot;+s4); //s4:abc
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;存储&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String name1 = &quot;Hello&quot;;
name1 = &quot;zhangsan&quot;;//Hello 还存储在常量池中，只是name指向&quot;zhangsan&quot;
String name2 = &quot;zhangsan&quot;;
System.out.println(name1 == name2);//true，地址都是&quot;zhangsan&quot;所在的地址

String str1 = new String(&quot;Java&quot;);
String str2 = new String(&quot;Java&quot;);
System.out.println(str1 == str2);//false,创建的两个对象都指向池中的&quot;Java&quot;，但是两个对象在堆中的地址不同
System.out.println(str1.equals(str2));//true,比较的是值，而非地址
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;常用方法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;str.length();//字符串长度
str.charAt(0);//第i位字符
str.contains(&quot;apple&quot;);//是否包含字符串

str.toCharArray();//转化成字符数组
str.indexOf(&quot;app&quot;);//第一个app的开始下标
str.lastIndexOf(&quot;app&quot;);//最后一个app的开始下标

str1=&quot;  hello world  &quot;;
sout(str1.trim());//去掉前后空格
str1.toUpperCase();//全部转换成大写字母
str1.toLowerCase();//全部转换成小写字母

str.replace(&apos;a&apos;,&apos;c&apos;);//把a替换成c
str.replace(&quot;Java&quot;,&quot;php&quot;);//替换字符/字符串

String s =&quot;java is the best programing language.&quot;;
String[] arr = s.split(&quot; &quot;);//以&quot; &quot;为分割，得到字符串数组

/*正则表达式
s.split(&quot;[ ,]&quot;);//以空格/,进行分割
s.split(&quot;[ ,]+&quot;);//空格/,可以出现多个*/

String s1 = &quot;hello&quot;;
String s2 = &quot;HELLO&quot;;
s1.equals(s2);
s1.equalsIgnoreCase(s2);//忽略大小写 比较大小

String s3 =&quot;abc&quot;;
String s4 =&quot;xyz&quot;;
String s5 = &quot;abcdef&quot;;
sout(s3.compareTo(s4));//第一个不同的字符相差数值（&apos;a&apos;-&apos;x&apos; = -23）
sout(s3.compareTo(s5));//和一个String相同，返回长度差(3-6 = -3)

//substring子字符串
str.substring(1);//第1号位置开始的子字符串

&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;StringBuffer/StringBuilder&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;stringbuffer&quot;&amp;gt;&amp;lt;/span&amp;gt;
一般用 &lt;em&gt;&lt;strong&gt;StringBuilder&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;为什么需要StringBuffer？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#String&quot;&gt;&lt;strong&gt;String&lt;/strong&gt;&lt;/a&gt; 是不可变的。若执行 &lt;code&gt;str = str + &quot;a&quot;&lt;/code&gt;, JVM 会 &lt;strong&gt;创建新的字符串对象&lt;/strong&gt;，频繁拼接会产生大量临时对象，效率极低。
&amp;lt;span id=&quot;str&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;p&gt;2.&lt;strong&gt;StringBuffer 特性&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;线程安全&lt;/strong&gt;：所有方法都加了 &lt;code&gt;synchronized&lt;/code&gt; 同步锁，多线程环境下使用不会出现数据错乱（这是它和 StringBuilder
的核心区别）；&amp;lt;br&amp;gt;
&lt;strong&gt;可变字符序列&lt;/strong&gt;：支持增、删、改、插等操作，且操作后对象本身不变；&amp;lt;br&amp;gt;
&lt;strong&gt;初始容量/自动扩容&lt;/strong&gt;：默认初始容量是 16 个字符，当字符数超过容量时，会自动扩容（扩容为原容量 * 2+2）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// 1. 初始容量20
  StringBuffer sb = new StringBuffer(20); 
// 2. 追加 append
  sb.append(&quot;Hello&quot;);
  sb.append(&quot; &quot;).append(&quot;Java&quot;); // 链式编程
  System.out.println(&quot;拼接后：&quot; + sb); // 输出：Hello Java

// 3. 插入字符/字符串（insert）
  sb.insert(5, &quot;, World&quot;); // 在索引5的位置插入
  System.out.println(&quot;插入后：&quot; + sb); // 输出：Hello, World Java

// 4. 替换(replace)
  sb.replace(0,5,&quot;hi&quot;);

// 5. 修改指定索引的字符（setCharAt）
  sb.setCharAt(0, &apos;h&apos;); // 把第一个字符改为h
  System.out.println(&quot;修改后：&quot; + sb); // 输出：hello, World Java

// 6. 删除字符（delete）
  sb.delete(5, 12); // 删除索引5到11的字符（左闭右开）
  System.out.println(&quot;删除后：&quot; + sb); // 输出：hello Java

// 7. 反转字符串（reverse）
  sb.reverse();
  System.out.println(&quot;反转后：&quot; + sb); // 输出：avaJ olleh

// 8. String 和 StringBuilder 的相互转换
  String finalStr = sb.toString();
  StringBuilder sb1 = new StringBuilder(s1);
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;span id=&quot;BigDecimal&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;h3&gt;BigDecimal类&lt;/h3&gt;
&lt;p&gt;需要进行 &lt;strong&gt;精确运算&lt;/strong&gt; 时使用 BigDecimal&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;double d1 = 1.0;
    double d2 = 0.9;
    double d = d1 - d2;
    System.out.println(d);//0.09999999999999998
/*字符串创建*/
    BigDecimal b1 = new BigDecimal(&quot;1.0&quot;);
    BigDecimal b2 = new BigDecimal(&quot;0.9&quot;);
    BigDecimal bd1 = b1.subtract(b2); //0.1
    BigDecimal bd2 = b1.add(b2); //1.9
    BigDecimal bd3 = b1.multiply(b2); //0.90
    System.out.println(bd1 + &quot; &quot; + bd2 + &quot; &quot; + bd3);

    BigDecimal r1 = new BigDecimal(&quot;1.4&quot;).
            subtract((new BigDecimal(&quot;0.5&quot;))
            .divide(new BigDecimal(&quot;0.9&quot;),2,BigDecimal.ROUND_HALF_UP));
    BigDecimal r2 = new BigDecimal(&quot;10&quot;).divide(new BigDecimal(&quot;3&quot;), 2, BigDecimal.ROUND_HALF_UP);//除不尽，必须加保留几位小数，否则会报错
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;集合&lt;/h2&gt;
&lt;h3&gt;集合基础&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;集合基础&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;集合与数组的区别
数组的容量固定，集合容量可变。
数组可以存储基本类型和引用类型，集合只能引用类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关系
&lt;img src=&quot;img_1.png&quot; alt=&quot;图片描述&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ArrayList&lt;/strong&gt; 的常用方法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   ArrayList&amp;lt;String&amp;gt; array = new ArrayList&amp;lt;&amp;gt;();

// add 添加到集合末尾
   array.add(&quot;hello&quot;);
   array.add(&quot;word&quot;);
// add 指定位置，添加元素
   array.add(&quot;2,java&quot;); //[hello, word, java]
// remove 删除指定元素
   System.out.println(array.remove(&quot;hello&quot;)); //true; 集合变为[word, java]
// set 修改指定索引处的元素，返回被修改的元素
   array.set(1,&quot;javase&quot;); 
// get(index) 返回指定索引处的元素
   array.get(0); //hello
// size 返回元素个数
  array.size();// 3
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;Collections 方法类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;cls&quot;&amp;gt;&amp;lt;/span&amp;gt;
集合工具类，定义了除了存取以外的集合常用方法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;List&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    list.add(10);
    list.add(20);
    list.add(17);
    list.add(19);
/* sort排序 */
    Collections.sort(list);
    System.out.println(list.toString());
/* binarySearch */
    int idx = Collections.binarySearch(list, 17);
    System.out.println(idx);
/* copy */
    List&amp;lt;Integer&amp;gt; dest = new ArrayList&amp;lt;&amp;gt;();
    for (int i = 0; i &amp;lt; list.size(); i++) {
        dest.add(null); // 填充null作为占位符
    }//copy方法的不足：要求占位元素和复制元素个数相同
    Collections.copy(dest, list);

    /* 一般用Arrays.addAll(list) */
    List&amp;lt;Integer&amp;gt; dest2 = new ArrayList&amp;lt;&amp;gt;(list.size()); // 指定初始容量优化性能
    dest2.addAll(list);

/* reverse反转 */
    Collections.reverse(list);

/* shuffle打乱 */
    Collections.shuffle(list);

/* list → 数组 */
    Integer[] arr = list.toArray(new Integer[0]);
    System.out.println(Arrays.toString(arr));

/* 数组 → list */
    String[] names ={&quot;Lily&quot;,&quot;Molly&quot;,&quot;June&quot;};
    List&amp;lt;String&amp;gt; list2 = Arrays.asList(names);
//list2.add(&quot;hi&quot;);现在集合是一个受限集合，不能增删元素
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Collection 集合&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;Collection&quot;&amp;gt;&amp;lt;/span&amp;gt;
无序、无下标、不能重复&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    Collection c = new ArrayList&amp;lt;&amp;gt;();
/* 添加元素 */
    c.add(&quot;apple&quot;);
    c.add(&quot;pear&quot;);
    c.add(&quot;hair&quot;);//[&quot;apple&quot;,&quot;pear&quot;,&quot;hair&quot;]
/* 移除指定元素 */
    c.remove(&quot;hair&quot;);//[&quot;apple&quot;,&quot;pear&quot;]
/* 清空 */
        //c.clear();
/* 判断是否包含/为空 */
    c.contains(&quot;apple&quot;); //true
    c.isEmpty(); //false
/* 遍历 */
   Iterator it = c.iterator();
   while(it.hasNext()){
       String s = (String) it.next();
       System.out.println(s);
// c.remove(s);错误，ConcurrentModificationException并发修改异常,
//迭代器迭代过程中不能使用collection的方法
       it.remove();//✔
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;span id=&quot;iterator&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;List 子接口&lt;/h3&gt;
&lt;p&gt;有序、有下标、元素可以重复&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;常用方法&lt;pre&gt;&lt;code&gt;List list = new ArrayList&amp;lt;&amp;gt;();
/* 添加元素 */
    list.add(&quot;apple&quot;);
    list.add(&quot;pear&quot;);
    list.add(&quot;hair&quot;);//[&quot;apple&quot;,&quot;pear&quot;,&quot;hair&quot;]
/* 移除指定元素 */
    list.remove(&quot;hair&quot;);//[&quot;apple&quot;,&quot;pear&quot;]
/* 返回子集合（含头不含尾） */
    List subList = list.subList(0,2);  //[apple, pear]
/* 判断是否包含/为空 */
    list.contains(&quot;apple&quot;); //true
    list.isEmpty(); //false
/* 获取下标 */
    list.indexOf(&quot;pear&quot;);

/* 遍历(可以从前往后/从后往前) */
    ListIterator it = list.listIterator();
    while(it.hasNext()){
        String s = (String) it.next();
        System.out.println(s);
   }//从前往后
    while(it.hasPrevious()){
        String s = (String) it.previous();
        System.out.println(s);
    }//从后往前
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;List的实现类
&lt;ol&gt;
&lt;li&gt;ArrayList(效率高，线程不安全)
(源码分析)[https://www.bilibili.com/video/BV1zD4y1Q7Fw?t=340.1&amp;amp;p=12]&lt;/li&gt;
&lt;li&gt;Vector(线程安全，效率低)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;   Vector vector = new Vector&amp;lt;&amp;gt;();
   vector.add(&quot;b&quot;);
   vector.add(&quot;c&quot;);
   vector.add(&quot;a&quot;);
   vector.add(&quot;a&quot;);
/* 枚举器 */
  Enumeration en = vector.elements();
   while(en.hasMoreElements()){
       String s =(String)en.nextElement();
       System.out.println(s);
   }
···略
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;LinkList（链表集合，增删快/改查慢）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;LinkedList ll = new LinkedList&amp;lt;&amp;gt;();
ll.add(&quot;apple&quot;);
ll.add(&quot;banana&quot;);
ll.add(&quot;orange&quot;);
ll.remove(&quot;orange&quot;);
Iterator it = ll.iterator();
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;Set 子接口&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;Set&quot;&amp;gt;&amp;lt;/span&amp;gt;
无序、无下标、不能重复&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HashSet&lt;pre&gt;&lt;code&gt;HashSet hs = new HashSet&amp;lt;String&amp;gt;();
hs.add(&quot;a&quot;);
hs.add(&quot;b&quot;);
hs.remove(&quot;b&quot;);
hs.contains(&quot;a&quot;);
hs.isEmpty();
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;TreeSet
基于红黑树的集合&amp;lt;br&amp;gt;
Comparator接口：自定义比较规则
&amp;lt;span id=&quot;Comparator&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;pre&gt;&lt;code&gt;import java.util.*;

public class code2 {
    static class Person {
        int age;

        Person(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return &quot;Person{age=&quot; + age + &quot;}&quot;;
        }
    }

    public static void main(String[] args) {
        // 创建TreeSet，传入Comparator自定义比较规则（按age升序）
        TreeSet&amp;lt;Person&amp;gt; persons = new TreeSet&amp;lt;&amp;gt;(new Comparator&amp;lt;Person&amp;gt;() {
            @Override // 重写compare方法
            public int compare(Person p1, Person p2) {
                return p1.age - p2.age; // 按age升序排列
            }
        });
        /* Lambda 表达式 */
        /* TreeSet&amp;lt;Person&amp;gt; persons = new TreeSet&amp;lt;&amp;gt;((p1, p2) -&amp;gt; p1.age - p2.age); */

        persons.add(new Person(25));
        persons.add(new Person(18));
        persons.add(new Person(30));
        persons.add(new Person(18)); // age相同，TreeSet会去重，不会添加

        System.out.println(&quot;按age升序排列的Person集合：&quot;);
        for (Person p : persons) {
            System.out.println(p);
        }
    }
} 
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;Map集合&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;Map&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Map(interface)
&lt;ul&gt;
&lt;li&gt;实现类
&lt;ul&gt;
&lt;li&gt;HashMap 运行效率高，线程不安全&lt;/li&gt;
&lt;li&gt;Hashtable 运行效率低，线程安全。已被 ConcurrentHashMap 替代
&lt;ul&gt;
&lt;li&gt;Properties (Hashtable的子类，要求key和value都是String)，是开发中配置读写的标准工具。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SortedMap(interface)
&lt;ul&gt;
&lt;li&gt;TreeMap(class) 红黑树存储&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;常用方法&lt;pre&gt;&lt;code&gt;Map&amp;lt;Integer,String&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
//添加(key,value)
    map.put(2,&quot;Molly&quot;);
    map.put(1,&quot;Lily&quot;);
    map.put(3,&quot;Star&quot;);
    map.put(7,&quot;emm&quot;);
// 获取key所对应的值
    System.out.println(map.get(2));//Molly
//删除key
    map.remove(7);
//个数
    map.size();//3
//keySet
    for(Integer key : map.keySet()){
        System.out.println(key);
    }
//entrySet 映射对
    Set&amp;lt;Map.Entry&amp;lt;Integer,String&amp;gt;&amp;gt; entries = map.entrySet();
    for (Map.Entry&amp;lt;Integer,String&amp;gt; entry: entries){
        System.out.println(entry);
    }
//判断是否包含
    System.out.println(map.containsKey(3));
    System.out.println(map.containsValue(&quot;Star&quot;));
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;System类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span&amp;gt;System&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Calendar&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;//Calendar 是抽象类，不能直接 new，需通过 getInstance() 获取实例
    Calendar calendar = Calendar.getInstance();
    System.out.println(calendar.getTime().toInstant());

    int year =calendar.get(Calendar.YEAR);
    int month =calendar.get(Calendar.MONTH+1);
    int day =calendar.get(Calendar.DAY_OF_MONTH);

    System.out.println(year+&quot; &quot;+month+&quot; &quot;+day);
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;内部类&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;内部类&quot;&amp;gt;&amp;lt;/span&amp;gt;
在类的内部定义一个完整的类。&amp;lt;br&amp;gt;
编译后可生成独立的&lt;strong&gt;字节码文件&lt;/strong&gt;;内部类可访问外部类的私有成员。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;成员内部类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初始化 &lt;code&gt;  class Outer{ class Inner{可以访问Outer对象} }&lt;/code&gt;&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;创建对象 &lt;code&gt;Outer.Inner oi = new Outer().new Inner();&lt;/code&gt;&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;访问：当内外部类存在重名属性时，优先访问&lt;strong&gt;内部类&lt;/strong&gt;属性，访问外部类 Outer.this.name;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;静态内部类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;初始化 &lt;code&gt;  class Outer{ **static** class Inner{可以访问Outer对象} }&lt;/code&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建对象：&lt;code&gt;Outer.Inner oi = new Outer.Inner();&lt;/code&gt;不需要先创建外部类对象&amp;lt;br&amp;gt;
类内访问：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;访问外部类的属性&lt;/p&gt;
&lt;p&gt;静态内部类不能访问 non-static 的外部类成员&amp;lt;br&amp;gt;
先创建外部类对象 &lt;code&gt;Outer outer = new Ounter()&lt;/code&gt;;&amp;lt;br&amp;gt;
再 &lt;code&gt;outer.name;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;访问内部类的属性
通过类名访问 &lt;code&gt;Inner.name;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;局部内部类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;初始化&lt;/p&gt;
&lt;p&gt;在类的 &lt;strong&gt;方法&lt;/strong&gt; 中写类&lt;code&gt;class Outer{ public void function(){ class Inner{} } }&lt;/code&gt;&amp;lt;br&amp;gt;
&lt;code&gt;Inner i = new Inner();   i.show2();&lt;/code&gt;
方法运行完毕，类就消失&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#%E5%86%85%E9%83%A8%E7%B1%BB%E5%86%85&quot;&gt;内部类内访问局部变量&lt;/a&gt;
&amp;lt;span id=&quot;内部类内访问局部变量&quot;&amp;gt;&amp;lt;/span&amp;gt;
变量必须是&lt;strong&gt;常量&lt;/strong&gt;（相当于加上final修饰符）&amp;lt;br&amp;gt;
在内部类中调用变量才不能修改(final)，没有调用还可以修改&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;匿名内部类
没有名字的内部类&amp;lt;br&amp;gt;
必须继承一父类/实现接口，减少代码量。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;USB usb = new USB(){
  public void show(){
    sout(&quot;Usb is working...&quot;);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;相当于实现继承的局部内部类：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Fan implements USB{
  void service(){
    sout(&quot;Usb is working...&quot;);
  }
}
USB Usb = new Fan();
Usb.service();
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;JVM&lt;/h3&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;span id=&quot;String&quot;&amp;gt;&amp;lt;/span&amp;gt;
&lt;a href=&quot;#str&quot;&gt;&lt;strong&gt;String的不可变性&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;实现原理&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; public final class String{
      private final char value[];
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;String 类被 &lt;strong&gt;final&lt;/strong&gt; 修饰，&amp;lt;u&amp;gt;无法被继承&amp;lt;/u&amp;gt;；内部存储字符的 char[] value 数组也被 &lt;strong&gt;final&lt;/strong&gt; 修饰，保证 &amp;lt;u&amp;gt;
该数组引用不可指向新数组&amp;lt;/u&amp;gt;。&lt;/li&gt;
&lt;li&gt;数组的 &lt;strong&gt;private&lt;/strong&gt; 封装char[] value 被 private 修饰，外部无法直接访问或修改这个数组。&lt;/li&gt;
&lt;li&gt;无修改方法，操作返回新对象String 没有提供修改内部数组的公开方法，所有字符串操作（如拼接、替换）都会返回新的 String
对象，原对象内容不变。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为什么这样设计？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;支撑常量池：保证常量池中的字符串可安全复用，大幅节省内存；&lt;/li&gt;
&lt;li&gt;适配哈希表：哈希值（hashCode）固定，作为 HashMap/HashSet 的键时稳定且高效；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;span id=&quot;内部类内&quot;&amp;gt;&amp;lt;/span&amp;gt;
&lt;a href=&quot;#%E5%86%85%E9%83%A8%E7%B1%BB%E5%86%85%E8%AE%BF%E9%97%AE%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F&quot;&gt;内部类内&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;局部内部类访问外部类的成员变量时，&lt;em&gt;&lt;strong&gt;因无法保障变量的生命周期与自身相同&lt;/strong&gt;&lt;/em&gt;，变量必须修饰为 final&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public void show(){
  String adress = &quot;home&quot;;
  
  class Inner{
    public void show2(){
      sout...
    }
    Inner inner = new Inner();
    inner.show2();
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若没有final：&amp;lt;br&amp;gt;
show 方法执行完后，局部变量 adress 立即消失；&amp;lt;br&amp;gt;
Inner 对象在堆中不会立即消失，未消失的对象中的show2方法引用的address变量不存在，不能访问到；&lt;/p&gt;
&lt;p&gt;解决方法：&amp;lt;br&amp;gt;
加上final，变成常量&lt;/p&gt;
</content:encoded></item><item><title>力扣Leetcode Exercise</title><link>https://lilyly9.github.io/posts/1%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98leetcode-exercise/</link><guid isPermaLink="true">https://lilyly9.github.io/posts/1%E5%8A%9B%E6%89%A3%E5%88%B7%E9%A2%98leetcode-exercise/</guid><description>一轮leetcode刷题记录，持续更新中……</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;链表：7. 链表相交(面试02.07)    8. 环形链表II(142)
&amp;lt;br&amp;gt;哈希表：6. 四数相加II(454)   8.三数之和(15)   9. 四数之和(18)
&amp;lt;br&amp;gt;字符串
&amp;lt;br&amp;gt;双指针法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%95%B0%E7%BB%84&quot;&gt;数组&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#slowfast&quot;&gt;快慢指针&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3&quot;&gt;滑动窗口&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#linklist&quot;&gt;链表&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%93%88%E5%B8%8C%E8%A1%A8&quot;&gt;哈希表&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E5%AD%97%E7%AC%A6%E4%B8%B2&quot;&gt;字符串&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#KMP1&quot;&gt;KMP算法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%E4%BA%8C%E5%8F%89%E6%A0%91&quot;&gt;二叉树&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;h2&gt;2026&lt;/h2&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1.23&lt;/h3&gt;
&lt;h2&gt;数组&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;数组&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/binary-search/&quot;&gt;&lt;em&gt;&lt;strong&gt;704. 二分查找&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关于 &amp;lt;mark&amp;gt;&lt;strong&gt;&amp;gt;=/medal±1&lt;/strong&gt;&amp;lt;/mark&amp;gt; 的判断&lt;/p&gt;
&lt;p&gt;关于能取到的范围, target 所在范围：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若 [left,right]，则 right 初始化为len-1， &lt;code&gt;while(left&amp;lt;=right)&lt;/code&gt;； media &amp;gt; target 时，right = media-1；media &amp;lt; target
时，left = media + 1
&lt;ul&gt;
&lt;li&gt;若 [left,right)，则 right 初始化为 &lt;strong&gt;len&lt;/strong&gt;，&lt;code&gt;while(left&amp;lt;right)&lt;/code&gt;； media &amp;gt; target 时，right = &amp;lt;mark&amp;gt;media&amp;lt;/mark&amp;gt;；media &amp;lt; target 时，left = media + 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/spiral-matrix-ii/description/&quot;&gt;59. 螺旋矩阵II&lt;/a&gt;
&amp;lt;br&amp;gt;关于边界条件、循环不变式的确定。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/spiral-matrix/description/&quot;&gt;54. 螺旋矩阵&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;避免单行/列重复遍历&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;按层遍历，收缩边界&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;快慢指针&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;slowfast&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/remove-element/&quot;&gt;&lt;em&gt;&lt;strong&gt;27. 移除元素&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;mark&amp;gt;&lt;strong&gt;快慢指针&lt;/strong&gt;&amp;lt;/mark&amp;gt;  O(n)&lt;/p&gt;
&lt;p&gt;slow代表下标， fast代表查询到的元素。遍历 fast 到 len&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;相对指针&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;最开始的思路，left指针检测当前 nums[left] == val，&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果是，就把 right 的值覆盖&lt;/li&gt;
&lt;li&gt;如果不是，就后移&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;在最开始和每一次覆盖之后&lt;/strong&gt;，把所有 nums[right] == val 的值排除掉&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;u&amp;gt;while(&lt;strong&gt;大循环&lt;/strong&gt;){ while(&lt;strong&gt;小循环&lt;/strong&gt;)每次把特殊情况处理完 }&amp;lt;/u&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/remove-duplicates-from-sorted-array/&quot;&gt;&lt;em&gt;&lt;strong&gt;26. 删除有序数组中的重复项&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/backspace-string-compare/solutions/683776/shuang-zhi-zhen-bi-jiao-han-tui-ge-de-zi-8fn8/&quot;&gt;844. 比较含退格的字符串&lt;/a&gt;
最后的比较需要优化 / stack方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/move-zeroes/&quot;&gt;&lt;em&gt;&lt;strong&gt;283. 移动零&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;
只遍历一遍数组&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/squares-of-a-sorted-array/&quot;&gt;&lt;em&gt;&lt;strong&gt;997.有序数组的平方&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;  此题争议较大（原数组上怎么实现）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/&quot;&gt;&lt;em&gt;&lt;strong&gt;19. 删除链表的倒数第 N 个结点&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;
① 一次遍历法(最优解)：&amp;lt;u&amp;gt;快指针先走 N 步，快慢指针再一起走，直到快指针到达null&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;
② 两次遍历法：第一遍确定总个数 len，再 len-n 求出需要进行操作的节点序号(删除的前一个节点)。要添加 dummy 虚拟头节点。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/&quot;&gt;160. 相交链表&lt;/a&gt;
计算两链表长度的差值，&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;滑动窗口&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;滑动窗口&quot;&amp;gt;&amp;lt;/span&amp;gt;
找&lt;strong&gt;连续&lt;/strong&gt;字串、数组的最小/最好字串、子数组&lt;/p&gt;
&lt;p&gt;暴力解法会把数组嵌套遍历两遍，时间复杂度O(n^2);&amp;lt;br&amp;gt;
滑动窗口的思想是直接把数组遍历两遍，时间复杂度O(2n)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/&quot;&gt;3. 无重复字符的最长子串&lt;/a&gt;
HashMap存储区间内字母所在的位置；&amp;lt;br&amp;gt;
对于每次检测的字符:
&lt;ol&gt;
&lt;li&gt;存在区间内 (idx&amp;gt;l)，把 l更新为idx+1&lt;/li&gt;
&lt;li&gt;不存在区间内，不含重复字符的数组长度 length++&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/fruit-into-baskets/description/&quot;&gt;904. 水果成篮&lt;/a&gt;
&amp;lt;br&amp;gt;含有1/2个不同数字的 最长连续子数组 长度。&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/minimum-size-subarray-sum/&quot;&gt;209. 长度最小的子数组&lt;/a&gt;
每一轮迭代，将 nums[r] 加到sum，如果 sum ≥ target，则更新 l，更新子数组的最小长度，l不断右移到 sum&amp;lt;target&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;链表&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;linklist&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/remove-linked-list-elements/description/&quot;&gt;203. 移除链表元素&lt;/a&gt;&amp;lt;br&amp;gt;
①移除头节点 head 和移除其他节点有区别，②Solution：添加虚拟头节点&amp;lt;br&amp;gt;
① 头节点&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;while(head!=null &amp;amp;&amp;amp; head.val==val) {
    head = head.next;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其他节点，&lt;em&gt;&lt;strong&gt;连续target值的处理&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ListNode cur = head;
while(cur!=null &amp;amp;&amp;amp; cur.next !=null) {
    if(cur.next.val == val){
        cur.next = cur.next.next; //处理连续target值
    } else {
        cur = cur.next;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;② &amp;lt;mark&amp;gt;&lt;strong&gt;&lt;em&gt;虚拟头节点（哨兵）&lt;/em&gt;&lt;/strong&gt;&amp;lt;/mark&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ListNode dumpy = new ListNode();
    dumpy.next = head;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/reverse-linked-list/&quot;&gt;反转链表&lt;/a&gt;  易&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/swap-nodes-in-pairs/&quot;&gt;两两交换链表中的节点&lt;/a&gt;
&amp;lt;br&amp;gt;&lt;em&gt;&lt;strong&gt;添加虚拟头节点&lt;/strong&gt;&lt;/em&gt; :操作当前节点，至少要指向当前的前一个节点
&amp;lt;br&amp;gt;① 做的复杂化了，是递归假象的 while 循环，优化：一次循环只交换一对
&amp;lt;br&amp;gt;② 递归 很巧妙（跪）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;快慢指针&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/&quot;&gt;19. 删除链表的倒数第 N 个结点&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/&quot;&gt;160. 相交链表&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;哈希表/散列表&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;哈希表&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/valid-anagram/submissions/699923689/&quot;&gt;242. 有效的字母异位词&lt;/a&gt;
桶计数法。&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/intersection-of-two-arrays/description/&quot;&gt;349. 两个数组的交集&lt;/a&gt;
数据类型的转换，Set&amp;lt;Integer&amp;gt; → int[]&amp;lt;br&amp;gt;
包装类型流 转化为 基本数据类型数组：包装类型流 → 基本类型流 → 基本类型数组&lt;pre&gt;&lt;code&gt;   res.stream().mapToInt(Integer::intValue).toArray();
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/happy-number/&quot;&gt;202. 快乐数&lt;/a&gt;
hash 空间复杂度是 O(n);改用快慢指针，空间复杂度O(1).&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/two-sum/description/&quot;&gt;1. 两数之和&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;字符串&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;字符串&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/reverse-string/description/&quot;&gt;344. 反转字符串&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/reverse-string-ii/submissions/701699936/&quot;&gt;541. 反转字符串II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/&quot;&gt;28. 找出字符串中第一个匹配项的下标 strStr()&lt;/a&gt;
&amp;lt;br&amp;gt;👆很简单的模拟题，但T28值得一提的 &lt;a href=&quot;#KMP2&quot;&gt;&amp;lt;u&amp;gt;&lt;strong&gt;&lt;em&gt;KMP算法&lt;/em&gt;&lt;/strong&gt;&amp;lt;/u&amp;gt;&lt;/a&gt;
&amp;lt;span id=&quot;KMP1&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://kamacoder.com/problempage.php?pid=1064&quot;&gt;替换数字&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/reverse-words-in-a-string/&quot;&gt;151. 反转字符串中的单词&lt;/a&gt;
Java中的 &lt;strong&gt;&lt;em&gt;split&lt;/em&gt;&lt;/strong&gt; 两个string之间的空格＞1，会多增加一个空单词（&quot;&quot;）
删除尾部空格 s.&lt;strong&gt;strim();&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;[] &lt;a href=&quot;https://leetcode.cn/problems/repeated-substring-pattern/description/&quot;&gt;459. 重复的子字符串&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;KMP&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;KMP2&quot;&amp;gt;&amp;lt;/span&amp;gt;
&lt;a href=&quot;https://www.bilibili.com/video/BV1AY4y157yL?t=149.7&quot;&gt;视频教程&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;对于两个字符数组的遍历
&lt;ol&gt;
&lt;li&gt;string[i] == patt[j] 时，i++ j++；&lt;/li&gt;
&lt;li&gt;否则当 j&amp;gt;0 时，&lt;code&gt;j=next[j-1]&lt;/code&gt;指向前一个匹配的 next数值（可以跳过的匹配位数）&lt;/li&gt;
&lt;li&gt;否则，patt第一个字符就无法匹配，i++
&lt;img src=&quot;img_6.png&quot; alt=&quot;img_6.png&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&amp;lt;mark&amp;gt;next数组&amp;lt;/mark&amp;gt;
匹配失败时，返回最后一个匹配字符，next代表子串中“相同前后缀的长度”
&amp;lt;div style=&quot;display: flex; width: 70%; gap: 10px;&quot;&amp;gt;
&amp;lt;div style=&quot;flex: 1; text-align: center;&quot;&amp;gt;
&amp;lt;img src=&quot;/images/kpm.png&quot; alt=&quot;项目标准&quot; style=&quot;width: 100%;&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;二叉树&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;二叉树&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://leetcode.cn/problems/sum-of-root-to-leaf-binary-numbers/description/?envType=daily-question&amp;amp;envId=2026-02-24&quot;&gt;1022. 从根到叶的二进制数之和&lt;/a&gt;
&amp;lt;br&amp;gt;dfs + 递归&lt;/li&gt;
&lt;li&gt;[] &lt;a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;style&amp;gt;
mark {
background-color: #b5627d;&lt;br /&gt;
color: #2d3748;&lt;br /&gt;
padding: 0 2px;
border-radius: 2px;&lt;br /&gt;
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    @media (prefers-color-scheme: dark) {
    mark {
    background-color: #BB8FCE;  
    color: #333333;  
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/style&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>