数据库增删改查(CRUD)进阶版

news2024/12/26 21:54:01

目录

数据库约束

约束类型

表的设计

1.一对一

2.一对多

3.多对多

增删查改进阶操作

1. 插入查询结果

2.查询

聚合查询

聚合函数

group by

having

联合查询

内连接

外连接

自连接

子查询

合并查询


数据库约束

创建表的时候制定的一些规则,在后续插入/删除/查询/修改都要遵循这个规则。

可以帮助校验数据,让数据正确性得到保证

约束类型

not null:

unique:

插入张三的数据后还能再插入张三的数据,在某些情况下是不允许的

加上unique就可以避免重复插入

 

default:

默认情况下默认值是null,对于指定列插入时,其他未被插入数据的列就会被设置为默认值

primary key:

主键,相当于给某列数据赋一个身份证号

注意:一个表只能有一个主键

主键不允许重复,那当我插入了很多个数据之后,想插入一个新数据,怎么保证它能不重复呢

MySQL为我们提供了一种机制:自增主键

这样的自增有什么用呢?

我们在插入id的时候可以设置成null,数据库可以帮我们自动转成1插入,后面再插入名字就依次递增(当然,自增的前提是这个数据类型是整型)

如果程序员手动指定了id插入数据,在下一次用null插入时会继续上一个id进行自增

而且这里的自增是不会重复利用之前的值的,当我们把id = 100和id = 101的行删掉之后,下一次插入id依旧在101的基础上自增到102

foreign key:

描述两个表之间的关系

 

从上面两张表我们发现王五同学不在班级表钟存在,所以这是一个不太科学的数据。如果希望学生表中的classId都要在班级表里面存在,就可以用外键约束来校验

前面的约束都是在定义表的时候,哪一列需要约束,就创建到哪一列的后面;

外键约束是写到最后的,把所有的列定义之后在最后面通过foreign key创建外键约束

这种情况下可以认为班级表约束了学生表,此时班级表被称为父表,而学生表被称为子表

1. 如果父表是空的,那么子表的插入操作会被认为错误

2. 通过外键约束之后,刚刚王五同学classId = 100 会被认为错误,无法插入 

3. 受外键约束后,不仅插入不科学数据不行,错误修改也不被允许

4. 不仅父表约束子表,子表也在约束父表

当我们想删除父表的一行数据的时候,如果子表有父表对应的数据就可能出现问题

5. 创建表时要给需要被引用的列后面加上索引,常见的方式就是加上主键,有了主键就会自动创建处索引


表的设计

根据需求,把需要的表设计出来的过程

(1)先根据需求,找到实体

(2)梳理清楚实体之间的关系

1.一对一

图书馆借阅系统,需要表示(概念)学生实体和账户,就要搞学生表和账户表来描述这些实体

一个学生可以有一个账户(学生不能注册小号,相当于游戏里防止你开小号炸鱼是一样的)

一个账户,也只能给一个学生使用(相当于游戏里禁止你代练一样)

这种关系就是1对1

方案1:两个表搞成一个表,学生账户表(accountId, accountName, password, ...)

方案2:分两个表,使用id建立练习

student(studentId, studentName,..., accountId)

account(accountId,username, password, ...)

2.一对多

一个班级可以包含多个学生,但一个学生只能从属于一个班级。这种关系就是1对多

方案1(不支持):

student(studentId, name,... )

class(classId, name, studentList)

因为MySQL不支持数组类型,所以方案1不支持

方案2:

class(classId, name)

student(studentId, name, classId)

3.多对多

一个学生,可以选择多门课程

一个课程,也可以被多个学生选择

student(studentId, name...)

course(courseId, name...)   

student-course(studentId, courseId)


增删查改进阶操作

1. 插入查询结果

insert into 表名 select * from 表2名

注意这里student查询出来的结果结合,列数/类型要和student2表结构匹配


2.查询

聚合查询

查询带表达式:只能拿着某几个来查询

聚合查询:进行“和行”之间的运算,但是只能通过聚合函数来操作

聚合函数

我们客户端里面出现的这个行数不是由聚合函数得来的,如果是编程操作还是得使用聚合操作比较方便,因为聚合函数可以进行一些条件的判断

count操作

上面这个操作先执行select * from student2,再用count进行计数

⚠使用count(*)与使用count(列名)大部分情况没啥区别

⚠使用count(*)的时候即使全是null的行也会记录下来

sum操作

我们试试看sum(name)会怎么样

会报警告:代码有问题但是不影响程序能跑

sql很多时候会把字符串转成数字来进行算术运算,但是上面这些名字sql转不了数字

其他的聚合函数例子

使用聚合函数的时候,列和列之间的顺序已经被打散了,所以大部分情况聚合的列和非聚合的列不能在一起使用,除非下面的操作

group by

