数据库的基本操作(4)

news2025/1/16 4:59:28

先总结一下上一章的内容。

1.修改

update 表名 set 列名 = 值... where 条件;

2.删除

delete from 表名 where 条件;

3.mysql的约束

约束:数据库对数据本身有一些要求和限制。

NOT NULL 数据不能为空。

UNIQUE 数据唯一(针对列来描述)

DEFAULT 默认值

PRIMARY KEY 数据的唯一身份标识

FOREIGN KEY 外键约束,针对两张表进行关联。

下面开始介绍新的内容。

一.表的设计

所谓的“数据库设计”“表的设计”其实解释根据实际的问题场景,把表给构造出来。

一个经典的通用的办法,先找出这个场景涉及到的“实体”,然后再来分析“实体之间的关系”。

分析实体之间的关系,就是“小学生造句” 

1.1一对一

以教务系统为例

student表(学生的id,学生姓名,学生班级...)

user表(用户的账号,密码...)

造的句子:一个账号对应一个学生,一个学生也只有一个账号。

那怎么在数据库中如何表示这种一对一的关联关系呢?

方法一:可以把这两个实体用一张表来表示

方法二:可以用两张表来表示,之后再两张表中加一个id。使得两个表中的id可以对应。根据这个对应关系,就随时可以找到某个账户对应的账户是谁,也可以找到学生对应的账户是啥。

1.2.一对多

以教务系统为例:

student表(学号,姓名...)

class表(班级编号,班级名称...)

造句:一个学生再一个班级之中,但是一个班级可以包含很多学生。

方法一:班级表不变,在学生表中新增一列班级编号,用来随时可以找到对应的班级是哪个。

方法二:在班级表中新增一个学生编号,里面存班里面的学生编号。

1.3.多对多

同样的,也是以教育系统为例:

学生表和课程表;

造句:一个学生可以选择多门课程,一个课程也包含很多学生。

在表的设计中是介绍一下简单的逻辑,在后面会讲到如何对其进行应用。

二.新增

和查询在一起的新增操作,把从上一个表中的查询结果,作为下一个表要插入的输出的数据。

下面我用实际的操作来演示一下整体的过程。

通过代码我们可以看出,当ab两个表的格式一致时,我们可以通过搜索a里面的数据,将a中的数据插入到b中。

 

通过该代码我们可以看出,当我们将ab里面的表顺序相反,之后发现无法插入,但是当我们按照b里面的列的顺序查询可以发现,可以将a中的表的数据插入到b中。

三.查询

3.1聚合查询

3.1.1.聚合函数

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

 expr写的是列名、表达式,聚合函数就相当于把同一列的若干行都相加到一起。

DISTINCT表示去重,根据对数据的去重和不去重,得到的数据结果不一定一样。

下面我们用代码的形式来展现一下效果。

 首先我们先查看表里面的数据,之后用count(*)来看表中的数据,显示的个数为8。

之后我们用sum(*)的时候发现报错,主要的原因是因为这些操作主要是针对列来进行计算的,之后我们用count来单独针对一列来进行操作的时候发现,个数为7,比之前少了一个,可以发现null是不在计数范围之内的。

同时聚合函数也是可以通过where语句来进行使用的。

 3.1.2.group  by 子句

这是一个分类语句,所谓的分类,其实就是按照某一列的值来进行分组,之后把相同的放到一起。

现在我们输进去一些数据。

给出一个题目: 查询每个角色的最高工资、最低工资和平均工资

根据题目要求我们可以发现这个是按照肉了来进行分组的,代码如下:

 3.1.3.having

having和where其实是类似的,只是用的时间不一样,前面提到过,在MySQL里面不是按照我们写代码的先后顺序来执行操作的。在进行上面了上面讲的分组操作之后,进行指定条件的筛选就需要用到having,而where是在分组条件之前来进行操作的,下面我就用代码来给大家展示一下整体的过程。

