Mysql第四,五连弹

news2024/11/17 23:48:28

 第四弹

一、💛

主键约束(Primary key):

通过这个约束来指定某一个列作为主键(1.非空,2.不能重复) ,主键:一条数据,身份标识(类似于内存地址)

😄😄使用方法:想好某一列了,就在建立表的后面加上primary key

正如下图,他不可以插入值是空的值

 那么我们进行数据插入的时候怎么能保证数据不重复呢,一个一个记住或者一个一个尝试都过于麻烦,所以产生了“自增主键” 😈  😈  😈 

自增主键:往往是一个整数的ID,要求不可以重复,SQL优化客户端,在插入数据的时候,不主动指定主键的值,而是交给MySQL自行分配,确保分配成功

😄😄使用方法:在某一列的后面加上primary key auto_increment

insert into student values(null,'xx');

null是表示,他去自动安排一个不重复的。

当然了假如你想要自己去决定插入几号几号(主键),也是可以插入的,但是假如插入后,再用null让mysql给我们插入下一个会怎么样呢,看下图

他会接着你的 最大值插入,当然有人会说中间怎么办,这样不会有浪费吗,浪费就浪费呗,无所谓不用患得患失

 

 ❗️ ❗️ ❗️ 

最大值这个问题说一下:

假如是单个节点,没有什么问题。

但是如果mysql是分布式系统,(不同电脑硬件不同,会多台电脑配合使用就叫分布式系统)不同的电脑只记得自己电脑的mysql的最大值,所以这个时候有可能出现重复情况。

补充一下:电脑四大件:CPU,内存,硬盘,网络带宽(一个机器的容量有限,所以加主机数量,可以解决问题)

分布式解决这个问题有特殊方法:

(ID生成算法)可以解决这个问题,这个算法的目标就是保证每个ID唯一

分别由1.主机编号  2.时间戳(小概率同一时间毫秒)3.随即因子,这样由这三个决定的字符ID就可以保证分布式系统唯一性。

二、💙

外键约束

创建外部约束的时候分为父表和子表

注意:受外部约束的时候,也是子表改,父表不改

class为父表,student为子表,

create table student(studentId int primary key auto_increment,name varchar(20),classId int,foreign key (classId)  (他的意思是当前表的那一列受到约束)       references class(classId)class:表示起到约束作用的父表,classId起到约束作用的父表哪一列));

插入或者修改自表中受约束来的数据,就必须保证,插入/修改后的结果,必须要在父表中存在。  

如下图:我们在class里面序号是2,3,4,所以我们student表中不能存在父表中没有的比如1.(constraint:是约束的意思)

 注意⚠️

1.针对带有外键约束的插入或者修改,会自己触发查找,看父表有没有。

2.但约束也是双向的,删除或者修改父表中的记录,要看是否被子表使用了(假如使用了,不可以进行修改或者删除)

如下图

 3.父类的ID要+unique或者primary

