MySQL表的增删改查(进阶)

news2025/7/8 22:01:41

目录

  • 1.数据库约束
    • 1.1约束类型
    • 1.2 NULL约束
    • 1.3 UNIQUE:唯一约束
    • 1.4 PRIMARY KEY: 主键约束
    • 1.5 DEFAULT:默认值约束
    • 1.6 FOREIGN KEY:外键约束
  • 2. 表的设计
  • 3. 新增
  • 4. 查询
    • 4.1 聚合查询
      • 4.1.2 GROUP BY子句
    • 4.2 联合查询
      • 4.2.1内连接
      • 4.2.2外连接
      • 4.2.3自连接
      • 4.2.4子查询
      • 4.2.5合并查询

1.数据库约束

关系型数据库一个重要的功能,需要保证数据的完整性。约束,就是让数据库帮助我们更好的检查数据是否正确。

1.1约束类型

  • NOT NULL - 指定某列不能存储NULL值
  • UNIQUE - 保证某列的每行必须有唯一的值
  • DEFAULT - 规定没有给列赋值时的默认值
  • PRIMARY KEY - NOT NULL和UNIQUE的组合。确保某列(或两个列或多个列的结合)有唯一标识,有助于更容易更快速的找到表中的一个特定的记录。
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性
  • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库而言,对CHECK子句进行分析,但是忽略CHECK子句。

主键是每条记录的身份标识

外键是多个表的关联关系,要求某个记录必须在另一个表里存在

CHECK显式通过条件来描述字段的取值,(MySQL不支持CHECK)

1.2 NULL约束

在这里插入图片描述

1.3 UNIQUE:唯一约束

在这里插入图片描述

entry 这个之前学过for循环遍历Map用到entrySet

entry的意思有入口,条目。

此处entry的意思是条目

数据库怎么判断当前这条数据是重复的?

先查找再插入。

约束是可以组合一起使用。

1.4 PRIMARY KEY: 主键约束

在这里插入图片描述
在这里插入图片描述

主键也是再插入记录的时候先查询再插入。正因为unique和primary key都有先查询的过程,mysql会默认给unique和primary key这样的列自动添加索引,来提高查询速度。

  • 在实际开发中,大部份表都有一个主键,是一个整数表示的id.
  • 在mysql中,一个表里只能有一个主键。
  • mysql允许把多个列放到一起共同作为一个主键(联合主键)。
  • 使用mysql自带的"自增主键"作为主键的值。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

mysql的数据量比较小,所有的数据都在一个mysql服务器上,自增主键可以正常使用。

如果mysql的数据量很大,一台主机放不下,就需要分库分表,使用多个主机来进行存储,让每个服务器只存一部分数据。

image-20221108114255467

在这个场景下,如果再新插入一个数据,这个数据就会落在3个服务器之一。

新的这个数据的主键id如何分配?能否继续使用mysql自带的自增主键?

  • 这个问题涉及到"分布式系统中唯一id生成算法"。

  • 实现公式:时间戳+主机编号+随机因子

1.5 DEFAULT:默认值约束

image-20221108115351420

1.6 FOREIGN KEY:外键约束

外键约束,针对两个表之间的约束。

image-20221108121658589

image-20221108121713909

为了让mysql自动的帮我们完成检查工作,引入了"外键"约束。

image-20221108135239574

image-20221108140951412

插入和修改操作都外键约束。

image-20221108141749677

只能先删除子表,再删除父表。

image-20221108142721716

要想创建外键,就要求父表对应的列有primary key 或 unique 约束。primary key和unique都能创建索引。

考虑一个场景:电商。

假设有一个商品表和一个订单表。

goods(id , name , unitprice);

​ 1 T恤 100

​ 2 鞋 200

order(orderId , goodsId , time);

​ 1 1 2022-11-07

订单表里的goodsId必须在goods表里的id里存在。(外键约束)

问:如果想要下架商品T恤,应该怎么操作?

因为外键,所以不能删父表里的T恤这一行的数据。订单表里的下单记录也不能删。

要想对商品下架并不是删除记录。 而是新增一个"是否下架"的属性,下架了设成"是"。这样做可以避免触发"外键约束"的限制。这里是"逻辑删除"。

2. 表的设计