把所有的行分成若干组,每个组分别进行聚合

这里的role就是没有使用聚合函数的列 

having

分组之前的条件使用where

现在统计每个岗位的平均薪资,但是刨除“李四”

这种情况属于先刨除再分组

分组之后的条件使用having

统计每个岗位的平均薪资,抛出平均薪资>20000的情况(这个时候就一定得先分组计算平均薪资后,才能按条件刨除)


联合查询

多张有关系的表一块查询,核心是笛卡尔积的计算方法

笛卡尔积得到的是一张更大的表

该表的列数是之前两张表列数之和

该表的行数是之前两张表行数之积

如果是三张或者以上的,就得两两进行笛卡尔积

这样制造出笛卡尔积之后就方便我们比较哪个同学属于哪个班

但是怎么筛选出正确的数据呢?

这里的"."可以理解成“的”,where带的条件称为连接条件

一般多表联合查询的步骤:

(1)笛卡尔积

(2)指定连接条件

(3)指定其他条件

(4)针对列进行精简/表达式运算/聚合查询


内连接

现在有下面的四张表

学生表

 

班级表

 

课程表

分数表

(1)查询许仙同学成绩

先笛卡尔积,把学生表和分数表联合起来

发现足足有160行

接着指定连接条件,精简结果

再根据需求(找许仙同学)指定其他条件

最后针对上面的列进行精简

另一种联合方法

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;

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

省略步骤了直接跳到最后一步

(3)查询出每个同学,每个课程的成绩

需要三个进行笛卡尔积,可以理解成

student和score先进行笛卡尔积,连接条件student.id = score.student_id

上述结果再和course表计算笛卡尔积,连接条件score.course_id = course.id

其实用join on来写更清楚


外连接

多数情况,内外连接查询结果没区别

外连接分为左外连接,右外连接

现在重新创建学生表和分数表

外连接写法

现在修改这两个表的数据,使其不再一一对应

对于内连接,得到的结果是两个表共有的数据

左外连接以左表为主,会保证左侧表的数据都体现在最终结果里,如果这个记录右表里面没有匹配的,以null代替 

右外连接和左外连接相反,保证右表的数据

 

⚠MySQL不支持全外连接


自连接

同一张表,自己和自己进行笛卡尔积。

条件查询只能在列和列之间查询,但是我们在特定情况下要针对行进行查询,我们就可以用自连接把行关系转成列关系

这里需要进行二者的比较需要把行转成列才方便比较

 

我们不能直接用score自己给自己笛卡尔积,而是要给他起个别名

指定连接条件

筛选出左表为3,右表为1的所有记录

最后调整


子查询

就是套娃,把多个简单的sql语句合并成一个复杂的sql语句

太套娃了就不演示


合并查询

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

使用union关键字

select 1 union select 2;

这里其实使用or就行,但是在查询两张不同的表时就只能用union

而且union有去重的功能,但union all不会去重

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

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

相关文章

字符串相似度匹配算法_莱茵斯坦距离算法

