MySQL增删改查(进阶)

news/2025/2/27 7:30:37

对于数据库的增删改查除了最基础的操作以外,我们还有进阶版,也就是可以使用一些其他的语句查询到更加精准的数据

基础: MySQL增删改查(基础)

数据库约束

约束类型

类型

说明

NOT NULL

表示某列不能存储 NULL 值

UNIQUE

某列的每行的所有值都必须唯一,不能有重复的

DEFAULT

某列设置之后,如果一行没有输入值,那么就会设置默认值

PRIMARY KEY

表示该字段是一个主键,主键就是 NOT NULL 和 UNIQUE 的结合

FOREIGN KEY

保证一个表中的数据匹配另一个表中的值的参照完整性

CHECK

保证列中的值符合指定的条件

例子:

CREATE TABLE `t_article`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号,主键自增',
  `boardId` bigint NOT NULL COMMENT '关联板块编号',
  `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '帖子标题',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '帖子正文',
  `visitCount` int NOT NULL DEFAULT 0 COMMENT '访问量',
  `state` tinyint NOT NULL DEFAULT 0 COMMENT '状态 0-正常 1-禁用',
  `deleteState` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除 0-否 1-是',
  `createTime` datetime NOT NULL COMMENT '创建时间,精确到秒',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

设计表

表的设计往往会根据基本原则,其中基本原则就是三大范式: 一对一、一对多、多对多

同时在设计时,我们也会根据 实体-关系图 来进行设计,也就是ER图,一般的ER图必须要有:实体、属性、关系和基数,其中分别用矩形、椭圆形、菱形和(1,N,M)来表示

以下我将用ER图来展示简单的三大范式

一对一

一对多

多对多

新增

在插入时,我们除了最基础的插入,还可以同时进行查询,一般是用于将一个表的信息,插入另一个表中,也就是复制

语法:

INSERT INTO 表1(表1字段名,表1字段名,表1字段名,…) SELECT * FROM 表二; 

例子:

CREATE TABLE student1(
        ClassID VARCHAR(20),
        ClassName VARCHAR(50),
        TeacherID VARCHAR(20)
);

INSERT INTO student1(ClassID,ClassName,TeacherID) SELECT * FROM classes; 

SELECT * FROM student1;

查询

其实查询也有很多种类,不同表之间只要有相同的字段,就可能合在一起查询,同时对于记录也是在不修改原记录数据的情况下进行数据操作

聚合查询

指通过对一组数据进行计算,返回一个汇总结果的查询操作。它通常用于统计、分析和总结数据,而不是返回原始数据。聚合查询的核心是使用聚合函数,这些函数对一组值进行计算并返回单个值。

1.聚合函数

函数

说明

COUNT()

返回查询到的数据的 数量

SUM()

返回查询到的数据的 总和,不是数字就没有意义

AVG()

返回查询到的数据的 平均值,不是数字就没有意义

MAX()

返回查询到的数据的 最大值,不是数字就没有意义

MIN()

返回查询到的数据的 最小值,不是数字就没有意义

语法:

-- COUNT()
SELECT COUNT(*) FROM 表名 (WHERE 条件);
SELECT COUNT(0) FROM 表名 (WHERE 条件);

-- SUM()
SELECT SUM(字段名) FROM 表名 (WHERE 条件);

-- AVG()
SELECT AVG(字段名) FROM 表名 (WHERE 条件);

-- MAX()
SELECT MAX(字段名) FROM 表名 (WHERE 条件);

--MIN()
SELECT MIN(字段名) FROM 表名 (WHERE 条件);

例子:

SELECT COUNT(*) FROM students;

2.GROUP BY

在使用这个关键字的时候,要查询的信息必须是聚合函数,或者关键字包含的列

切记 ORDER BY 和 GROUP BY 是不一样的!!! 一个是用来排序的,一个是用来分组的! 

语法:

SELECT 聚合函数 (,其他字段) FROM 表名 GROUP BY 字段名(这是分组条件,是表名中的字段名);

例子:

SELECT ClassID, COUNT(*) FROM students GROUP BY ClassID;

HAVING

当我们对数据进行分组查询时,如果我们需要对查询的结果进行条件过滤时(也就是使用普通语句的 WHERE 关键字进行查询),是不能使用WHERE关键字的,需要使用HAVING

语法:

SELECT 聚合函数 (,其他字段) FROM 表名 GROUP BY 字段名(这是分组条件,是表名中的字段名) HAVING 条件;

例子:

SELECT ClassID, COUNT(*) FROM students GROUP BY ClassID HAVING ClassID='001';

联合查询

在实际开发的过程中,我们往往需要使用多个表一起来存储数据,所以我们经常会使用多表查询来获得想要的结果,而多表查询的数据就是使用笛卡尔积后的结果

内连接

语法:

SELECT 字段 FROM 表1 表1别名,表2 表2别名 WHERE 连接条件 AND 其他条件;
SELECT 字段 FROM 表1 表1别名 INNER JOIN 表2 表2别名 ON 连接条件 AND 其他条件;
-- 连接条件往往是使用要联合一起的表中共同存在的 字段

例子:

SELECT * FROM students s,classes c WHERE s.ClassID=c.ClassID;

外连接

外连接分为左右两种,当使用联合查询之后,左侧的表完全显示我们就说是左外连接,右侧的表完全显示就是我们所说的右外连接

语法:

-- 左外连接 将表1完全显示
SELECT 字段名 FROM 表1 LEFT JOIN 表2 ON 连接条件;
-- 右外连接 将表2完全显示
SELECT 字段名 FROM 表1 RIGHT JOIN 表2 ON 连接条件;

子查询

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

单行子查询

语法:

SELECT 字段 FROM 表名 WHERE 条件(SELECT 字段 FROM 表明 WHERE 条件);

例子:

SELECT * FROM students WHERE ClassID=(SELECT ClassID FROM students WHERE StudentName='小明');

多行子查询

返回多行记录的子查询

(NOT) IN 关键字
SELECT 字段 FROM 表名 WHERE 字段 (NOT) IN (SELECT 字段 FROM 表名 WHERE 条件);

SELECT * FROM students WHERE ClassID IN (SELECT ClassID FROM students WHERE StudentName='小明');
(NOT) EXISTS 关键字
SELECT 字段 FROM 表名 WHERE (NOT) EXISTS (SELECT 字段 FROM 表名 WHERE 条件);

SELECT * FROM students WHERE EXISTS (SELECT ClassID FROM students WHERE StudentName='小明');

合并查询

在实际应用中,为了合并多个SELECT的执行结果,可以使用集合操作符 union、union all 

使用时,前后查询的结果集中,字段需要一致

union

该操作符用于取得两个结果集的并集.在使用这个操作符的时候,会自动去掉结果集中的重复行

SELECT 字段 FROM 表名 WHERE 条件 UNION SELECT 条件 FROM 表名 WHERE 条件;
union all

该操作符用于取得两个结果集的并集.在使用这个操作符的时候,但是不会去掉重复行

SELECT 字段 FROM 表名 WHERE 条件 UNION ALL SELECT 条件 FROM 表名 WHERE 条件;


http://www.niftyadmin.cn/n/5869726.html

相关文章

无人设备遥控器之视频回传篇

无人设备遥控器的视频回传是指将无人设备(如无人机)采集到的视频信号传输回遥控器或其他接收设备的过程。这一技术在诸多应急情境中显得尤为重要,如森林防火、消防救援、防汛等,它能为指挥中心的决策者、调度系统以及AI分析等提供…

React低代码项目:用户登陆

吐司问卷:用户登陆 Date: February 17, 2025 4:12 PM (GMT8) JWT **概念:**登陆成功后,服务端返回一个 token JWT组成: JWT 由三个部分组成:头部(Header)、载荷(Payload&#xf…

Selenium 调用模型接口实现功能测试

要使用 Selenium 调用模型接口实现功能测试,可按以下步骤进行: 1. 环境准备 安装 Selenium:使用 pip install selenium 安装 Selenium 库。安装浏览器驱动:根据使用的浏览器(如 Chrome、Firefox 等)下载对应的驱动,并将其添加到系统的环境变量中。例如,Chrome 浏览器需…

【Jenkins】一种灵活定义多个执行label节点的jenkinsfile写法

确定执行机器和自定义工作目录(忽略节点的workspace) pipeline{agent {node {label "XXXXX"customWorkspace "E:/workspace/"}}parameters {}options {}stages {}post {} }仅确定执行机器 pipeline{agent { label "XXXXX&quo…

CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀

近日,永洪科技在CSDN(中国专业开发者社区)的年度评选中,凭借在人工智能技术创新与vividime在行业应用中的卓越表现,一举斩获“人工智能企业”及“智能应用”双料大奖。这一荣誉不仅彰显了永洪科技在AI领域的领先地位&a…

ExpMoveFreeHandles函数分析和备用空闲表的关系

第一部分:ExpMoveFreeHandles和备用空闲表的关系 ULONG ExpMoveFreeHandles ( IN PHANDLE_TABLE HandleTable ) { ULONG OldValue, NewValue; ULONG Index, OldIndex, NewIndex, FreeSize; PHANDLE_TABLE_ENTRY Entry, FirstEntry; EXHAND…

计算机网路:自顶向下方法——第三章 运输层

本博客是通过学习中国科大郑烇老师的计算机网络课程所写的笔记 网络层实现主机之间的逻辑通信,而传输层实现不同主机的进程之间的逻辑通信 传输层不提供保证时延、保证带宽的服务 一、多路复用与多路分解 将主机之间的交付扩展到不同主机的进程间的交付&#xff…

使用OpenCV实现帧间变化检测:基于轮廓的动态区域标注

在计算机视觉中,帧间差异检测(frame differencing)是一种常用的技术,用于检测视频流中的动态变化区域。这种方法尤其适用于监控、运动分析、目标追踪等场景。在这篇博客中,我们将通过分析一个基于OpenCV的简单帧间差异…