初写MySQL四张表:(3/4)
我们已经完成了四张表的创建,学会了创建表和查看表字段信息的语句。
初写MySQL四张表:(1/4)-CSDN博客
初写MySQL四张表:(2/4)-CSDN博客
接下来,我们来学点对数据的操作:增 删 查(一部分)改
先来看这四张表以及相关需求:
四张表
需求一:
这便是向我们创建好的空表里面,插入数据。具体语句我们使用INSERT INTO ,接下来介绍一番:
INSERT INTO:
先来申请英译中:
现在是逻辑课:按照语法来说“插入到”后面得加个地点吧,题上不是说了嘛,“添加到学生表”。根据前面的习惯,表名我们会select一个DATABASE。
(我们可以看到左侧,学生表stu是放在testdb中的)
所以按照猜测语句应该有这样一部分:
INSERT INTO testdb.stu
后面按理说就应该是添数据对吧:但是一行数据我们要添加的数据项可能并不是全部字段(属性)——比如在stu表中,我们若添加数据只包含学号 、姓名 、学院编号。但是我们并不添加性别和出生日期这两个字段。
这种添加数据但是不包含所有字段的数据,需要我们自己指明要添加的字段名:
#假如,指定添加该学生的学号,姓名和学院编号
INSERT INTO testdb.stu(stuid,stuname,deptid)
...
#字段之间用逗号隔开
如果你要添加的数据,包含全部的字段,这时候就不需要指明添加的字段名,默认你要添加所有字段。比如这里的需求:
但是,我们添加的核心,始终是数据。
我们会添加一个关键字VALUES:而数据就放在VALUES();的括号中。这里就应该这样表示:
INSERT INTO testdb.stu
VALUES('2022121001','张三','男','2006-5-1','1');
#这是一行记录,一行记录的数据值之间也需要使用逗号隔开。其中字符型数据需要使用单引号。
发现没有,所有数据值的顺序对应我们字段的顺序。
补充:
我们前面在创建表的时候,不是有个字段NOT NULL约束吗?NOT NULL到底什么时候约束呢?就是添加记录的时候。
INTO子句中没有出现的字段,新添加的记录在这些字段上将被赋NULL值。但是表定义时有NOT NULL约束的字段不能取NULL值,添加记录时必须给其赋值。
我们运行一下:
#Error Code: 1452.
/*Cannot add or update a child row:
a foreign key constraint fails (`testdb`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`deptid`) REFERENCES `dept` (`deptid`))*/
报错了,很好。具体错误是:无法添加或更新一个子行(row,在MySQL里,行也称作一条记录)。
外键约束无效:
原因是什么呢?是因为我们的外键约束失败了。外键为什么不行,还记得外键怎么来的吗?外键是另一张表的主键的引用,保证数据的完整性。不仅如此,从表中的外键列只能包含主表中已存在的主键值,避免了出现悬挂指针(指向不存在的数据)或数据不一致的情况。
外键能约束说明它心中已经有杆秤了,外键本质上是另一张表的主键。而有杆秤,说明该主表的主键列已经有值了——怎么至少也得有>=1个值吧,外键就依据这些现有的值来判断你添加的值是否有效了。——这就是外键约束。
解决方案:先在dept表里添加主键值,那就要我们再写一个INSERT INTO 呗,但是,你觉得这种写法可行吗?
INSERT INTO testdb.dept(deptid)
VALUES('1');
看见没,前面的补充你只要明白了,这里你就知道为什么我们不能单单添加deptid了。NOT NULL约束对不对?
INSERT INTO testdb.dept
VALUES('1','计算机学院');
运行一下,添加记录。
此时再添加这条学生信息,想必就不会外键失效了。
INSERT INTO testdb.stu
VALUES('2022121001','张三','男','2006-5-1','1');
也成功了,但是文字的显示始终没有图形来得震撼。
我们前面说,DESC + 表名是查看表的字段信息,但是我们添加了数据,该怎么去看有数据的表呢?
SELECT * FROM
SELECT * FROM 表名;
#表名包括了数据库
SELECT 表示筛选,*是通配符,表示"所有",FROM 表,连起来就是从某个表里的所有字段列中筛选数据——作用是:查询该表中的全部内容。
SELECT * FROM testdb.dept;
#刚刚添加了一条数据,我们来显示一下
是吧,添加成功了。
这里浅浅说说,方便我们检验操作,因为我们后面不远处,还会说到select 。
需求一的参考代码:
INSERT INTO testdb.dept
VALUES('1','计算机学院');
INSERT INTO testdb.stu
VALUES('2022121001','张三','男','2006-5-1','1');
需求二:
在学生表中删除学号为’2022121001’的学生信息。
分析需求:核心是删除一条记录,删的记录是哪里的? stu这张表里的。它直接报出了学号,咱们就得按照学号来检索删除。
按理说,这个“检索删除”有两步,但是学习的魅力就在于此:我们若只着眼于解决当下问题,就可以直接站在巨人的肩膀上,一步到位;但是我们若要追根溯源,探寻如何实现,也有前人给我们源码研究。
现在就允许我们先跪在巨人的肩膀上吧,学个DELETE from
DELETE FROM
DELETE FROM 按照之前的设计后面也接个表名,你是这么猜,它也真的这么设计。这里就是:
DELETE FROM testdb.stu
#我没打分号就表示这不是一句完整的语句,提醒一句
WHERE
WHERE关键字,WHERE
是 SQL 语言中的一个关键字,它用于指定 DELETE
、UPDATE
、SELECT
等语句中的条件,以限制哪些行(记录)会被影响或返回。
此处,DELETE FROM ... WHERE ...其结果是:指定删除。
怎么用呢? 比如:学生表中,你要指定删除一个叫“王五”的学生。用DELETE FROM ...WHERE就是:
DELETE FROM testdb.stu WHERE stuname = '王五';
#指定删除学生表中学生姓名叫王五的学生的信息记录
运行当然运行不了,因为我们根本没添加过这条数据,我这里只是打个比方。
那实现这里的需求,也就照猫画虎了:
在学生表中删除学号为’2022121001’的学生信息。
DELETE FROM testdb.stu WHERE stuid = '2022121001';
运行之前,先看一下表里的数据:
再运行一下我们的删除语句:
显示删除成功了。(有时发现不知不觉就熬了夜☕哈哈哈)
ok,我们通过select * 检查一下,是否真的删除了。
记录没了,确实删除了,直观吧
需求二的参考代码:
DELETE FROM testdb.stu WHERE stuid = '2022121001';
需求三:
把课程表中课程编号为“CS003A”的课程的学分改为3。
分析:本质是什么,修改某条记录某个字段的值。关键词:修改表中的数据。
UPDATE ... SET ...
UPDATE 后面接表名,表示你要修改哪张表。SET 英译过来:“设置”,这里和修改同义。
SET 设置的是前面确定表名的某个或多个字段 的值。
扩展:还记得前面说过的,WHERE加在不同的地方有指定的xx功能。和delete搭在一起,有指定删除的功能,那和set搭在一起,就有指定修改的功能。哟,这不巧了嘛。
我们的需求就是:指定修改课程表里课程编号为'CS003A'的课程记录的学分字段的值。(话有点长,但意思我写得清楚🤞)
比如:我们要把学生表里面的姓名叫"张三"的学生记录中的出生日期改成"2006-5-2"。
UPDATE testdb.stu
SET birthday = '2006-5-2'
WHERE stuname = '张三';
#照样是举个例子
那么,这个需求,实现也近在眼前了:
把课程表中课程编号为“CS003A”的课程的学分改为3。
UPDATE testdb.course
SET credit = 3
WHERE cid = 'CS003A';
#字符型数据才会加单引号,这里的学分不是字符型数据
但是,我们自己会发现这个修改数据是建立在有数据的基础上,若没有CSA003A这条课程的记录,甚至谈不上指定数据 。所以,我们还得手动添加一条数据记录。
INSERT INTO testdb.course
VALUES('CS003A','数据库',2,'1');
#添加该课程编号整一条记录
那么我们先运行添加,查看:
再来修改学分为3:
好了,完成了需求三——修改数据。
需求三的参考代码:
UPDATE testdb.course
SET credit = 3
WHERE cid = 'CS003A';
需求四:
查询学号为“2022121001”的学生所有信息。
分析:指定查询。
查询我们用关键字:SELECT,刚刚后面接*表示所有字段记录,若只有SELECT * FROM 表名,就表示查询该表中的全部内容。
现在我们要指定查询,就要在后面加个WHERE,起到我们期望的“指定”的效果。
WHERE 后面一般接字段名 = 某个值。
比如这里的:指定的是“学号为“2022121001”的学生”
WHERE stuid = '2022121001'
我们要实现的是“查询...所有信息”,前面再加上SELECT * FROM 表名
SELECT * FROM testdb.stu
WHERE stuid = '2022121001';
我们运行一下,看看查询最后的效果是怎样。
所以得到需求四的实现代码:
SELECT * FROM testdb.stu
WHERE stuid = '2022121001';
需求五:
查询学院名称为“计算机学院”的学生名单,显示学号、姓名、学院。
分析:也是指定查询,SELECT ... FROM...WHERE...是跑不了了。但是特殊的需求是,并非如上个需求显示所有字段的数据,而是只显示部分字段数据。别忘了,学生表中只有学院编号,要让我们显示的不是学院编号,而是学院表里面才有的学院名称。
这次查询,不是单纯的在一张表上查询,而是两张表。
首先改变的,只有 “*” 变成对应的字段名。
#学号、姓名—— 这些字段来自stu表,后面FROM已经说明了是从学生表找。但是学院名称是在dept表中,则需要指明表
SELECT stuid,stuname,dept.deptname
FROM testdb.stu,testdb.dept
WHERE
我们的查询条件应该接在WHERE后,条件是deptname = '计算机学院',而这里值得注意的是,怎么样把两张表连起来。这两张表有主从关系,主从关系从何而来,学生表的外键是学院表主键的有效引用。
没错就是,主键外键 —— 学生表的外键是学院表主键的有效引用。则同时满足stu.deptid = dept.deptid
SELECT stuid,stuname,dept.deptname
FROM testdb.stu,testdb.dept
WHERE stu.deptid = dept.deptid AND deptname = '计算机学院';
AND
在SQL中用于表示关系的逻辑操作符和关键字,AND表示“前后两个表达式为真,记录就会被包含在查询结果中。”,意思即“并且”。—— 呼应我们这里的学院名称为计算机学院 同时满足 两张表学员编号对应的要求。
运行效果:
查询学院名称为“计算机学院”的学生名单,显示学号、姓名、学院。
是不是挨个展示了 学号、姓名和学院名称。
这里,我们再介绍一种写法:
JOIN关键字
你需要通过两个表来进行联合查询(JOIN),join关键字后接上另一张表名。当将JOIN关键词放于FROM子句中,应有关键词ON与之对应,以表明连接的条件。
以前我们使用WHERE后面接查询条件和连接条件,现在我们使用ON。
查询学院名称为“计算机学院”的学生名单,显示学号、姓名、学院。
代码应该是这样:
SELECT stuid,stuname,dept.deptname
FROM testdb.stu
JOIN testdb.dept
ON stu.deptid = dept.deptid AND deptname = '计算机学院';
#JOIN 后接另一张表,ON和JOIN连用,ON后接连接条件和查询条件
是不是一样的效果?
需求五的参考代码:
#第一种:WHERE
SELECT stuid,stuname,dept.deptname
FROM testdb.stu,testdb.dept
WHERE stu.deptid = dept.deptid AND deptname = '计算机学院';
#第二种:JOIN ON
SELECT stuid,stuname,dept.deptname
FROM testdb.stu
JOIN testdb.dept
ON stu.deptid = dept.deptid AND deptname = '计算机学院';
#记得 SELECT ... FROM... 和 JOIN ... ON ...常见搭配
今天写得倒是很扎实,哈哈哈(意满离)
相关文章:

