MySQL:CRUD进阶(七千五百字)
文章目录
- 前置文章:
- 📑1. 数据库约束
- 🌤️1.1 约束类型
- 🌤️1.2 NULL约束
- 🌤️1.3 Unique:唯一约束
- 🌤️1.4 Default:默认值约束
- 🌤️1.5 Primary key:主键约束
- 💫1.5.1 自增主键
- 🌤️1.6 Foreign key:外键约束
- 🌤️1.7 Check约束
- 📑2. 表的设计
- 🌤️2.1 一对一
- 🌤️2.2 一对多
- 🌤️2.3 多对多
- 📑3. 新增
- 📑4. 查询
- 🌤️4.1 聚合查询
- 💫4.1.1 聚合函数
- 🌟 count
- 🌟 sum
- 🌟 avg
- 🌟 max
- 🌟 min
- 💫4.1.2 Group by子句
- 💫4.1.3 Having
- 🌤️4.2 联合查询
- 💫4.2.1 内连接
- 💫4.2.2 外连接
- 🌟左外连接
- 🌟右外连接
- 💫4.2.3 自连接
- 💫4.2.4 子查询简单介绍
- 💫4.2.5 联合查询
- 📑5. SQL查询中各个关键字的执行先后顺序
- ☁️结语
前置文章:
MySQL:CRUD初阶
📑1. 数据库约束
MySQL命令是不区分大小写的,为了风格统一,以下只使用小写字母。
🌤️1.1 约束类型
✨1. NOT NULL - 指示某列不能存储 NULL 值。
✨2. UNIQUE - 保证某列的每行必须有唯一的值。
✨3. DEFAULT - 规定没有给列赋值时的默认值。
✨4. PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
✨5. FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
✨6. CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。
🌤️1.2 NULL约束
指示某列不能存储 NULL 值。
create table 表名(字段名 字段类型 not null,字段名 字段类型 not null,...);
举例:


🌤️1.3 Unique:唯一约束
保证某列的每行必须有唯一的值。
create table 表名(字段名 字段类型 unique,字段名 字段类型,...);
举例:

注意:unique 会自动创建索引,以便于快速查找。暂时先了解一下,在下一篇文章中再详细介绍吧
🌤️1.4 Default:默认值约束
规定没有给列赋值时的默认值。
create table 表名(字段名 字段类型 default,字段名 字段类型,...);
示例:

🌤️1.5 Primary key:主键约束
NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
create table 表名(字段名 字段类型 primary key,...);
注意:
- 不允许一个表中出现多个主键
- 主键会在修改/插入的时候先触发查询
- 数据库会针对主键创建‘索引’,方便快速查询。暂时先了解一下,在下一篇文章中再详细介绍吧
示例:

💫1.5.1 自增主键
在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以1,2,3,4…的形式增长。
create table 表名 (字段名 字段类型 primary key auto_increment ,...);
注意:
- 默认情况下,auto_increment 的初始值是 1,每新增一条记录,字段值自动加 1。
- 一个表中只能有一个字段使用 auto_increment 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
- auto_increment 约束的字段必须具备 not null 属性。
- auto_increment 约束的字段只能是整数类型(tinyint、smallint、int、bigint 等)。
- auto_increment 约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment 就会失效。
示例:

此时我们手动插入一个id为100的数据,也是可以做到的。之后你将id交给MySQL来处理,会发现它是在你手动插入数据的id的向后递增的。

此时你把id为101的数据删掉,然后在插入一个新的数据,可以看到:
小结:
- 其实在MySQL中,给每个表都记录了一个‘自增主键的最大值’,后续继续插入数据,无论之前的最大值是否存在,都是根据之前保存的最大值继续向后分配的。
🌤️1.6 Foreign key:外键约束
保证一个表中的数据匹配另一个表中的值的参照完整性。换句话说外键用于关联其他表的主键或唯一键。
create table 表名(字段名 字段类型,foreign key(当前表中的字段名) references 另一个表名(另一个表中的字段名));

