MySQL增删改查(进阶)

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

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

数据库约束

约束类型

|-------------|---------------------------------------|
| 类型 | 说明 |
| NOT NULL | 表示某列不能存储 NULL 值 |
| UNIQUE | 某列的每行的所有值都必须唯一,不能有重复的 |
| DEFAULT | 某列设置之后,如果一行没有输入值,那么就会设置默认值 |
| PRIMARY KEY | 表示该字段是一个主键,主键就是 NOT NULL 和 UNIQUE 的结合 |
| FOREIGN KEY | 保证一个表中的数据匹配另一个表中的值的参照完整性 |
| CHECK | 保证列中的值符合指定的条件 |

例子:

sql 复制代码
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图来展示简单的三大范式

一对一

一对多

多对多

新增

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

语法:

sql 复制代码
INSERT INTO 表1(表1字段名,表1字段名,表1字段名,...) SELECT * FROM 表二; 

例子:

sql 复制代码
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() | 返回查询到的数据的 最小值,不是数字就没有意义 |

语法:

sql 复制代码
-- 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 条件);

例子:

sql 复制代码
SELECT COUNT(*) FROM students;

2.GROUP BY

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

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

语法:

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

例子:

sql 复制代码
SELECT ClassID, COUNT(*) FROM students GROUP BY ClassID;

HAVING

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

语法:

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

例子:

sql 复制代码
SELECT ClassID, COUNT(*) FROM students GROUP BY ClassID HAVING ClassID='001';

联合查询

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

内连接

语法:

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

例子:

sql 复制代码
SELECT * FROM students s,classes c WHERE s.ClassID=c.ClassID;

外连接

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

语法:

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

子查询

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

单行子查询

语法:

sql 复制代码
SELECT 字段 FROM 表名 WHERE 条件(SELECT 字段 FROM 表明 WHERE 条件);

例子:

sql 复制代码
SELECT * FROM students WHERE ClassID=(SELECT ClassID FROM students WHERE StudentName='小明');
多行子查询

返回多行记录的子查询

(NOT) IN 关键字
sql 复制代码
SELECT 字段 FROM 表名 WHERE 字段 (NOT) IN (SELECT 字段 FROM 表名 WHERE 条件);

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

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

合并查询

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

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

union

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

sql 复制代码
SELECT 字段 FROM 表名 WHERE 条件 UNION SELECT 条件 FROM 表名 WHERE 条件;
union all

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

sql 复制代码
SELECT 字段 FROM 表名 WHERE 条件 UNION ALL SELECT 条件 FROM 表名 WHERE 条件;
相关推荐
汤汤upup4 分钟前
面试八股文--数据库基础知识总结(1)
数据库·sql·oracle
灰色人生qwer6 分钟前
数据库的常见权限作用
数据库·oracle
Lizhihao_23 分钟前
JAVA-如何理解Mysql的索引
数据库·mysql
stanwang1 小时前
为什么非唯一索引会触发间隙锁?
数据库
梦醒沉醉1 小时前
HBase与MapReduce结合(一)——HBase表中插入数据
数据库·hbase·mapreduce
土豆炒马铃薯。1 小时前
彻底卸载MySQL
java·开发语言·前端·数据库·mysql·删除·数据
攻城狮_Dream2 小时前
基于 Python 的项目管理系统开发
android·数据库·python
昨今2 小时前
学习Flask:[特殊字符] Day 3:数据库集成
数据库·学习·flask
nixiaoge2 小时前
seacms v9 实现的MySQL注入
数据库·网络安全
无难事者若执3 小时前
知识图谱-Neo4j-开始构建知识图谱-01
数据库·知识图谱·neo4j