MySQL系列


文章目录

  • MySQL系列
  • 前言
  • 一、Create(创建)并插入数据
    • 1.1 单行数据 + 全列插入
    • 1.2 多行数据 + 指定列插入
    • 1.3 插入冲突时同步更新
    • 1.4 冲突时替换
  • 二、Retireve读取数据
    • 2.1 全列查询
    • 2.2 查询指定列
    • 2.3 查询字段为表达式
    • 2.4 结果去重 DISTINCT
    • 2.5 where条件筛选
    • 2.6 order by语句(结果排序)
    • 2.6 limit的使用(筛选分页结果)
  • 三、Update更新修改
  • 四、Delete删除
  • 五、插入查询结果


前言

本篇将介绍表的增删查改(CURD),在数据库技术与项目开发中,CURD 是对应 Create(创建)、Update(更新)、Read(读取)、Delete(删除)四类数据处理动作的核心操作缩写,也是贯穿各类项目开发全流程的基础数据交互原子操作。


本篇内容紧跟上篇,前半部分的操作比较基础,之前的文章中你已经见过了

一、Create(创建)并插入数据

创建一个用于测试的表结果:

CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);

在这里插入图片描述

插入语法:

INSERT [INTO] table_name[(column1 [, column2, ...])]
VALUES(value1 [, value2, ...]),[(value1 [, value2, ...]), ...];

[]中的内容都是可自主选择的填写字段

  • 核心结构INSERT [INTO] table_name [(列名列表)] VALUES (对应值列表)

    • table_name:需插入数据的目标表名
    • (列名列表):需插入的具体属性列(如 id, name
    • VALUES (值列表):与列名列表一一对应的数据值
  • 关键语法细节

    • INSERT 后可加 INTO 关键字,也可直接省略(如 INSERT table_name ...)。
    • 全列插入场景:若不写 (列名列表),则默认需一次性插入表中所有属性列,此时 VALUES 后的值需按表定义的列顺序完整提供。

1.1 单行数据 + 全列插入

insert into students values (100, 10000, '唐三藏', null);
insert students values (101, 10001, '孙悟空', '11111');

在这里插入图片描述

1.2 多行数据 + 指定列插入

插入数据时,使用分割列名列表,多行数据使用分割值列表:

insert into students (id, sn, name) values
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');

在这里插入图片描述

1.3 插入冲突时同步更新

在插入数据时,若遇到主键冲突唯一键冲突,可通过在 INSERT 语句后添加特定子句(如 ON DUPLICATE KEY UPDATE)实现冲突处理逻辑,确保即使存在冲突也能正常执行操作,避免直接报错导致插入失败。

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATEcolumn1 = value1,  -- 冲突时更新的字段及值column2 = value2;  -- 可指定多个更新字段

在这里插入图片描述
这里必须保障跟新后的逐渐和唯一键不能与表中已存在的产生冲突。

SELECT ROW_COUNT();

该函数可以查看你在执行操作时,受到影响的行数。

1.4 冲突时替换

-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
replace into students (sn, name) values (20001, '曹贼');

在这里插入图片描述
发生唯一键冲突时,将冲突行删除后重新插入(id自增长变化),不发生冲突则直接插入。

二、Retireve读取数据

SELECT [DISTINCT]{*, column1, column2, ...}  -- 选择列(*表示所有列)
FROM table_name
[WHERE condition]              -- 筛选条件
[ORDER BY column1 [ASC|DESC],  -- 排序规则column2 [ASC|DESC]]
[LIMIT count];                 -- 限制返回行数

该sql语句可选项较多,接下我会根据实例来逐一介绍

create table exam_result (
id int unsigned primary key auto_increment,
name varchar(20) not null comment '同学姓名',
chinese float default 0.0 comment '语文成绩',
math float default 0.0 comment '数学成绩',
english float default 0.0 comment '英语成绩'
);

在这里插入图片描述
测试数据

INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);

2.1 全列查询

SELECT * FROM exam_result;

在这里插入图片描述

  • 通常情况下不建议使用 * 进行全列查询,查询的列越多,意味着需要传输的数据量越大;
  • 可能会影响到索引的使用。

2.2 查询指定列

-- 指定列的顺序不需要按定义表的顺序来
SELECT id, name, english FROM exam_result;