在上述操作中,student为子表,class为父表
注意:
- 在往子表中插入数据的时候,会触发对父表的查询。
- 如果父表中的某个记录,被子表引用了,此时就不能删除/修改父表中对应的记录了。
- 在删除表时,要确保先删除子表,再删除父表。
🌤️1.7 Check约束
保证列中的值符合指定的条件。对于MySQL数据库,对check子句进行分析,但是忽略check子句。
关于check约束可以看一看这篇文章:
MySQL 8.0 新特性之检查约束(CHECK)
📑2. 表的设计
🌤️2.1 一对一
场景:
一个学生,只能有一个账号。一个账号,只能被一个学生持有。
设计表的做法:
- 创建一个表,同时包含学生和账号的信息
student_account(studentId,name,accountName,password…); - 创建2个表,使用id来联系
student(studentId,name,accountId);
account(accountId,accountName,password);
或者
student(studentId,name);
account(accountId,accountName,password,studentId);
根据实际开放的需要来设计,怎么方便,怎么简单就怎么来~~
🌤️2.2 一对多
场景:
一个学生只能属于一个班级,一个班级可以包含多个学生。
设计表的做法:

🌤️2.3 多对多
场景:
一个学生,可以选择多门课程学习。一门课程,也可以被多个学生选择。
设计表的做法:引入关联表,通过关联表把多对多关系表示出来

📑3. 新增
插入查询结果,例如把表1的查询结果,插入到表2中
insert into 表名 select * from 表名;
示例:

查询两个表中的数据:

注意:列数/类型/顺序要和insert into 后面的表相匹配,而列的名字是不要求相同的
📑4. 查询
🌤️4.1 聚合查询
💫4.1.1 聚合函数
select 聚合函数名(字段名) from 表名;
常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

注意:使用聚合函数时,如果在聚合函数名和()之间加上空格,就会使函数执行失败。
🌟 count
返回查询到的数据的数量

🌟 sum
返回查询到的数字的总和,不是数字没有意义

注意:null与null或其他任何数据计算都为null,但是sum比较特殊,遇到null会直接跳过。
🌟 avg
返回查询到的数字的平均值,不是数字没有意义
🌟 max
返回查询到的数字的最大值,不是数字没有意义
🌟 min
返回查询到的数字的最小值,不是数字没有意义
💫4.1.2 Group by子句
select 中使用 group by 子句可以对指定列进行分组查询。
select 字段名 from 表名 group by 字段名;
注意:使用 group by 进行分组查询时,select 指定的字段必须是“分组依据字段”,其他字段若想出现在select 中则必须包含在聚合函数中。
示例:

- 一般在进行 group by 分组的时候,select 后面的列名,一般要么写 group by 分组的列(role) 或者写 搭配聚合函数的列。
示例:

💫4.1.3 Having
在select语句中使用having子句来指定一组行或聚合的过滤条件。
having子句通常与group by子句一起使用,以根据指定的条件过滤分组。如果省略group by子句,则having子句的行为与where子句类似。
select 字段名 from 表名 by 字段名 having 字段名;
注意:having子句将过滤条件应用于每组分行,而where子句将过滤条件应用于每个单独的行。
示例:

🌤️4.2 联合查询
实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积
可以看出:
- 笛卡尔积的列数,就是两个表的列数之和
- 笛卡尔积的行数,就是两个表的行数之积
所谓的“多表联合查询”就是基于笛卡尔积这样的运算来展开的~~
进行多表查询的时候,通常会通过一定的条件把笛卡尔积中的“合法(你想要的)数据筛选出来”,这样的条件就称为“连接条件”
查询时的基本步骤:
- 明确要查询的信息来自于哪些表
- 针对这些表进行笛卡尔积(前提是确实能进行笛卡尔积)
- 指定连接条件,把有意义的数据筛选出来
- 根据需要,进一步指定条件,对数据进行筛选。(新加的条件往往通过and的方式,和连接条件放在一起)
- 进一步的针对查询的列,进行精简(减少列数,只保存必要的)。
💫4.2.1 内连接
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
-- 或者
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
示例:

