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. 不允许一个表中出现多个主键
  2. 主键会在修改/插入的时候先触发查询
  3. 数据库会针对主键创建‘索引’,方便快速查询。暂时先了解一下,在下一篇文章中再详细介绍吧

示例:
在这里插入图片描述

💫1.5.1 自增主键

在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以1,2,3,4…的形式增长。

create table 表名 (字段名 字段类型 primary key auto_increment ,...);

注意:

  1. 默认情况下,auto_increment 的初始值是 1,每新增一条记录,字段值自动加 1。
  2. 一个表中只能有一个字段使用 auto_increment 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
  3. auto_increment 约束的字段必须具备 not null 属性。
  4. auto_increment 约束的字段只能是整数类型(tinyint、smallint、int、bigint 等)。
  5. auto_increment 约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment 就会失效。

示例:
在这里插入图片描述
此时我们手动插入一个id为100的数据,也是可以做到的。之后你将id交给MySQL来处理,会发现它是在你手动插入数据的id的向后递增的。
在这里插入图片描述
此时你把id为101的数据删掉,然后在插入一个新的数据,可以看到:

小结:

  • 其实在MySQL中,给每个表都记录了一个‘自增主键的最大值’,后续继续插入数据,无论之前的最大值是否存在,都是根据之前保存的最大值继续向后分配的。

🌤️1.6 Foreign key:外键约束

保证一个表中的数据匹配另一个表中的值的参照完整性。换句话说外键用于关联其他表的主键或唯一键。

create table 表名(字段名 字段类型,foreign key(当前表中的字段名) references 
	另一个表名(另一个表中的字段名));

在这里插入图片描述
在上述操作中,student为子表,class为父表

注意:

  1. 在往子表中插入数据的时候,会触发对父表的查询。
  2. 如果父表中的某个记录,被子表引用了,此时就不能删除/修改父表中对应的记录了。
  3. 在删除表时,要确保先删除子表,再删除父表。

🌤️1.7 Check约束

保证列中的值符合指定的条件。对于MySQL数据库,对check子句进行分析,但是忽略check子句。
关于check约束可以看一看这篇文章:
MySQL 8.0 新特性之检查约束(CHECK)

📑2. 表的设计

🌤️2.1 一对一

场景:
一个学生,只能有一个账号。一个账号,只能被一个学生持有。

设计表的做法:

  1. 创建一个表,同时包含学生和账号的信息
    student_account(studentId,name,accountName,password…);
  2. 创建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 联合查询

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

可以看出:

  1. 笛卡尔积的列数,就是两个表的列数之和
  2. 笛卡尔积的行数,就是两个表的行数之积

所谓的“多表联合查询”就是基于笛卡尔积这样的运算来展开的~~

进行多表查询的时候,通常会通过一定的条件把笛卡尔积中的“合法(你想要的)数据筛选出来”,这样的条件就称为“连接条件”

查询时的基本步骤:

  1. 明确要查询的信息来自于哪些表
  2. 针对这些表进行笛卡尔积(前提是确实能进行笛卡尔积)
  3. 指定连接条件,把有意义的数据筛选出来
  4. 根据需要,进一步指定条件,对数据进行筛选。(新加的条件往往通过and的方式,和连接条件放在一起)
  5. 进一步的针对查询的列,进行精简(减少列数,只保存必要的)。

💫4.2.1 内连接

select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件;
-- 或者
select 字段 from1 别名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


☁️结语

请给自己些耐心,不要急于求成。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

如有纰漏或错误,欢迎指正


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个不错的讲解做竞品分析的方法

比如选了竞品1,竞品2,然后每个功能项,选定1个做标准被比较的锚点,比如外观,用竞品2,设置为1分,然后看竞品1,在外观的评分上,相比竞品2,是分数低点还是高点&am…

java期末细节知识整理(一)

1.java程序的执行过程:先编译后解释。也就是我们在idea写的文件叫做java源文件(.java结尾的文件),经过编译器会生成字节码文件(.class结尾的文件),再通过解释器进行实现 2.栈用来存储引用类型的…

免费实现网站HTTPS访问

HTTPS(Hypertext Transfer Protocol Secure)是一种基于SSL协议的HTTP安全协议,旨在为客户端(浏览器)与服务器之间的通信提供加密通道,确保数据在传输过程中的保密性、完整性和身份验证。与传统的HTTP相比&a…

C语言-单精度和双精度浮点型

文章目录 一、遇到的问题二、解决方案三、问题根因float和double的区别: 总结-浮点数 一、遇到的问题 将NXP项目的代码移植到RH850F1K的项目上时,程序运行异常: u16Volt (uint16)((double)u16ADVal * (double)6.3) 执行到这一行程序就跑飞了…

HMI-Board上手指南

介绍 HMI-Board为 RT-Thread 联合瑞萨推出的高性价比图形评估套件,取代传统的 HMI主控板硬件,一套硬件即可实现 HMIIoT控制的全套能力。依托于瑞萨高性能芯片 RA6M3 及 RT-Thread 软件生态,HMI-Board 不仅硬件性能强劲,同时软件生…

C语言 指针——函数指针

