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应用程序的静态模块打包工具…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