(原因:索引!! 

我们在设置外键的时候就会导致操作子表中,频繁查父表,这一个操作,非常耗时间,为了加快查询速度,如果父亲表中(ID这一列就索引就会非常香,primary,unique自带索引),因此约定:没有索引,不能建立这样的外键

 

三、💜

逻辑删除:

考虑一个场景:建立电商平台    首先分为两块(商品表,订单表)

订单表中的商品要确保商品表中存在(适用于外部约束)

1.实现功能商品下架功能,之前买过某个东西,订单中存在数据,想再来一个,商品中却没有了,假如要删除之类的太麻烦,而且只是下架又不是永远不上了,删除到时候还要添加

所以设置商品表(id ,name,price,ok)(实现商品下架就用update把商品表的ok改成0,获取商品列表,就select的时候加一个条件,and ok=1。(ok=1是商品架子上有的)

这也叫逻辑删除(如同我们之前的线性表,删除是size--,而不是释放空间,很常用) 

💤💤💤

下面这个不咋重要,看着玩

check:

某一列要遵守一个具体的表达式,当前的记录符合条件,就是可以插入修改,不符合就会失败,但是mysql5不支持check。

表的设计(设计,依赖一定的经验)。  

实体和关系,设计表的时候需要搞清楚

实体->对象从需求场景,提炼出一些关键性质名词(关系是实体和实体之间关联关系)

关系大体分为四种:

1.一对一:教务系统,一个学生一个号,一个号归一个学生有

分成三种写法:

(1).student (id,name,classId)

      account(accountId,userName,studentId);

(2).student(id,name,accountId)

      account(accountId,userName)

(3).student(id,name,age,username,accountId)    这个是合成一个表混一起弄

2.一对多:一个同学,只存在一个班级中,一个班级可包含多个同学

(1).student(studentId ,name)

      class(classId,className,students)          (students这里面包含多个学生ID)

⚠️⚠️⚠️这么写(mysql)并不推荐,mysql这种类型,不提供“数组”此处要是这么做要按一定的格式,把多个studentId拼成一个字符串,这个过程繁琐且低效。但有些数据库比如(redis)支持数组这样的类型。

(2).class(classId,className)         

      student(studentId,name,classId)           (换成学生在班级,而不是班级有学生)

3.多对多:一个学生多门课,多门课多个学生(查找成绩)。

(1).course(id,name)

     student(id,name)

此时我们需要生成一个关联表

student_course(studentId,courseId)(1号学生选择的语文数学,成绩,这里也就是简写,更具体就自己添加)

4.无关系:没用

上述的1,2,3关系要了解每种关系,表的设计情况(固定套路,很常见,如同(出炮上马一样)

四、 ❤️

新增(把insert和select合并到一起)

把select 查询出来的结果数据,插入另一表中

就是正常插入后面去掉values换成select*表;

如:我么能看见,插入是给student插入的,但是studnet2却也有了student的插入

五、💚

聚合查询:

(查询的时候带表达式是列与列之间的计算,但是假如说行与行就有些无能为力,所以这里出现了聚合查询)

聚合函数

count():查询有多少行数据           

使用方法:select count(*)from student   

⚠️⚠️注意:*和我们正常的列得出的结果不同 ,*的话NULL也算行,但是列的话不算NULL

!!!其次count和(*)之间不可以有空格,大部分的编程语言空格无所谓,但是python,CSS,SQL有奇怪要求

sum():返回数据总和)

把这一行的数据按照double累加,(尝试先把数据转化为double)

当然也有转化不成的情况,但是他不会报错,会报警告

这个操作是来查看警告的:show warnings 

avg():返回查询数据的平均值

max():返回查询数据的最大值

min():返回查询数据的最小值


第五弹 

一、💓

数据库的设计

要以敏捷和迭代-需求一直在变

实际的敏捷开发,需要持续集成

持续集成,就是保证新开发的功能点能快速稳定的合并到已有的功能中

1.代码能快速合并进去

2.快速的测试(自动化测试=已有的功能+新的功能)

3.快速发布

这三部就是国内有名的模式——小步快跑

二、 💕

分组查询:有时候要把数据分成多组,进行运算

分组查询中,select 指定的是列,必须是group by 指定的列,如果select中想用到其他的列,其他列必须放到聚合函数中,否则直接写没有什么意义 

分组查询,也可以搭配条件使用

1.分组之前:where :

对比来看where是先去掉了讲师中的一个10086

2.分组之后:having(先是给他搞平均薪资,然后减去这个最大的,这个老板的平均薪资)

 3.一个SQL可以包含分组前和分组后的语句

下面的语句:先是不等于张三,再是按照role分组,在select role 最后是having<20000

实际上我们确实会使用一些复杂的SQL,但是我们平时最好不要写复杂的SQL,这个可读性太差了

 三、💘

连表查询

笛卡尔积:描述了多个表查询的基本执行逻辑(那么什么叫笛卡尔积呢?)

任何两张表都可以用笛卡尔积,但是两个表假如没有关系,计算出来也没有意义。

笛卡尔积像是两个表的乘积,

 我们通过上面两张图来看下图,可以观察到有很多不正确的数据,这时候就需要我们找条件去筛选哪些数据是正确的

​​​​​​​

⚠️⚠️缺点:笛卡尔积比较低效(多表联合查询就很低效),尤其是数据较多的情况下,所以使用它也需要注意,容易把数据库干停机咯。很多慢的sql都是使用这些联表查询。

笛卡尔积的用途

笛卡尔积的用途:

建立四个表

class(id,name,desc(留作备用的串用来匹配)

id :用于存储班级的唯一标识符,设置为主键,并使用  auto_increment  自增。
 name :用于存储班级的名称,设为  varchar  数据类型,最大长度为 20。
 desc :用于存储班级的描述,设为  varchar  数据类型,最大长度为 100。

需要注意的是, desc  是 SQL 保留字,表示降序排序的关键字,因此需要将其用反引号  `  包裹起来,以作为列名使用。)

student(ID,sn(备用),name qq_mail,class_id)

 id :用于存储学生的唯一标识符,设置为主键,并使用  auto_increment  自增。
 sn :用于存储学生的学号,设为  varchar  数据类型,最大长度为 20。
 name :用于存储学生的姓名,设为  varchar  数据类型,最大长度为 20。
 qq_mail :用于存储学生的 QQ 邮箱,设为  varchar  数据类型,最大长度为 20。
 class_Id :用于存储学生所属的班级的标识符。

需要注意的是, class_Id  列作为外键关联到某个班级表上。如果你要设置外键关系,需要先创建班级表,然后在创建学生表时使用  foreign key  语句来关联到班级表的相应列上。

下面这两个就字面意思不用解释。

coursed(id,name);

score (score ,student_id,class_id);

 

改一下哈 

四张表

假如说要查询漩涡鸣人同学的成绩

首先许仙来自:student

成绩来自:score。需要联合查询,

(1).先用笛卡尔积

(2).过滤不正确的结果,指定连接条件进行筛选。

(3).只关注鸣人,进一步筛选

(4).只关注特定的行和列,进行精简处理

假如查询所有同学的成绩,及个人信息,列出同学的名字,课程名字,分数来组织

同学:student

课程名字:course

分数:score

(1).三个表先笛卡尔积(遇事不决,笛卡尔积)

(2).指定条件 

想清楚一件事哈:执行笛卡尔积电脑上其实很快的,但是显示半天才结束,是因为慢在显示,这个是控制台打印的锅。

​​​​​​​ 

(3)具体罗列条件,如下图

当然我们针对一些东西,可以起别名

select student name as studentName cour.name as courseName,score.score from student,score,course where···(简写,就是回顾一下,了解这个,怎么起别名就好)

上面的是内连接的方法1

下面是内连接的方法2:大同小异  多了个inner(可以省略,了解就好),join    前面多个表,分割现在用join(相当于逗号)分割,只写join不写on是完整的笛卡尔积,on表示连接条件⚠️⚠️⚠️join是在连接表的时候,前面还是要用逗号,join只是在连接表的时候相当于逗号。

四、💖 

外连接

使用的是​​​​​​​   (查询任意操作)表  left/right join 表

student(id,name)

score(studentId ,score)

假如此时左侧表中每一条有记录,都可在右侧有对应,则内外连接没有区别,但是一旦两个表对不上,内外连接就会有所不同

正如我上面的许仙之类的,在score中没有他。

内连接的结果一定是两个表中都存在的数据(公共部分):如下图

 左外连接,以左侧表为主,右侧表的每个记录,都会存在最终结果里,如果左侧表存在,右侧表不存在的数据,就会把对应的列填成空值

右外连接,以右侧表为主,左侧表的每个记录,都会存在最终结果里,如果右侧表存在,左侧表不存在的数据,就会把对应的列填成空值

全外连接(outer join)-(mysql不支持,但是oracle支持) 

我们在平时,尽量不写复杂的SQL,否则把SQL拆出来优化,本身是一件非常复杂的事情,只可以彻底重构。

​​​​​​​

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫Scrapy(二)_入门案例

入门案例 学习目标 创建一个Scrapy项目定义提取的结构化数据(Item)编写爬取网站的Spider并提取出结构化数据(Item)编写Item Pipelines来存储提取到的Item(即结构化数据) 一、新建项目(scrapy startproject) 在开始爬取之前&#xff0c;必须创建一个新的Scrapy项目。进入自定…

计算机毕设 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

文章目录 0 前言1.前言2.实现效果3.相关技术原理3.1卷积神经网络3.1YOLOV5简介3.2 YOLOv5s 模型算法流程和原理4.数据集处理3.1 数据标注简介3.2 数据保存 5.模型训练 6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题…

[Round#14 Illuminate with your bril]

周末NSS的PWN专题&#xff0c;只作了3个&#xff0c;结束后跟NSS的师傅聊&#xff0c;对方确认了第4题的作法&#xff0c;重作成功。第5题看师傅的WP复现成功。 love 主函数给了个printf&#xff0c;这里可以得到所有地址&#xff0c;并且要求把v4,v5改相等 int __cdecl mai…

Linux 版本的 Abyss Locker 勒索软件针对 VMware ESXi 服务器

Abyss Locker 是最新开发的 Linux 加密器&#xff0c;旨在针对 VMware 的 ESXi 虚拟机平台对企业进行攻击。 随着企业从单个服务器转向虚拟机以实现更好的资源管理、性能和灾难恢复&#xff0c;勒索软件团伙创建了专注于针对该平台的加密器。 随着 VMware ESXi 成为最流行的虚…

UE5 摄像机与NPC重叠阻挡导致视角闪现的解决方法

文章目录 前言问题背景问题剖析摄像机碰撞分析解决方法总结前言 本文基于虚幻5.2.1版本,对摄像机与NPC重叠阻挡导致视角闪现提供一个解决方案,并深入讲解摄像机碰撞原理,提升大家的思维与解决问题的能力。 问题背景 当我们被NPC攻击或者NPC介于摄像机与玩家之间导致摄像机…

小研究 - JVM GC 对 IMS HSS 延迟分析(二)

用户归属服务器&#xff08;IMS HSS&#xff09;是下一代通信网&#xff08;NGN&#xff09;核心网络 IP 多媒体子系统&#xff08;IMS&#xff09;中的主要用户数据库。IMS HSS 中存储用户的配置文件&#xff0c;可执行用户的身份验证和授权&#xff0c;并提供对呼叫控制服务器…

微服务入门---Docker

微服务入门---Docker 1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker 2.…

Flutter环境搭建踩坑集锦

Flutter 背景准备工作先检查一下自己的电脑&#xff0c;看一下是不是满足配置要求下载安装配置环境下载安装JDK下载安装Android studio下载Flutterflutter doctor故障Android license status unknownNetwork resources 故障 后记 背景 发现一个不错的框架Flutter&#xff0c;听…

web题型

0X01 命令执行 漏洞原理 没有对用户输入的内容进行一定过滤直接传给shell_exec、system一类函数执行 看一个具体例子 cmd1|cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1;cmd2:无论cmd1是否执行成功&#xff0c;cmd2将被执行 cmd1&cmd2:无论cmd1是否执行成…

【C++继承】

目录 一、继承的概念及定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承方式与访问限定符的组合 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承八、虚拟继承的原理 一、继承…

(AcWing)满足条件的01序列

给定 n 个 0 和 n 个 1&#xff0c;它们将按照某种顺序排成长度为 2n 的序列&#xff0c;求它们能排列成的所有序列中&#xff0c;能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。 输出的答案对 10^97 取模。 输入格式 共一行&#xff0c;包含整数 n。 …

Kotlin基础(十):函数进阶

前言 本文主要讲解kotlin函数&#xff0c;之前系列文章中提到过函数&#xff0c;本文是kotlin函数的进阶内容。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 函数基本用法 Kotlin 是一种现代的静态类型编程语言&#xff0c;它在函数的定义和使用上有一些特点…

软考A计划-系统集成项目管理工程师-项目干系人管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

简单易用的批量重命名工具,C++语言编写

它具备出色的文件重命名功能,能够让用户轻松对多个文件进行批量重命名操作。不论是添加前缀、后缀,还是替换文件名称中的特定字符,都能轻松完成。此外,该软件体积小巧、操作简单便捷,使用起来的效果出奇好。 MiniRenamer特色功能: 正则命名:支持正则命名规则,并可自定义…

【机器学习】Classification using Logistic Regression

Classification using Logistic Regression 1. 分类问题2. 线性回归方法3. 逻辑函数&#xff08;sigmod&#xff09;4.逻辑回归5. 决策边界5.1 数据集5.2 数据绘图5.3 逻辑回归与决策边界的刷新5.4 绘制决策边界 导入所需的库 import numpy as np %matplotlib widget import m…

【Linux】进程的认识

查看进程指令proc/ps/top 注意哦, 我们经常使用的指令, 像ls, touch…这些指令在启动之后本质上也是进程 proc 是内存文件系统, 存放着当前系统的实时进程信息. 每一个进程在系统中, 都会存在一个唯一的标识符(pid -> process id), 就如同学生在学校里有一个专门的学号一样…

Mac笔记本安装maven

Mac笔记本安装maven 一、通过brew安装maven 如果你的mac笔记本安装了homebrew可以使用如下命令安装 brew install maven安装完成后可以使用命令brew list maven来查看maven的安装位置 $ brew list maven /usr/local/Cellar/maven/3.6.3_1/bin/mvn /usr/local/Cellar/mave…

从零开始学Docker(三):DockerFile镜像定制

宿主机环境&#xff1a;RockyLinux 9 前言&#xff0c;定制docker镜像的方式有两种&#xff1a; 手动修改容器内容&#xff0c;然后docker commit提交容器为新的镜像通过在dockerfile中定义一系列的命令和参数构成的脚本&#xff0c;然后这些命令应用于基础镜像&#xff0c;依…

leetcode 面试题 0106.字符串压缩

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;面试题 0106.字符串压缩 思路&#xff1a; 开辟一个新的空间&#xff08;空间要大一点&#xff0c;因为可能压缩后的字符串比原字符串大&#xff09;&#xff0c;然后遍历原字符串统计当前字符的个数&#xff0c;再写入到…

使用vmd渲染并保存指定分辨率的图片

准备TCL脚本文件 # 设置渲染分辨率为1920x1080,600dpi render TachyonInternal out.tga width 1920 height 1080 dpi 600# 启用抗锯齿选项 display antialias on运行TCL 输入&#xff1a; source render.tcl使用Photoshop打开输出的out.tga文件并保存常用图片格式