初写MySQL四张表:(3/4)
我们已经完成了四张表的创建,学会了创建表和查看表字段信息的语句。 初写MySQL四张表:(1/4)-CSDN博客 初写MySQL四张表:(2/4)-CSDN博客 接下来,我们来学点对数据的操作:增 删 查(一部分)改 先来看这四张表以及相关…...

【Java】线程暂停比拼:wait() 和 sleep()的较量
欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 在Java多线程编程中,合理地控制线程的执行是至关重要的。wait()和sleep()是两个常用的方法,它们都可以用来暂停线程的执行,但它们之间存在着显著的差异。本文将详…...

CQRS模型解析
简介 CQRS中文意思为命令于查询职责分离,我们可以将其了解成读写分离的思想。分为两个部分 业务侧和数据侧,业务侧主要执行的就是数据的写操作,而数据侧主要执行的就是数据的读操作。当然两侧的数据库可以是不同的。目前最为常用的CQRS思想方…...

qt-C++笔记之作用等同的宏和关键字
qt-C笔记之作用等同的宏和关键字 code review! Q_SLOT 和 slots: Q_SLOT是slots的替代宏,用于声明槽函数。 Q_SIGNAL 和 signals: Q_SIGNAL类似于signals,用于声明信号。 Q_EMIT 和 emit: Q_EMIT 是 Qt 中用于发射…...