还是之前的数据,用where的来做的话,我除了题目就是把数据中‘马云’的书进行删除。

我们会发现以及将马云代表的服务员的选项进行了删除。

having是对分组之后的才做进行条件的约束,给出的题目是平均工资为一万一下。

 

通过having操作之后我们会发现已经将分组之后董事长的工资进行了删除。

从这里可以看出,根据场景的不同,我们需要进行不同的操作方法,在分组之前进行条件用where,在分组之后我们用having,当然having和where可以同时使用。 

3.2.联合查询

联合查询,就是把多个表的记录合并在一起之后进行查询,也可以叫做多表查询。

夺标查询可以说是整个sql里面最复杂的部分,在一些笔试和面试当中考的次数和频率会比较多,但是在很多实际的开发中会禁止使用多表查询。

多表查询的核心操作就是笛卡尔积,简单的说就是排列组合。笛卡尔积是针对任意两张表之间进行的运算。

 如何在SQL中进行笛卡尔积呢?最简单的做法就是直接select * from 后面跟上多个表名,表名之间只用都好分割。下面用简单的例子来演示一下。

 但是,我们会发现通过笛卡尔积会产生很多没有用的数据,下面就会讲一些操作使得数据变得合理化。

我们通过上面的表中可以看出,在两个表中都有classId,向这里的classId就是“连接条件”。

带有连接条件的笛卡尔积其实就是多表查询了。

 通过表名加.的方式来进行=,之后选出有用的数据。

当然如果列名不会混淆(不是同名的),可以用表名.列名也可以省略表名。

我们也可以对数据进行精简,比如上面的数据,我们只想要姓名和班级。

通过不同的方法以及选择可以得出结果。

上面只是简单的例子还有介绍,下面我会慢慢用难一点的例子来进行讲解。

下面先将我创建的表里面的数据展示一下:

 

 

3.2.1内连接 

 先亮题目:查询“许仙”同学的 成绩

其实这里面有两种内连接的方法,一个是和以前一样,直接用where条件来进行查询,还有一个是join...on...但是我个人觉得join...on...没有where好用,虽然join...on...多了一些用处。

下面我先来解决一下这条题目:

做这种题目,我们优先去找相关的表,之后才能进行操作,查学生成绩首先需要学生表以及学生成绩表。之后发现两个表是通过id来进行连接的,所以在where里面来输入id相等的条件以及name为许仙。

 这种写法的格式是:from 表一 join 表二 on 条件;

前面写法的格式是from 表一 ,表二 where 条件;

这两种写法都是等价的,但是相比较而言,我更喜欢where,但是join  on 有的功能是from多个表无法实现的,之后会进行介绍。

下面再来一题试试水:查询所有同学的总成绩,及同学的个人信息:

首先分析一下这个题目,需要学生的成绩那么就肯定是要成绩表的,之后还有个人信息,那么就是学深表和成绩表来进行内连接。

 首先我一开始做的时候发现,按照之前的方法计算会使得一个人有好几个成绩,所以后面我进行了分组之后,分组之后运用聚合查询的sum操作,结果如下:

 这样就可以得到每个人的总成绩。

再来一个比较难的题目:查询所有同学的成绩,及同学的个人信息:

再这个题目里面我们需要用到学生表,成绩表以及课程表:

以上就是多表查询内连接的操作。

既然都推荐使用这个from多个表where..那么join on 还有啥用?

上面说了这个from多个表where写法叫做“内连接”

使用join ... on...的写法既可以表示内连接还可以表示外连接。

select 列 from 表1 inner join 表2 on 条件;

inner join 表示的是内连接,当然inner是可以省略的;

select 列 from 表1 left join 表2 on 条件;左外连接

select 列 from 表1 right join 表2 on 条件;右外连接

讲一下什么是左右外连接;下面我用一个实际的例子来演示一下:

这是我新录入的 数据,从数据中我们可以发现,虽然student里面的class可以和class里面的id进行对应,但是有一部分是没有办法对应的,当我们用内连接来试试效果;

 

 通过内连接我们会发现,里面少了一个人的数据。

当我们试试外连接,看看外连接的效果:

 通过上面的例子我们可以看到left join 和inner join 之间的区别

left join 是以左侧的表为主,会将左侧的所有数据全部列出来,如果右边的表中没有对应的就用null来代替。

inner join 是要求两个表中都同时有的数据才可以进行连接。

right join和left join的效果类似。

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

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

相关文章

【目标检测】目标检测的评价指标(七个)

目录:目标检测的评价指标一、正样本与负样本二、真正(TP)、假正(FP)、真负(TN)、假负(FN)(1)正确的正向预测(True Positive,TP):正样本被正确检测的数量(2)错误的正向预测…

国际海运详解:国际海运的发货方式有哪些?区别是什么?

在跨境物流运输中,海运是一个种常用的运输方式,下面来重点介绍国际海运的几种发货方式和区别: 一、电放提单 是电报放货的缩写。提单信息以电子报纸或电子信息的形式发送给目的港船公司,收货人可以更换加盖电子印章的提单和电子保…

LeetCode-775-全局倒置与局部倒置

