对于数据库的增删改查除了最基础的操作以外,我们还有进阶版,也就是可以使用一些其他的语句查询到更加精准的数据
基础: 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 条件;