目录 什么是函数指针? 函数指针的定义 定义函数指针时的常见错误 函数指针有什么用? 函数指针的主要应用 什么是函数指针? 函数指针 (Function Pointer) 就是指向函数的指针变量 数据类型 ( * 指针变量名 ) ( 形参列表 ); 例如&#x…

芋道系统,springboot+vue3+mysql实现地址的存储与显示

1.效果图 2.前端实现&#xff1a; <el-form-item label"地址" prop"entrepriseAddress"><el-cascaderv-model"formData.entrepriseAddress"size"large":options"region"/></el-form-item> //导入组件 im…

【vue】v-for只显示前几个数据,超出显示查看更多

v-for只显示前几个数据&#xff0c;超出显示查看更多 如图 <div v-for"(item,index) in list.slice(0,3)" :key"index"><div class"degreeNo" :class"index0?noOne:index1?noTwo:index2?noThree:"> NO{{index1}}:<…

【网关】工业智能网关-02

一 公司简介 保定飞凌嵌入式技术有限公司始于2006年&#xff0c;是一家专注嵌入式核心控制系统研发、设计和生产的高新技术企业&#xff0c;是国内最早专业从事嵌入式技术的企业之一。 经过十几年的发展与积累&#xff0c;公司拥有业内一流的软硬件研发团队&#xff0c;在北京…

【EFK日志系统】docker一键部署kibana、es-head

docker一键部署kibana、es-head kibana部署es-head部署 上一篇文章搭建了es集群 规划服务器是 es01:172.23.165.185 es02:172.23.165.186 es03:172.23.165.187 那么kibana就搭建在主节点es01:172.23.165.185 按照顺序参考&#xff1a; docker一键部署EFK系统&#xff08;elas…

【python】爬虫记录每小时金价

数据来源&#xff1a; https://www.cngold.org/img_date/ 因为这个网站是数据随时变动的&#xff0c;用requests、BeautifulSoup的方式解析html的话&#xff0c;数据的位置显示的是“--”&#xff0c;并不能取到数据。 所以采用webdriver访问网站&#xff0c;然后从界面上获取…

vscode怎么拷贝插件到另一台电脑

说明 vscode插件默认存放在 C:\Users\用户名\.vscode 目录下的 extensions 文件夹中 方法 拷贝 C:\Users\用户名\.vscode 目录下的 extensions 文件夹到另一台电脑的C:\Users\用户名\.vscode 目录下 C:\Users\用户名\.vscode

3. MySQL 数据表的基本操作

文章目录 【 1. MySQL 创建数据表 】【 2. MySQL 查看表 】2.1 DESCRIBE/DESC 以表格的形式展示表2.2 SHOW CREATE TABLE 以SQL语句的形式展示表 【 3. MySQL 修改数据表 】3.1 修改表名3.2 修改表字符集3.3 添加字段在末尾添加字段在开头添加字段在中间添加字段 3.3 修改/删除…

Java字符串String详解

Java中的String类作为存储和操作文本数据的基本类型&#xff0c;是开发过程中最常用的类型。 String类型的声明及初始化与基本数据类型非常相似&#xff1a; String name "lcy";但是String类型是引用类型&#xff0c;有着非常丰富的处理字符串的方法。正是因为其重…

LabVIEW远程开发与调试

在现代项目开发中&#xff0c;远程开发与调试已经成为一种常见的模式&#xff0c;特别是在使用LabVIEW进行工程项目时。本文将详细分析LabVIEW远程开发与调试的优缺点&#xff0c;并从多个角度说明如何建议客户采用这种方式&#xff0c;以提高项目效率和质量。 优点 灵活性和便…

全面理解渗透测试

揭秘网络安全的秘密武器&#xff1a;全面理解渗透测试 在数字化时代&#xff0c;网络安全已成为人们关注的焦点。网络攻击和数据泄露事件频发&#xff0c;给个人、企业和国家带来了巨大的损失。为了应对这一挑战&#xff0c;渗透测试作为一种重要的网络安全评估手段&#xff0…

Java之IO流

一、引言 &#xff08;1&#xff09;解释&#xff1a; i&#xff1a;input &#xff08;输入&#xff09; o&#xff1a;output &#xff08;输出&#xff09; &#xff08;2&#xff09;图解 注意&#xff1a; 1、Xxx 这个程序一旦在桌面关闭掉了&#xff0c;也就是运行完…

Apache安装教程

目录 一、Apache知识点 Apache服务简介 Apache下载网址 Apache的主要特点 二、Apache服务的搭建 1. 关闭防火墙 2. 安装依赖环境以及编译工具 3. 将apache安装包拖入xshell内 4. 解压压缩包 5. 进入httpd主包 6. 指定安装路径&#xff0c;启用字符集支持等 7. 优化执…

(2021,AFT,MHA,RWKV 基础,线性内存复杂度)无注意力的 Transformer

An Attention Free Transformer 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 多头注意力&#xff08;MHA&#xff09; 3. 方法 3.1 无注意力 Transformer 3.2 AFT 变体…

【python】OpenCV—Tracking(10.2)

文章目录 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三种背景分割器 K-Nearest&#xff1a;KNN Mixture of Gaussian&#xff08;MOG2&#xff09; Geometric Multigid&#xff08;GMG&#xff09; …