设计表/数据库基本思路:

  1. 先明确实体;
  2. 再明确实体之间的关系;
  3. 根据上述内容,套入相应的"公式"中

实体:需求中的关键名词

关系:没有关系/一对一/一对多/多对多

一对一关系:

比如教务系统中学生和账号:

1.学生和账号在同一个表里

student_account(id , name , username , password);

2.学生和账号在不同表里

student(studentId , name);

account(accountId , username , password , studentId);

或者:

student(studentId, name,accountId);

account(accountId , username , password);

一对多:

一个学生只在一个班级里,而一个班级里有多个学生。

1.student(id , name);

​ class(classId , name , studentIds);

//在MySQL中不可行,因为MySQL中没有一个像数组这样的类型。

2.student(id , name , classId);

​ class(classId , name);

多对多:

一个学生可以选修多门课程,一门课程可以被多名学生选择。

image-20221108152149616

3. 新增

  • 把查询的结果插入到另一个表中

    image-20221108154055850

    要求student表的列数和列的类型要和student2匹配

4. 查询

4.1 聚合查询

行和行之间运算

聚合函数(SQL内置的函数):

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义
  • count

image-20221108155928224

image-20221108160059665

image-20221108160125207

在C和Java中一个函数和()之间是可以有空格的

  • sum

    把这一列中所有行进行求和,要求这个列必须是数字。

    image-20221108160902163

NULL和任何数据运算,结果都是NULL , sum这里是做了一个特殊处理,把为NULL的忽略了。

求和/平均值/最大/最小 这几个操作都是针对数字类型的列进行的。

image-20221115101746660

  • avg

image-20221115101815202

mysql命名风格

1.驼峰命名(Java/JS): ExamResult examResult

2.蛇形命名(C/C++/Python): exam_result

3.脊柱命名: exam-result

4.匈牙利命名(给比变量名前加个前缀表示类型): iNum sName dScore

  • max
  • min
select max(chinese) ,min(chinese) from exam_result;

4.1.2 GROUP BY子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询

image-20221115101841107

如果是不带聚合函数的普通查询,能否group by?

image-20221110164914372

得到每个组的第一条记录。

(mysql如果没有order by 那么结果里顺序是不可预期的)

image-20221110165337887

分组查询也可以指定条件

  1. 分组之前指定条件,先筛选再分组,where

image-20221115102010234

2.分组之前指定条件, 先分组再筛选,having

image-20221115102030705

image-20221110190224629

3.分组之前和之后都指定条件

image-20221110191533824

4.2 联合查询

4.2.1内连接

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

img

笛卡尔积就是把这两张表放在一起计算

image-20221115102056836

得到一张更大的表,列数是两张表的列数之和,行数是两张表行数之积。

发现结果中很多数据是无效的。需要把无效数据去掉。

image-20221115102110761

image-20221115102132301

指定列查询去掉多的一个classId列

image-20221115102147313

image-20221110200207925

如何进行联合查询?

1.先计算笛卡尔积

select * from student,score;

2.引入连接条件

select * from student,score where student.id=score.student_id;

3.再根据需求加入必要的条件

 select * from student,score where student.id=score.student_id and student.name='许仙';

4.把不必要的列去掉,保留需要的列

select student.name,score.score from student,score where student.id=score.student_id and student.name='许仙';

image-20221110201445654

联合查询还可以通过join来完成

image-20221114172020233

from多个表只能实现内连接。join on既可以实现内连接,也能实现外连接。

(2)查询所有同学的总成绩,及同学的个人信息

步骤:

1.算笛卡尔积

2.连接条件

3.分组,聚合查询,筛选列

image-20221114172825961
(3)查询所有同学的成绩及个人信息

期望查询结果中有姓名,课程名称,分数

步骤:

1)3张表进行笛卡尔积

select * from student , course , score;

image-20221115150432019

(问题:这个查询结果出来很慢,原因是?答:不是服务器查询速度慢,也不是打印慢,而是windows的终端程序cmd导致的)

2)连接条件

select * from student, course,score where student.id= score.student_id and course.id= score.course_id;

image-20221115151458683

image-20221115151519565

3)对列进行精简

image-20221115151927626

join on 也能实现对3张表的查询

image-20221115152741064

4.2.2外连接