package day0330;public class LevenshteinDistanceUtil {public static void main(String[] args) {String a "WN64 F98";String b "WN64 F98 ";System.out.println("相似度:" getSimilarityRatio(a, b));}/*** 获取两字符串的相似度* * par…

MinIo 的操作与使用和避坑

文章目录 一、介绍二、安装三、Client 连通与避坑1. SpringBoot 项目2. 自己的 Maven 项目(非 SpringBoot 项目)思路1:尝试从 Maven 仓库中替换该 jar 包思路2:改造有问题的 jar 包 四、封装一些简单的方法 官方 API 文档&#xf…

阿里云域名解析到非默认端口处理方式

1.需配置两条解析记录,如下图 2.第一条配置A记录,ip指向部署服务器 3.第二条配置隐形记录,指向第一条的网址,并附带端口号,最终访问第二条的网址就不用带非默认端口号了。 4.最终浏览器访问

腾讯云轻量应用服务器挂载对象存储新手入门教程

腾讯云轻量对象存储LighthouseCOS是腾讯云专为中小企业开发者打造的轻量级数据存储服务,适用于云端网站、小程序、课堂演示、云盘/图床等场景下的数据存储和处理任务。腾讯云百科txybk.com详细介绍腾讯云轻量对象存储使用、开通和收费价格说明: 轻量对象…

家用超声波清洗机哪个牌子好?一起来看、值得推荐超声波清洗机

家用超声波清洗机可以干嘛呢?最常见的就是来清洗眼镜。眼镜党朋友应该经常接触超声波清洗机,它常出现在眼镜店中,眼镜店老板帮顾客清洗眼镜;也会出现在工业领域、医疗领域等,超声波清洗机使用范围还是挺广的&#xff0…

MIT6S081-Lab2总结

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/xjintong。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 Lab2就是了解一下xv6的系统调用流程&…

Beam Search学习

BackGround 在生成的时候,模型的输出是一个时间步一个时间步依次获得的,而且前面时间步的结果还会影响后面时间步的结果。也就是说,每一个时间步,模型给出的都是基于历史生成结果的条件概率。 为了生成完整的句子,需…

Leetcode—2477.到达首都的最少油耗【中等】

2023每日刷题&#xff08;五十&#xff09; Leetcode—2477.到达首都的最少油耗 算法思想 参考自灵茶山艾府 实现代码 class Solution { public:long long minimumFuelCost(vector<vector<int>>& roads, int seats) {int n roads.size() 1;vector<i…

【开源】基于JAVA的桃花峪滑雪场租赁系统

项目编号&#xff1a; S 036 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S036&#xff0c;文末获取源码。} 项目编号&#xff1a;S036&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion写好提示词

Stable Diffusion 是一种文生图 AI 模型,由互联网上数百万图像和文本描述对训练而来,通过理解文本描述与图像信息的内在关联,不断利用扩散过程进而得到满意的生成图片。 比如,通过一串提示词,midjourney 会输出这样的情侣合照: A pair of young Chinese lovers, wearing…

Docker部署.NET6项目

Docker的三大核心概念 1、docker仓库&#xff08;repository&#xff09; docker仓库&#xff08;repository&#xff09;类似于代码库&#xff0c;是docker集中存放镜像的场所。实际上&#xff0c;注册服务器是存放仓库的地方&#xff0c;其上往往存放着很多仓库。每个仓库集…

C++学习之路(十五)C++ 用Qt5实现一个工具箱(增加16进制颜色码转换和屏幕颜色提取功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《Base64图片编码预览功能》功能。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加两个平时经常用到的功能吧&#xff0c;就是「 16进制颜色码转RGB文本 」和 「屏幕颜色提取」功能。下面我们就来看看如何来规划…

Postman可以卸载了!这款IDEA插件太好用了!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

C++笔试题之回文数的判断

“回文”是指正读反读都能读通的句子&#xff0c;它是古今中外都有的一种修辞方式和文字游戏&#xff0c;如“我为人人&#xff0c;人人为我”等。在数学中也有这样一类数字有这样的特征&#xff0c;成为回文数&#xff08;palindrome number&#xff09;。 设n是一任意自然数…

vue3中使用antv-X6实现关系图

先看效果图&#xff1a; 1、安装 npm installantv/x6 --save 这里使用的X6中自定义节点的方式实现的&#xff0c;项目目录如下&#xff0c;hooks里面存放一些函数和变量 nodes里面是自定义节点的页面&#xff0c;最外围的index.vue就是主渲染页面 2、testSh/index.vue 注意&…

计算机视觉GPT时刻!UC伯克利三巨头祭出首个纯CV大模型,推理惊现AGI火花

计算机视觉的GPT时刻&#xff0c;来了&#xff01; 最近&#xff0c;来自UC伯克利的计算机视觉「三巨头」联手推出了第一个无自然语言的纯视觉大模型&#xff08;Large Vision Models&#xff09;&#xff0c;并且第一次证明了纯视觉模型本身也是可扩展的&#xff08;scalabil…

YOLOv8创新魔改教程(三)如何添加注意力机制注意力机制的用法与思考

注意力机制的用法与思考 好多同学问我加了CA注意力机制&#xff0c;CBAM注意力机制&#xff0c;都没有涨点&#xff0c;然后就在不停地换不同的注意力机制&#xff0c;其实并不是这样的。今天和大家讨论一下注意力机制的用法与思考。 &#xff08;一&#xff09;添加位置 大…

异常追踪与 JIRA 实现双向联动

前言 当应用程序或系统出现异常时&#xff0c;通常需要及时处理以保证系统的正常运行。通过异常追踪与 JIRA 双向联动&#xff0c;可以让企业内部相关人员快速了解、分析问题故障发生的原因、追溯并记录故障的处理过程&#xff0c;有效提高人员的沟通效率&#xff0c;极大降低…

使用 SVN 新建本地仓库和提交

在写代码的时候经常要看自己修改了什么或者临时备份一下&#xff0c;发现 SVN 比 Git 更好用&#xff0c;下面是使用 TortoiseSVN 在本地新建仓库和关联仓库的方法。 1. 新建文件夹&#xff0c;在文件夹里面右键选择 TortoiseSVN -> Create repository here 。 2. 选择建立…

C++红黑树封装set和map(很详细)

前言 在前面&#xff0c;我们学习了红黑树。&#xff08;没学过红黑树直接看会很吃力&#xff09;set和map的底层就是红黑树&#xff0c;现在我们要用这棵树来封装STL里面的容器&#xff1a;set和map。 下面是之前讲过的红黑树&#xff0c;他只是普通的“Key”模型,适合封装set…