java(3)数组的定义与使用
目录 1.前言 2.正文 2.1数组的概念 2.2数组的创建与初始化 2.2.1数组的创建 2.2.1数组的静态初始化 2.2.2数组的动态初始化 2.3数组是引用类型 2.3.1引用类型与基本类型区别 2.3.2认识NULL 2.4二维数组 2.5数组的基本运用 2.5.1数组的遍历 2.5.2数组转字符串 2.…...

Integer 源码记录
Integer 公共方法结构 注意: 通过构造函数创建一个Integer对象,每次都会返回一个新的对象,如果使用 进行对象的比较,那么结果是false。 public Integer(int value) {this.value value;}与之对应的是,valueOf 方法…...

【RocketMQ】一、基本概念
文章目录 1、举例2、MQ异步通信3、背景4、Rocket MQ 角色概述4.1 主题4.2 队列4.3 消息4.4 生产者4.5 消费者分组4.6 消费者4.7 订阅关系 5、消息传输模型5.1 点对点模型5.2 发布订阅模型 1、举例 以坐火车类比MQ: 安检大厅就像是一个系统的门面,接受来…...

笔记9.18
线程之间的通信是指在多线程程序中,不同线程之间如何交换数据或协调工作。这种通信对于实现复杂的并发程序是至关重要的。以下是几种常见的线程间通信方式: 共享内存: 这是最直接的方式,多个线程通过读写同一块内存区域࿰…...