在这里插入图片描述
可以根据需要查找任意列

2.3 查询字段为表达式

select id,name,chinese+english,1 from exam_result;

在这里插入图片描述
select可跟任意合法表达式,并返回表达式计算的结果,图中1就是表达式1计算的结果。

为查询结果指定别名

select id,name,chinese+english as '语文+英语' from exam_result;

在这里插入图片描述
使用as可对表达式进行重命名,as可以省略

2.4 结果去重 DISTINCT

select distinct math from exam_result;

在这里插入图片描述

2.5 where条件筛选

比较运算符:
在这里插入图片描述

注意=不可直接用于NULL值比较,可以使用<=>进行比较
在这里插入图片描述
null不参与运算(前篇介绍了)

逻辑运算符:

在这里插入图片描述
接下来结合实例,了解运算符的使用
在这里插入图片描述

1、查找students表中qq为空的

select name,qq from students where qq<=>null;

在这里插入图片描述

select name,qq from students where qq is null;

在这里插入图片描述

2、查找students表中qq不为空的

select name,qq from students where qq is not null;

在这里插入图片描述

在这里插入图片描述

3、英语不及格的同学及英语成绩 ( < 60 )

select name,english from exam_result where english <60;

在这里插入图片描述
4、语文成绩在 [80, 90] 分的同学及语文成绩

select name,chinese from exam_result where chinese >= 80 and chinese < 90;

在这里插入图片描述

select name,chinese from exam_result where chinese between 80 and 90;

在这里插入图片描述
注意使用between...and...查找的区间为闭区间

5、数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩

select name,math from exam_result where math=58 or math=59 or math=99 or math=98;

在这里插入图片描述

select name ,math from exam_result where math in(58,59,98,99);

在这里插入图片描述

6、姓孙的同学

LIKE 模糊匹配:% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

select id,name from exam_result where name like '孙%';

在这里插入图片描述
%表示可以匹配任意多字符。

7、孙某同学

select id,name from exam_result where name like '孙_';

在这里插入图片描述
_表示仅匹配一个字符。

8、语文成绩好于英语成绩的同学

select name,chinese,english from exam_result where chinese > english;

在这里插入图片描述
9、总分在 200 分以下的同学

select name,chinese+math+english from exam_result where chinese+math+english <200;

在这里插入图片描述

10、语文成绩 > 80 并且不姓孙的同学

select name,chinese from exam_result where chinese >80 and name not like '孙%';

在这里插入图片描述

11、孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80

select name,chinese,math,english,chinese+math+english '总分' 
from exam_result where name like '孙_' or (chinese+math
+english >200 and chinese <math and english > 80); 

在这里插入图片描述

2.6 order by语句(结果排序)

  • ASC 为升序(Ascending)(从小到大)
  • DESC 为降序(Descending)(从大到小)

不做显示声明默认为 ASC方式排序并且没有order by子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
MySQL中认为NULL值是最小的

SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

1、同学及数学成绩,按数学成绩升序显示

select name,math from exam_result order by math asc;

在这里插入图片描述

2、查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示

SELECT name, math, english, chinese 
FROM exam_result 
ORDER BY math DESC,    -- 数学降序english ASC,  -- 英语升序(默认可省略 ASC)chinese ASC;  -- 语文升序(默认可省略 ASC)

在这里插入图片描述

3、查询同学及总分,由高到低

select name,chinese+math+english total from exam_result 
order by chinese+math+english desc;

在这里插入图片描述

在这里插入图片描述
这种写法在标准sql中是不支持的,这里可以直接使用chinese+math+english的别名total进行排序操作,是因为该版本做了特殊处理,而在where的操作下则不被允许:
在这里插入图片描述
出现这种差异是因为sql语句的执行顺序造成的,where 子句在 select之前执行,此时 total 别名尚未生成,因此无法引用。

标准 SQL 执行顺序(理论上会报错)

  1. FROM exam_result
    读取表数据。
  2. WHERE(隐式)
    无过滤条件,保留所有行。
  3. 计算表达式
    计算 chinese + math + english,但此时未命名为 total
  4. ORDER BY total DESC
    报错totalSELECT 中定义的别名,此时尚未生效。