内连接和外连接大多数情况下没有区别。(如果要连接的两张表的内容是一一对应的就没区别,如果不是一一对应的就有区别)

image-20221115160520729

image-20221115160543400

image-20221115160603911

image-20221115161003819

如果使用外连接,结果就不一样,join前面+left/right.

left join 左外连接

right join右外连接

image-20221115161740101

4.2.3自连接

自己和自己进行笛卡尔积

自连接的效果是把行转成列。

  • SQL中无法对行和行之间进行条件比较。

问:显示所有“计算机原理”成绩比“Java”成绩高的成绩,姓名。

image-20221115163951160

image-20221115164346406

起别名不仅可以针对列,还可以对表起别名。

起别名时as可以省略,但是不建议

此处是要求每个学生自己的两门课程成绩之间进行比较,所有连接条件是student_id。保证每行记录所有列都是针对同一个学生描述的。

让左边是计算机原理,右边显示Java。

image-20221115193828551

然后把计算机原理>Java的筛选出来。

image-20221115193929565

4.2.4子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

(子查询可能会造成代码可读性低和代码执行效率低)

  • 单行子查询

问:查询与“不想毕业” 同学的同班同学

步骤:

1.查询“不想毕业” 同学的班级id

2.查询这个班级id的其他同学

image-20221115195619069

image-20221115200036424

  • 多行子查询

    in 关键字

    返回多行记录的子查询

    问:查询"语文"或"英文"的成绩信息

    步骤:
    1.先根据课程名称查询课程id

    2.再根据课程id查询课程成绩

    image-20221115203352849

    image-20221115203752616

exists 关键字

可读性差,代码执行效率也低于in

4.2.5合并查询

关键字:union , union all

把两个查询的结果集合并成一个

(要求这两个结果集的列一致)

问:查询id小于3,或者名字为“英文”的课程

image-20221115205644355

问:union和or的区别:

答:or要求查询结果只能来自同一个表。union查询结果可以来自不同的表,只要列匹配即可。

union 是会进行去重,重复的行只保留一份。union all不去重。

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

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

相关文章

2022 第十四届蓝桥杯模拟赛第一期(题解与标程)

第十四届蓝桥杯模拟赛第一期1. 二进制位数问题描述答案提交参考答案2. 晨跑问题描述答案提交参考答案3. 调和级数问题描述答案提交参考答案程序验证4. 山谷问题描述答案提交参考答案5. 最小矩阵问题描述答案提交参考答案6. 核酸日期问题描述输入格式输出格式样例输入样例输出评…

项目风险管理的5大关键点,你做了几点?

1、全方位科学分析项目风险 为了提高项目抗风险能力,我们需要对项目风险进行科学全面的分析。一般我们从3个维度对风险进行科学分析:影响的严重性、发生的可能性、产生的影响性。 根据风险或机会对项目的影响程度,一般我们会从三个维度将其划…

javascript大作业《web课程设计》用html做一个期末作业网站,梅西足球体育网页,css

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

STING 与 cGAS的结合导致TBK1 激酶募集和活化

来自细菌或病毒的核酸在受感染的细胞中会产生强效的免疫反应,而病原体衍生核酸的检测是宿主感知感染并启动保护性免疫反应的核心策略。cGAS (Cyclic GMP-AMP synthase) 是一种双链 DNA 传感器,可催化 cGAMP(cyclic GMP-AMP)的合成…

二级导航栏

简介&#xff1a;本文通过HTML与CSS相集合的方式&#xff0c;来实现二级导航菜单。 HTML构建骨架 <body><ul class"nav1"><li>水果<ul class"nav2"><li>苹果</li><li>香梨</li><li>火龙果</li…

前端CSS射门动画-为梅西最后一届世界杯加油

☆ 距离2022卡塔尔世界杯只有6天时间了&#xff0c;众多球星我喜欢梅西和奥乔亚。 ☆ 我们不能到现场去&#xff0c;只能手中的代码自娱自乐一下&#xff0c;就当为梅西加油了。这是梅西最后一届世界杯了。 梅西给我的感觉&#xff0c;踢球足够利落干净&#xff0c;你不会从他的…

AI遮天传 ML/DL-感知机