时间序列8个基准Baseline模型及其详细解读
我是从去年11月份开始,选定时间序列预测这个方向,准备在工作之余继续独立进行一些科学研究。选定这个方向是因为我对金融量化一直挺感兴趣,希望能把时间序列中的深度学习算法模型,用到金融数据。现在看来,我太过于理想…...

将相机深度图转接为点云的ROS2功能包
depth_image_proc 是一个 ROS(Robot Operating System)包,它包含了一系列节点,用于处理来自深度相机的图像数据,并将其转换为点云。以下是 depth_image_proc 包中各个节点的作用: convert_metric_node&…...

计算机毕业设计选题推荐-共享图书管理系统-小程序/App
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

架构师:在 Spring Cloud 中实现全局异常处理的技术指南
1、简述 在分布式系统中,微服务架构是最流行的设计模式之一。Spring Cloud 提供了各种工具和库来简化微服务的开发和管理。然而,随着服务的增多,处理每个服务中的异常变得尤为复杂。因此,实现统一的全局异常处理成为了关键。本篇博客将介绍如何在 Spring Cloud 微服务架构…...

es由一个集群迁移到另外一个集群es的数据迁移
迁移es的数据 改下index的索引 就可以了。 查询 用curl -u就可以查询了...

java项目之常规应急物资管理系统(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的常规应急物资管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息。 项目简介: 基于SpringBootVue的…...

text2sql方法:RESDSQL和DAIL-SQL
之前介绍了text2sql的综述,但是对一些方法的描述不够详细,所以将一些感兴趣的方法思路也整理一下。 RESDSQL RESDSQL出自2023年2月的论文《RESDSQL: Decoupling Schema Linking and Skeleton Parsing for Text-to-SQL》(github)。它使用seq2seq PLM(pr…...

Stable Diffusion 优秀博客转载
初版论文地址:https://arxiv.org/pdf/2112.10752 主要流程图: Latent Diffusion Models(LDMs) DDPM是"Denoising Diffusion Probabilistic Models"的缩写, 去噪扩散概率模型 博客: 【论文阅读…...

探索IT行业的无限潜力:技术、发展与职业前景
探索IT行业的无限潜力:技术、发展与职业前景 1. 引言 信息技术(IT)已经彻底改变了我们的生活方式,从智能手机到云计算,IT无处不在。无论是公司管理系统、社交媒体,还是大数据分析平台,IT推动了…...

ESP32配网接入Wifi
1 ESP32的两种模式 AP模式:ESP32可以作为热点,手机和电脑等设备接入使用。 STA模式:ESP32可以作为作为客户端接入其他网络中。 2 流程 step1: ESP32上电后进入STA模式,尝试看能够接入网络 step2: 如何连接成功,则正常运行。如何连接超时,则自动进入AP模式,设置AP热点…...

前端-js例子:收钱转账
支付宝转账 在这里用到周期定时器setInterval(function,time),设置达到目标钱数时停止定时器。 点击转账按钮时,开始函数显示。 同时要确定输入框里输入的是数字。(有一定容错) window.onloadfunction(){var btn document.que…...

2024 BaseCTF repwn 部分wp
You are good at IDA 附件拖入ida。比较简单 UPX mini upx壳,无魔改,直接脱。脱完拖入ida。比较简单 Ez Xor 附件拖入ida 比较简单。脚本 ez_maze 附件拖入ida 一个宽为15的迷宫 BasePlus 附件拖入ida。变表base64再异或0xE 签个到吧 nc连上即得 echo nc…...

每日学习一个数据结构-倒排表
文章目录 示意图倒排表的基本概念倒排表的数据结构示例 倒排表的优点应用场景 倒排表(Inverted Index),也称为反向索引或倒排文件,在信息检索系统中是一种重要的数据结构。它主要用于快速搜索文档中的关键词,并找到包含…...

828华为云征文|部署在线文件管理器 Spacedrive
828华为云征文|部署在线文件管理器 Spacedrive 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 产品优势1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Spacedrive3.1 Spacedrive 介绍3.2 Docker 环境搭建3.3 Spac…...

Alluxio EnterpriseAI on K8s 部署教程
Alluxio Enterprise AI on K8s 部署视频教程 视频为Alluxio Enterprise AI on K8s 部署视频教程。下面内容将主要介绍如何通过 Operator(Kubernetes 管理应用程序的扩展)在 Kubernetes 上安装 Alluxio。 1. 系统要求 Kubernetes 至少1.19版本的 Kubern…...

鸿蒙OpenHarmony【轻量系统内核扩展组件(动态加载)】子系统开发
基本概念 在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF加载方案,方便拓展算法生态。LiteOS-M提供类…...

Leetcode42. 接雨水
讲的好的视频讲解 【很难想象这up刷题的精神状态 Leetcode42. 接雨水】 https://www.bilibili.com/video/BV1MC411n7Af/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a rm是right max的意思,lm是left max的意思 时间复杂度: O (…...

dbt snapshot命令及应用示例
DBT是一种功能强大的数据转换工具,它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够创建快照,这是跟踪数据随时间变化的一种方法。本文带你一起完成创建和使用dbt快照的过程。 理解缓慢变化维度 缓慢变化维度(scd)是数据仓…...

JavaEE: 深入探索TCP网络编程的奇妙世界(四)
文章目录 TCP核心机制TCP核心机制四: 滑动窗口为啥要使用滑动窗口?滑动窗口介绍滑动窗口出现丢包咋办? TCP核心机制五: 流量控制 TCP核心机制 书接上文~ TCP核心机制四: 滑动窗口 为啥要使用滑动窗口? 之前我们讨论了确认应答策略,对每一个发送的数据段,都要给一个ACK确…...

面试金典题2.3
若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如,传入节点 c(位于单向链…...

React 知识框架
在学习 React 时,可以按照以下知识框架来逐步学习和掌握 React 相关的知识: 1. **基础概念**: - 了解什么是 React 和为什么要使用 React。 - 理解 Virtual DOM(虚拟 DOM)的概念以及它如何提高性能。 - 学习…...

DeepCross模型实现推荐算法
1. 项目简介 A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发…...