MySQL 的实际执行流程(允许 ORDER BY 引用别名)

  1. FROM + 计算表达式
    读取表数据,并计算 chinese + math + english暂存结果(未命名)。
  2. ORDER BY total DESC
    MySQL 允许 ORDER BY 引用尚未正式定义的别名,实际使用步骤 1 中暂存的计算结果进行排序。
  3. SELECT name, … AS total
    将排序后的结果命名为 total,返回最终结果集。

可以对执行顺序理解为:1、from:先确定操作表 2、where:确定执行条件 3、根据执行条件去表中筛选

2.6 limit的使用(筛选分页结果)

select * from exam_result limit N;//N表示行数

在这里插入图片描述

select * from exam_result limit pos,len;//从pos行开始,筛选len行数据

在这里插入图片描述
可以看出表中起始行的下标是从0位置开始的。

select * from exam_result limit len offset pos;//从pos位置开始获取len行

在这里插入图片描述

三、Update更新修改

UPDATE table_name
SET column1 = expr1,      -- 要更新的列及值column2 = expr2       -- 可同时更新多列
[WHERE condition]         -- 过滤条件(必加!避免全量更新)
[ORDER BY column ASC/DESC] -- 可选:指定更新顺序
[LIMIT row_count];        -- 可选:限制更新行数

1、将孙悟空同学的数学成绩变更为 80 分

update exam_result set math=80 where name='孙悟空';

在这里插入图片描述
2、将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

update exam_result set math=60,chinese=70 where name='曹孟德';

在这里插入图片描述

3、将所有同学的数学成绩+30分

update exam_result set math=math+30;

在这里插入图片描述
这里可以配合上面介绍的各种方法来完成操作,大家自己尝试吧

四、Delete删除

DELETE FROM table_name
[WHERE condition]         -- 过滤条件(必加!避免全量删除)
[ORDER BY column ASC/DESC] -- 可选:指定删除顺序
[LIMIT row_count];        -- 可选:限制删除行数

1、删除孙悟空同学的考试成绩

delete from exam_result where name='孙悟空';

在这里插入图片描述

2、 删除整张表数据

准备测试表:

CREATE TABLE for_delete (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');
delete from for_delete;

在这里插入图片描述
在这里插入图片描述
可以看到,当我们删除整张表达数据后,递增关键字并不会被重置。

补充:截断表TRUNCATE

TRUNCATE [TABLE] table_name

功能:彻底清空表中所有数据,保留表结构(列定义、索引、约束等)。

不同直接delete的是:

  • 只能对整表操作,不能像 DELETE 一样可以针对部分数据操作;
  • 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE删除数据的时候,并不经过真正的事务,所以无法回滚。
  • 会重置 AUTO_INCREMENT 项
  • 并且不会记录日志 bin log
    在这里插入图片描述

五、插入查询结果

在执行此类操作时我们需要保证,整个操作过程要么完全成功并生效,要么完全失败且不留下任何修改痕迹,绝对不允许出现 “部分完成” 的中间状,即原子性。

为什么需要保证原子性?
想象一个去重场景:假设表中有 1000 条重复数据,计划删除 900 条重复项。如果操作中途因停电、网络中断或 SQL 错误终止:

  • 没有原子性保障: 可能只删除了 500 条,剩下 500 条重复数据未处理,导致数据处于 “半去重” 的混乱状态,后续难以恢复;
  • 有原子性保障: 无论中途发生什么,数据库会自动回滚到操作前的状态,数据仍保持 1000 条重复数据,不会留下中间痕迹。

原子性的本质是 避免数据因意外中断而损坏,确保数据始终处于安全且可预期的状态。

INSERT INTO table_name [(column [, column ...])] SELECT ...

示例:删除表中的的重复复记录,重复的数据只能有一份

如果在原表中直接操作,当碰到特殊情况(如:操作执行一般,断网、断电导致操作不完整,所有直接在原表中操作是不安全的)。

准备测试表
CREATE TABLE duplicate_table (id int, name varchar(20));INSERT INTO duplicate_table VALUES
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');

思路:

1、 创建一张空表 no_duplicate_table,结构和 duplicate_table 一样

CREATE TABLE no_duplicate_table LIKE duplicate_table;

2、 将 duplicate_table 的去重数据插入到 no_duplicate_table

INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;

3、通过重命名表,实现原子的去重操作

RENAME TABLE duplicate_table TO old_duplicate_table,
no_duplicate_table TO duplicate_table;

在这里插入图片描述

本篇文章就到这里了,余下内容放在下篇介绍,我会将文章链接补充在结尾处,肝文不易,三连回血!!!!!!

MySQL约束

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL约束:数据完整性的守护者

在SQL中&#xff0c;约束&#xff08;Constraints&#xff09; 是作用于数据库表字段上的规则&#xff0c;用于强制保证数据的完整性、准确性和一致性。当插入、更新或删除数据时&#xff0c;约束会自动验证操作是否符合规则&#xff0c;若违反则拒绝执行。 以下是SQL中常见的约…

Springboot-vue 地图展现

在很多社区管理系统中&#xff0c;地图展示功能是一个重要的模块&#xff0c;它能直观地呈现小区的地理位置分布。本文将详细梳理从前端触发请求到地图上展示小区数据的完整流程&#xff0c;帮助大家理解前后端协同工作的具体细节。一、前端触发&#xff1a;页面加载与地图初始…

Vue 3 登录组件

Login.vue 组件详细分析整体架构 Vue 3 登录组件&#xff0c;采用 Composition API Element Plus UI 库&#xff0c;实现了完整的用户认证界面。 模板结构分析 1. 容器布局 <div class"login-container"><el-card class"login-card"><!-- …

小结: getSpringFactoriesInstances从 `spring.factories` 文件中加载和实例化指定类型的类

getSpringFactoriesInstances 方法工作原理 getSpringFactoriesInstances 是 Spring Boot 框架中的一个核心方法&#xff0c;用于从 spring.factories 文件中加载和实例化指定类型的类。这是 Spring Boot 实现自动配置和插件化扩展的关键机制。 1. 基本功能 该方法的主要作用是…

selenium SessionNotCreatedException问题解决办法

在上周有一台服务器重启之后&#xff0c;Chrome浏览器也自动升了级&#xff0c;原本能够正常使用的自动化办公程序突然没法用了&#xff0c;出现了下面的报错提示。codes/addCancelBdld.py:980: DeprecationWarning: use options instead of chrome_optionsdriver webdriver.C…

SOAP HTTP Binding

SOAP HTTP Binding 引言 SOAP(Simple Object Access Protocol)是一种轻量级、简单的协议,用于在网络上交换结构化信息。它广泛应用于Web服务中,用于实现不同系统和应用程序之间的通信。SOAP HTTP Binding是SOAP协议的一种实现方式,它允许使用HTTP协议来传输SOAP消息。本…

GPT-5免费使用教程(国内可访问)

GPT-5来了&#xff0c;压力给到各大AI模型厂商&#xff1f; 北京时间2025年8月7日&#xff0c;OpenAI 推出两款开源模型 gpt-oss-120b / 20b&#xff0c;性能逼近 o4-mini/o3-mini&#xff0c;一时间火爆AI圈&#xff1b;但这好像只是一道开胃小菜&#xff0c;在北京时间2025年…

内存作假常见方案可行性分析

内存作假通常修改所涉及到的几个文件&#xff1a;M sys/frameworks/base/core/java/android/app/ActivityManager.javaM sys/frameworks/base/core/jni/android_os_Debug.cppM sys/frameworks/base/core/jni/android_util_Process.cppM sys/frameworks/base/services/core/java…

C#(vs2015)利用unity实现弯管机仿真

以下是基于 Visual Studio 2015 和 Unity 实现弯管机仿真的完整技术流程&#xff0c;结合工业仿真开发的最佳实践整理而成&#xff0c;涵盖建模、通信、运动控制和交互逻辑等核心模块&#xff1a;---一、环境配置与基础框架搭建 1. Unity 与 VS2015 联动 - 安装 [Visual Studio…

华为USG防火墙双机,但ISP只给了1个IP, 怎么办?

华为USG防火墙双机&#xff0c;但ISP只给了1个IP&#xff0c; 怎么办&#xff1f; 华为USG双机使用VRRP&#xff0c;需要3个Ip 本次联通只给了 100.1.1.0/30 这一个互联段 联通侧用了100.1.1.1&#xff0c; 我们这一侧只有100.1.1.2 怎么办&#xff1f; 找联通多要几个Ip&…

Go 工具链环境变量实战:从“command not found”到工具全局可用的全流程复盘

在 Go 生态里&#xff0c;丰富的命令行工具极大提升了开发效率。但很多小伙伴第一次用 go install 安装第三方工具后&#xff0c;却遇到终端里找不到命令的尴尬——明明装好了&#xff0c;终端却报 “command not found”。这是为什么呢&#xff1f;本文结合我亲身踩过的坑&…

MCU 软件断点注意事项!!!

——为什么调试器会在运行中改我的Flash程序&#xff1f;调试单片机时&#xff0c;很多人都有这样的疑问&#xff1a;明明我在调试前刷进去的固件是好的&#xff0c;为什么加了一个断点之后&#xff0c;调试器居然去改了 Flash&#xff1f; 如果我拔掉调试器&#xff0c;这个固…

腾讯iOA:数据安全的港湾

声明&#xff1a;文章为本人真实测评&#xff0c;非广告&#xff0c;无推广&#xff0c;为用户体验文章 前言 当前网络安全威胁日益复杂化&#xff0c;恶意软件攻击手段不断升级。例如&#xff1a;钓鱼邮件携带的伪装安装包可能引发勒索病毒在内网扩散&#xff0c;导致业务中断…

相册管理系统介绍

之前在github和gitee上了找了好久也没找到符合自己需求的相册管理系统&#xff0c;最近就静下心来自己写了一套。系统分为前台相册系统与后台管理系统。 技术框架采用的是前端vueelementui&#xff0c;后端springbootmybatisplus。 下面是项目截图&#xff1a;项目功能介绍&…

企业级高性能WEB服务器Nginx

nginx安装 1.nginx编译安装 #在nginx官网获取安装包 [rootwebserver mnt]# wget https://nginx.org/download/nginx-1.24.0.tar.gz#解压安装包 [rootwebserver mnt]# tar zxf nginx-1.24.0.tar.gz [rootwebserver mnt]# cd nginx-1.24.0/#安装编译nginx需要的环境软件 [rootw…

【Node.js从 0 到 1:入门实战与项目驱动】1.3 Node.js 的应用场景(附案例与代码实现)

文章目录1.3 Node.js 的应用场景&#xff08;附案例与代码实现&#xff09;1.3 Node.js 的应用场景&#xff08;附案例与代码实现&#xff09;一、Web 服务器开发二、API 开发三、命令行工具&#xff08;CLI&#xff09;开发四、实时应用开发小结1.3 Node.js 的应用场景&#x…

No time to train! Training-Free Reference-Based Instance Segmentation之论文阅读

摘要 图像分割模型的性能历来受到大规模标注数据收集成本高昂的制约。Segment Anything Model&#xff08;SAM&#xff09;通过一种可提示、与语义无关的分割范式缓解了这一根本问题&#xff0c;但在处理新图像时&#xff0c;仍然需要手动提供视觉提示或依赖复杂的领域相关提示…

本地文件夹与 GitHub 远程仓库绑定并进行日常操作的完整命令流程

以下是将本地文件夹与 GitHub 远程仓库绑定并进行日常操作的完整命令流程&#xff0c;特别针对你的需求&#xff08;忽略数据集、偏好使用 rebase 保持主分支整洁&#xff09;进行了优化&#xff1a; 一、初始设置&#xff08;首次绑定&#xff09;在本地项目文件夹初始化 Git …

windows10 ubuntu 24.04 双系统 安装教程

准备windows安装包解压到u盘中作为启动盘准备ubuntu安装包https://ubuntu.com/download/desktop/thank-you?version24.04.3&architectureamd64<strue解压到u盘中作为启动盘准备磁盘分区安装windows操作系统安装disk geniusWindows 三个NTFS的分区System: windows操作系…

腾讯前端面试模拟详解

以下是腾讯及腾讯音乐娱乐&#xff08;TME&#xff09;前端岗位高频手撕题目详解&#xff0c;结合真题及考察要点整理&#xff0c;覆盖面试核心考点&#xff1a;⚙️ 一、核心手撕题&#xff08;腾讯/TME 必考&#xff09; 1. Promise 并发控制&#xff08;90%场次出现&#xf…