1、数学方法 根据题意,显然全局倒置的值大于等于局部倒置的值。因此我们不必求出具体的全局倒置的值和局部倒置的值,我们只需要证明全局倒置的值大于局部倒置的值即可。 因此我们可以从后往前进行查询,只要我们能够证明区间[i1,n−1][i1,n-…

小啊呜产品读书笔记001:《邱岳的产品手记-02》开篇词010203讲

小啊呜产品读书笔记001:《邱岳的产品手记-02》 开篇词&01&02&03讲一、今日阅读计划二、泛读&知识摘录1、开篇词 产品经理的世界没有对错2、01讲 验证码是个好设计吗?3、02讲 产品经理工具指南4、03讲 产品案例分析Trigraphy的设计哲学三…

VS2019编码修改为UTF-8的方法

1.修改windows系统配置 设置 时区和语言 语言 》 管理语言设置 2. 修改VS2019 在扩展里安装Force UTF-8(No BOM) 和 Fix File Encoding 插件 解决控制台中文乱码问题 1.按下winr,输出regedit,打开注册表编辑器 2.在注册表编辑器中打开路径HKE…

VBA调用宏的方式总结大全

文章目录背景方式一 : Excel菜单执行宏方式二 : 按钮绑定宏1. 插入按钮2. 绑定宏方式三 : 窗体绑定宏1. 插入窗体2. 拖入按钮3. 绑定按钮点击事件触发宏(写代码)方式四 : 事件绑定宏背景 很多小伙伴在拿到模型之后, 看着满屏的代码, 却不知道如何下手使用这些代码. 这篇文章就…

【DOTS学习笔记】面向数据设计DOD

目录前言程序设计方法ODD->DODCache的3C与3R面向数据设计需要思考的问题AOSSOADOTS面向数据设计原则前言 本文是Metaverse大衍神君的《DOTS之路》系列课程的学习笔记 程序设计方法 Instructional Programming 指令化编程 脱离指令打孔输入后,伴随着机器汇编语言…

操作系统4小时速成:进程同步,临界资源,互斥,信号量的作用,死锁产生的四个条件,安全状态,银行家算法

操作系统4小时速成:进程同步,临界资源,互斥,信号量的作用,死锁产生的四个条件,安全状态,银行家算法 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人&am…

vhost dpdk 共享内存

struct kvm_memory_slot http://tinylab.org/kvm-intro-part1 https://www.cnblogs.com/LoyenWang/p/13943005.html (免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂 更多DPDK相关学习资料有…

Mybatis-Plus——分页+模糊查询

建表: create table pms_brand (brand_id bigint not null auto_increment comment 品牌id,name char(50) comment 品牌名,logo varchar(2000) comment 品牌logo地址,descript longtext comment 介绍,sh…

使用ReentrantLock中的条件变量让多个线程顺序执行

一. 前言 近日壹哥的一个学生在参加某公司校招面试时,遇到一个多个线程顺序执行的面试题,特意记录下来和大家分享一下,这个题目的具体要求是这样的: 假设有3个线程 a,b,c,要求三个线程一起进入到就绪态,执…

【LeetCode】775. 全局倒置与局部倒置

题目描述 给你一个长度为 n 的整数数组 nums &#xff0c;表示由范围 [0, n - 1] 内所有整数组成的一个排列。 全局倒置 的数目等于满足下述条件不同下标对 (i, j) 的数目&#xff1a; 0 < i < j < n nums[i] > nums[j] 局部倒置 的数目等于满足下述条件的下标 i 的…

01-Linux

1 初识Linux 在前面的课程中&#xff0c;我们无论是开发、测试。部署、存储都在Windwos操作系统的环境中&#xff0c;从今天开始我们一起学习下Linux,Linux系统和Windows系统最大的区别就是图形化界面操作和用途上有所差异&#xff0c;除了这两点&#xff0c;两者有异曲同工之…

跑通官方的yolov7-tiny实验记录(yolov7-tiny可作为yolov5s的对比实验网络)

目录1. 一些可用的参考链接2. 开始训练yolov72.1 --weights2.2 --cfg2.3 --data2.4 --hyp2.5 --epochs2.6 --batch-size2.7 --workers2.8 --name1. 一些可用的参考链接 官方YOLOv7 项目地址&#xff1a;https://github.com/WongKinYiu/yolov7如果想设置早停机制&#xff0c;可…

2022年TI杯模拟电⼦系统设计专题邀请赛——李萨如图形演示装置

任务 设计并实现李萨如&#xff08;Lissajous&#xff09;图形演示装置&#xff0c;如图 1 所示。输入正弦信号作为 x 轴信号&#xff0c;其峰峰值 2V&#xff0c;频率 1.5kHz~2kHz&#xff1b;对输入的正弦信号进行幅度和频率变换后产生 y 轴信号&#xff1b;装置显示器上显示…

CentOS7 离线安装 Python

目录1.前言2.下载Python及依赖环境&#xff08;1&#xff09;下载Python源码&#xff08;2&#xff09;下载Python依赖文件&#xff08;3&#xff09;下载gcc环境文件&#xff08;备用&#xff09;3.上传至离线服务器&#xff08;1&#xff09;核对已下载离线文件&#xff08;2…

基于PSO粒子群优化的汽车刹车稳定性数据matlab仿真与分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 刹车类别A 温度1 测试1 测试2 ....... 测试n 温度3 测试1 测试2 ....... 测试n ....... ....... 温度N 测试1 …

Java语言的过滤数据流

过滤数据流 为了解决不同数据流之间速度、数据格式差异的问题&#xff0c;以便提高输入/输出操作的效率&#xff08;特别是当需要大量的输入、输出操作的程序时&#xff09;&#xff0c;因此&#xff0c;Java贴心的提供了过滤流。 在已存在的数据流的基础上&#xff0c;过滤数…

IntelliJ IDEA

特色功能 IDEA所提倡的是智能编码&#xff0c;是减少程序员的工作&#xff0c;IDEA的特色功能有以下22点[1] &#xff1a; ● 智能的选取 在很多时候我们要选取某个方法&#xff0c;或某个循环或想一步一步从一个变量到整个类慢慢扩充着选取&#xff0c;IDEA就提供这种基于…

数据治理:数据标准的6大建设步骤及实施分享

“车同轨、书同文”&#xff0c;数字化时代&#xff0c;数据标准化是企业进行数字化转型的根基。数据标准与企业数据管理的每个域都相关&#xff0c;是数据治理工作的最基础内容。 元数据管理中&#xff0c;需要从业务属性、技术属性、管理属性三个方面定义数据标准&#xff1b…