感知机的出现是人工智能发展史一大重要里程碑&#xff0c;其后才诞生了&#xff1a;多层感知机、卷积神经网络等一系列的经典网络模型。 在我看来&#xff0c;它虽然是深度学习领域的一大开端&#xff0c;但本身解决的只是线性二分类问题&#xff0c;它本身与机器学习经典模型线…

RORγ 反向激动剂-XY101 小分子化合物

早在 2016 年&#xff0c;中国科学院广州生物医药与健康研究院许永教授团队就曾与加州大学戴维斯分校的陈宏武教授合作&#xff0c;首次发现核激素受体 RORγ 是作用于雄激素受体 AR 上游的关键驱动因子&#xff0c;直接调控雄激素受体 AR 的表达。因此&#xff0c;RORγ 成为前…

gitlab+jenkins+harbor次完整CI链条

用一台机器搭harbor 先安装docker工具&#xff0c;因为装harbor需要docker [rootharbor ~]# cd /etc/yum.repos.d [rootharbor yum.repos.d]# wget https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo [rootharbor yum.repos.d]# sed -i s#download.docke…

HTML做一个个人博客页面(纯html代码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【网页设计】期末大作业html+css (个人生活记录介绍网站)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

CNC程序管理NC文件版本管理CNC程序生命周期管理NC程序版本管理

CNC程序管理NC文件版本管理CNC程序生命周期管理NC程序版本管理 ROZRZ 数控程序文档流程管理系统能够实现 NC 数控程序文档及流程的管理&#xff0c;且为企业日后能够进行整体生产资料信息的综合管理做好了在程序代码方面的数据准备&#xff0c;提供了更为方便、快捷、安全的系…

Java——后端开发经验总结(持续更新中)

目录 一、判断实体类 二、图片无法正常显示 三、图片路径存储问题 四、xml注释 五、常用快捷键使用 每日三问 重要配置 一、判断实体类 Assert.notNull&#xff1a; 断言某个值是否为空 优点&#xff1a;告别了if判断为空。缺点&#xff1a;场景比较单一&#xff0c;基本…

【JavaSE】继承那些事儿

目录 1. 继承 1.1 为什么要有继承 1.2 何为继承 1.3 继承的语法 1.4 父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super 关键字 1.5.1 super 关键字能让子类访问父类同名成员变量及方法 1.5.2 super 关键字在子类构造方法所起的作用 1…

STC51单片机21——EEPROM测试

STC89C51RC系列单片机内部EEPROM详细地址表&#xff1a; 第一扇区 第二扇区 第三扇区 第四扇区 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 起始地址 结束地址 2000h 21FFh 22…

node.js的pat/fs/events模块以及磁盘遍历的实现

path模块: 概述: path模块是一个内置模块,他里面内置的相关方法来造作的路径地址 导入path模块: const path require(path) 使用方法: //导入对应的path模块 const pathrequire(path) //相关方法 //1.join方法是将多个相关的地址连接成一个地址 (做路径拼接) let pathStrpath…

2022年下半年系统架构设计师下午真题及答案解析

试题一(25分) 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;业务也相对…

2022年数维杯国际大学生数学建模挑战赛开赛公告

各参赛队伍&#xff1a; 为了保证2022年数维杯国际大学生数学建模挑战赛参赛队伍顺利参赛&#xff0c;现将竞赛开赛的相关事项通知如下&#xff1a; 一、时间节点 报名截止时间&#xff1a;北京时间2022年11月17日06:00&#xff08;周四&#xff09; 竞赛开始时间&#xff…

大半夜排查bug:竟然是同事把Redis用成这鬼样子,坑了我

首先说下问题现象&#xff1a;内网sandbox环境API持续1周出现应用卡死&#xff0c;所有api无响应现象。 刚开始当测试抱怨环境响应慢的时候 &#xff0c;我们重启一下应用&#xff0c;应用恢复正常&#xff0c;于是没做处理。但是后来问题出现频率越来越频繁&#xff0c;越来越…

VSCode常用插件

目录1. 简体中文2. git3. 项目文件夹管理4. 文件图标主题5. markdown6. 主题7. Rest API 客户端1. 简体中文 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 2. git GitLens — Git supercharged 3. 项目文件夹管理 Project Manager&#xff0c;帮助…