💫4.2.2 外连接
🌟左外连接
select 字段名 from 表名1 left join 表名2 on 连接条件;
left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
🌟右外连接
select 字段 from 表名1 right join 表名2 on 连接条件;
right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来。左表记录不足的地方均为NULL。
💫4.2.3 自连接
select 字段名 from 表名 as 别名 join 同一个表名;
示例:对student进行自连接

需要注意的是,如果在自连接的时候,表非常大,此时的连接开销也会非常大,容易把数据库搞挂。使用时需要心里有数,要知道表中数据的量级。
💫4.2.4 子查询简单介绍
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。换句话说,本来一个需求,需要通过多个sql语句来完成,但是偏偏要把多个sql合并成一个(套娃),这就是子查询。这样会使sql语句的可读性降低,不太建议使用。
💫4.2.5 联合查询
select 字段名 from 表名 union (all) select 字段名 from 表名;
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用union和union all时,前后查询的结果集中,字段需要一致
示例:

注意:union会自动去掉结果集中的重复行(去重)。而union all不会去掉结果集中的重复行(不去重)。
📑5. SQL查询中各个关键字的执行先后顺序
SQL查询中各个关键字的执行先后顺序: from > on> join > where > group by > with > having >select > distinct > order by > limit
☁️结语
请给自己些耐心,不要急于求成。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!
都看到这里啦!真棒(*^▽^*)
可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家
如有纰漏或错误,欢迎指正
相关文章:
MySQL:CRUD进阶(七千五百字)
文章目录 前置文章:📑1. 数据库约束🌤️1.1 约束类型🌤️1.2 NULL约束🌤️1.3 Unique:唯一约束🌤️1.4 Default:默认值约束🌤️1.5 Primary key:主键约束&…...
与C共舞:让编译更顺滑(2)
1.6 Packed结构体 默认情况下,Zig中的所有结构体字段自然对齐到@alignOf(FieldType)(ABI大小),但没有定义布局。有时,您可能希望具有不符合您的C ABI的定义布局的结构体字段。packed结构体允许您对结构体字段进行极其精确的控制,允许您逐位放置字段。 在packed结构体内…...
Go 群发邮件Redis 实现邮件群发
一、安装 go get github.com/go-redis/redis/v8 go get gopkg.in/gomail.v2 二、使用"gopkg.in/gomail.v2"群发 package mainimport (gomail "gopkg.in/gomail.v2" )func main() {// 邮件内容m : gomail.NewMessage()m.SetHeader("From", &qu…...
夕小瑶:资本寒冬下的AI创业一年
几天前我和几位前大厂朋友约了个饭,朋友纷纷向我透露出一种纠结: “GPT-4o将催生一大波创业机会啊,想离职” “但是现在是资本寒冬啊” “好想像你一样勇敢啊” 说起来这两年的大厂打工人确实比较难,受经济大环境影响࿰…...
[JAVASE] 异常 与 SE阶段知识点补充
目录 一. 异常 1.1 什么是异常? 1.2 异常的本质 1.3 异常的分类 1.4 如何处理异常? 1.5 自定义异常 1.6 受查异常 与 非受查异常 与 Error(重要) 二. Object类 三. 内部类 2.1 什么是内部类? 2.2 内部类的分类 2.3 常用内部类的使用 四. 总结 一. 异常 1.1 什么是异…...
可视化数据科学平台在信贷领域应用系列一:数据探索
引言 信贷风险数据建模是金融机构在数据量日益庞杂的时代进行信贷业务风控的关键技术。它能够帮助机构更好地控制风险、减少违约损失,并提高业务效率。通过不断优化建模方法和利用建模工具,金融机构的风险控制能力得到了显著提升。 在本文中,…...
SpringBoot发送Gmail邮件
1. 登录Gmail Gmail网址 点击右上角“小齿轮”,然后点击"查看所有设置" 点击“转发和 POP/IMAP”,按图中设置,然后点击保存: 2. 启用两步验证(https://myaccount.google.com/security) 登录上述网址,找…...
【小海实习日记】金融-现货以及合约理解
在股票和金融市场中,“单项持仓”和“双向持仓”是两个常见的概念,主要用于描述投资者在市场中的头寸及其策略。 单项持仓(单向持仓) 单项持仓是指投资者在市场中只持有一种方向的头寸(多头或空头)&#…...
html 添加元素如何能提升速度
在 HTML 中,如果你需要频繁地添加大量元素,需要确保你的操作能够以最佳性能进行。以下是一些有助于提高添加元素速度的方法: 综上所述,通过使用文档片段、innerHTML、虚拟滚动以及避免频繁的重排和重绘,你可以提高在 H…...
人工智能大模型的进化之路:探索如何让它们变得更“聪明”
一、引言 在人工智能(AI)领域,大模型凭借其强大的处理能力和广泛的应用前景,已经成为研究的热点。然而,尽管这些模型在多个领域展现出了惊人的能力,但它们仍然面临着理解力、泛化能力和适应性等方面的挑战…...
【设计模式深度剖析】【6】【结构型】【外观模式】| 以电脑开关按钮为例,并结合微服务架构的API网关加深理解
👈️上一篇:桥接模式 | 下一篇:享元模式👉️ 设计模式-专栏👈️ 目 录 外观模式(Facade Pattern)定义英文原文直译如何理解呢?字面理解代码实现中的理解生活案例:操作多功能料理机典型案例…...
2024拼多多 最新理论+实战干货,从入门到精通全链路多角度学习-7节课
基于最新规则理论结合实际的干货 课程内容: 01 2024年多多防比价新规则破局理论课与实操课.mp4 02 24年多多强付费第二节课基础内功.mp4 03 24年多多强付费第三节课直通车实操 .mp4 04 24年多多强付费第一节课市场定价格段,mp4 05 24年多多自然流第一节课市场…...
在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南
效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂,还通过其强大的扩展库支持丰富的后期处理效果,为3D场景增添无限魅力。本篇文章将引导您深入了…...
Webrtc支持HEVC之FFMPEG支持HEVC编解码(一)
一、前言 Webrtc使用的FFMPEG(webrtc\src\third_party\ffmpeg)和官方的不太一样,使用GN编译,各个平台使用了不一样的配置文件 以Windows为例,Chrome浏览器也类似 二、修改配置文件 windows:chromium\config\Chrome\win\x64 其他平台: chromium\config\Chrome\YOUR_SYS…...
高校实验室危险化学品及重大危险源安全管理系统
高校实验室危险化学品及重大危险源安全管理的重要性: 保障师生安全:通过严格管理,可以有效地降低这些风险,确保师生在实验室内的安全。 确保实验教学质量:良好的危化品管理能够确保实验材料的准确性和可靠性࿰…...
【Godot4自学手册】第四十一节背包系统(一)UI设置
各位同学,好久没有更新笔记了,今天开始,我准备自学背包系统。今天先学习下UI界面设置。 一、新建场景和结点 1.新建Node2D场景,命名为Inventory,保存到Scenes目录下,inventory.tscn。 2.新建TextureRect子…...
JS继承的方式
目录 原型链继承构造函数继承组合继承寄生组合继承ES6 Class 继承原型链继承 原理: 通过将子类的原型(prototype)设置为父类的一个实例,使得子类实例能够沿着原型链访问到父类的属性和方法。 function Parent() {this.parentProperty...
拓展虚拟世界边界,云手机可以做到吗
虚拟世界,AI,VR等词汇是21世纪最为流行的词汇,在科技背后,这些词汇的影响变得越来越大,已经走进了人们的世界,比如之前APPLE发布的vision pro,使人们能够更加身临其境的体验到原生os系统&#x…...
网络的功能和实现方法简介
网络的功能: 计算机网络是研究怎么样在两个端用户之间提供访问通路的。所以网络的功能是为网络上的任意两个端用户之间提供访问通路。 计算机通信的特点: 间歇性和突发性。即时而线路中没有信息流过,时而突来的大量数据需要迅速传输。为此计…...
npm有哪些插件包??
1.Web开发相关 Web开发相关的npm插件包涵盖了各种工具、框架和库,帮助开发人员简化开发流程、提高效率并实现更好的用户体验。以下是一些常见的Web开发相关的npm插件包及其功能: 1. webpack:一个现代的JavaScript应用程序的静态模块打包工具…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
