MySQL增删改查(进阶)

发布于:2025-02-27 ⋅ 阅读:(10) ⋅ 点赞:(0)

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

基础: 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 条件;