MySQL表的约束与基本查询图文详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一. 表的约束</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 空属性</a></li><li><a href="#_lab2_0_1">2. 默认值</a></li><li><a href="#_lab2_0_2">3. 列描述</a></li><li><a href="#_lab2_0_3">4. zerofill</a></li><li><a href="#_lab2_0_4">5. 主键</a></li><li><a href="#_lab2_0_5">6. 自增长</a></li><li><a href="#_lab2_0_6">7. 唯一键</a></li><li><a href="#_lab2_0_7">8. 外键</a></li></ul><li><a href="#_label1">二. 基本查询</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_8">1. Create</a></li><ul class="third_class_ul"><li><a href="#_label3_1_8_0">(1)单行数据 + 全列插入</a></li><li><a href="#_label3_1_8_1">(2)多行数据 + 指定列插入</a></li><li><a href="#_label3_1_8_2">(3)插入否则更新</a></li><li><a href="#_label3_1_8_3">(4)替换</a></li></ul><li><a href="#_lab2_1_9">2. Retrieve</a></li><ul class="third_class_ul"><li><a href="#_label3_1_9_4">(1)SELECT 列</a></li><li><a href="#_label3_1_9_5">(2)WHRER 条件</a></li><li><a href="#_label3_1_9_6">(3)结果排序</a></li><li><a href="#_label3_1_9_7">(4)筛选分页结果</a></li></ul><li><a href="#_lab2_1_10">3. Update</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_11">4. Delete</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_12">5. 聚合函数</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label2">总结 </a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一. 表的约束</h2><p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 空属性</h3>
<p>表创建的时候默认属性为null。null 表示当用户插入数据时,该字段允许为空。反之,not null 就是不允许为空</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030827.png" /></p>
<p>当类型设置为 not null 时,我们插入数据不添加该项就会导致报错。</p>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. 默认值</h3>
<p>当我们插入数据时,可以提前设置好默认值,当我们插入数据没有添加该项时,就会按照默认值自动填充。</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030819.png" /></p>
<p>当我们设置好默认值后,我们插入后就会自动填充其余数据。</p>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>3. 列描述</h3>
<p>comment 列描述,没有特别含义,用于给列进行备注</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030890.png" /></p>
<p class="maodian"><a name="_lab2_0_3"></a></p><h3>4. zerofill</h3>
<p>zerofill 用于填充数字类型前的空位,用0进行填充</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030866.png" /></p>
<p>这里的int(5)占着5位,数字18占2位,使用zerofill后会自动填充剩余3位为0</p>
<p class="maodian"><a name="_lab2_0_4"></a></p><h3>5. 主键</h3>
<p>主键primary key是唯一的约束字段里的数据,主键标识的字段不能重复且不能为空。一张表内往往只能有一个主键。</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030844.png" /></p>
<p>我们给id添加主键后,第一次插入id为1的时候是成功的,第二次插入id为1的时候会告警重复。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030886.png" /></p>
<p>当我们想要删除主键时,进行drop操作即可。</p>
<p>我们也可以用两个字段当做复合主键进行使用。</p>
<p class="maodian"><a name="_lab2_0_5"></a></p><h3>6. 自增长</h3>
<p>auto_increment:当对应字段不给值时,会按照当前已有的最大值进行+1操作,获得一个新的值。它必须是一个 key 值,并且必须是整数,一张表中最多只能存在一个自增长。</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030894.png" /></p>
<p>例如我们插入a时 id 默认为1,插入 b 时系统会自动给 id 加上 1</p>
<p class="maodian"><a name="_lab2_0_6"></a></p><h3>7. 唯一键</h3>
<p>唯一键的作用是保证该字段的内容唯一。它与主键的区别在于,主键是保证字段是唯一的但同时他也要起到标识的作用。而唯一键只是在业务逻辑上需要保证唯一,他不需要起到标识作用。</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030868.png" /></p>
<p>我们用 unique 标识唯一键,此时在id列上 id 就不能重复</p>
<p class="maodian"><a name="_lab2_0_7"></a></p><h3>8. 外键</h3>
<p>外键 <span>foreign key (</span><span>字段名</span><span>) references </span><span>主表</span><span>(</span><span>列</span><span>) ,主要是连接主表和从表,将两个表建立联系</span></p>
<p><span>案例:</span></p>
<p style="text-align:center"><span><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030879.png" /></span></p>
<p><span>插入一个班级号为</span><span>30</span><span>的学生,因为没有这个班级,所以插入不成功</span></p>
<p class="maodian"><a name="_label1"></a></p><h2>二. 基本查询</h2>
<p class="maodian"><a name="_lab2_1_8"></a></p><h3>1. Create</h3>
<p class="maodian"><a name="_label3_1_8_0"></a></p><h4>(1)单行数据 + 全列插入</h4>
<p><span>插入的数量和顺序要和定义表时一致。</span></p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030897.png" /></p>
<p class="maodian"><a name="_label3_1_8_1"></a></p><h4>(2)多行数据 + 指定列插入</h4>
<p><span>插入两条记录的数量和顺序要和定义表时一致。</span></p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030859.png" /></p>
<p class="maodian"><a name="_label3_1_8_2"></a></p><h4>(3)插入否则更新</h4>
<p>on duplicate key update,检查表中是否存在该主键的数据,若不存在直接插入,若存在则覆盖插入</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030870.png" /></p>
<p>如何判断表中数据是否冲突或者覆盖了</p>
<p>0 row affected:表中有数据冲突,但要插入的值和原先的值一致,所以0行改变</p>
<p>1 row affected:表中没有数据冲突,数据被 插入</p>
<p>2 row affected:表中有数据冲突,并且数据已经更新</p>
<p class="maodian"><a name="_label3_1_8_3"></a></p><h4>(4)替换</h4>
<p>replace into 【表名】,若表冲突就进行覆盖,不冲突就直接插入</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030816.png" /></p>
<p class="maodian"><a name="_lab2_1_9"></a></p><h3>2. Retrieve</h3>
<p class="maodian"><a name="_label3_1_9_4"></a></p><h4>(1)SELECT 列</h4>
<p>全列查询 select * from 【表名】</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030865.png" /></p>
<p>指定列查询 select 【列】,【列】from 【表】</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030859.png" /></p>
<p>查询不包含字段 select 【表达式】from 【表】</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030927.png" /></p>
<p>去重列元素 select distinct 【列】from【表】</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030996.png" /></p>
<p class="maodian"><a name="_label3_1_9_5"></a></p><h4>(2)WHRER 条件</h4>
<p>where 相当于我们学习语言中的判断条件,往往是优先执行的,先执行判断条件再执行函数体</p>
<p>例如这里我们筛选要求数学和英语成绩</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030937.png" /></p>
<p>like ‘【样式】%’ 可以筛选有相似的列,如下面我们筛选了孙相关的列</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030998.png" /></p>
<p class="maodian"><a name="_label3_1_9_6"></a></p><h4>(3)结果排序</h4>
<blockquote><p>asc 为升序,desc 为降序</p></blockquote>
<p>我们通过下面案例可以观察,多个排序是按照第一个优先,在第一个一样的基础上才会进行第二项排序。当我们不加desc或者asc,默认情况下是采用asc(升序),所以我们使用时只用desc即可</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030940.png" /></p>
<p>order by 用于跟在select后面进行结果排序</p>
<p class="maodian"><a name="_label3_1_9_7"></a></p><h4>(4)筛选分页结果</h4>
<p>当我们查询大量数据时,我们可以采取分页的方法,避免一次性加载数据过多</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030974.png" /></p>
<p>limit 是要返回的行数,offset 是偏移量</p>
<p class="maodian"><a name="_lab2_1_10"></a></p><h3>3. Update</h3>
<blockquote><p>update 【表】set【列改变】where【列名】</p></blockquote>
<p>用于更新表内数据</p>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030917.png" /></p>
<p>这里对孙权的数学成绩改为了60</p>
<p class="maodian"><a name="_lab2_1_11"></a></p><h3>4. Delete</h3>
<blockquote><p>Delete from【表名】where【列定位】</p></blockquote>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030991.png" /></p>
<p>若我们想删除整张表无需添加where即可实现</p>
<p class="maodian"><a name="_lab2_1_12"></a></p><h3>5. 聚合函数</h3>
<blockquote><p>聚合函数类似,count sum avg max min,用于计算列数量,数据总和,平均最大最小值</p></blockquote>
<p>案例:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010410030992.png" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>总结 </h2>
頁:
[1]