MySQL初阶学习日记(3)--- 增查改删(CRUD)

我们今天学习数据的基本操作增删改查的增(insert)查(retrieve)改(update)删(delete)

1.增(Insert)

这里的增加即插入又分为两种:全列插入和指定列插入。

1.1 全列插入

全列插入要求:需要按照表的结构插入元素

1.1.1 插入一行
sql 复制代码
insert into 表名 values(列1,列2...);

这里,我们到 navicat 中实操一下

1.1.2 插入多行
sql 复制代码
insert into 表名 values
(列1,列2),
(列1,列2),
(列1,列2);

实际演示:(这里要注意标点符号的中英文版本)

1.2 指定列插入

特点:只插入指定的列,其他列的为默认值或者 NULL

基本语法:

sql 复制代码
insert into 表名(指定列名1,指定列名2) values(列1,列2);

1.3 隐式类型转换

MySQL 在实际插入过程中会存在隐式类型转换,即如果插入的数据的数据类型与目标不匹配,会自动进行隐式类型转换。常见的转换场景:字符串转数字、数字转字符串等。

1.3.1 字符串转数字
1.3.2 数字转字符串
1.3.3 隐式转换的存在的潜在问题和风险

1)索引失效(这里的索引后面的笔记中会讲到)

当对索引列进行隐式类型转换时,MySQL 可能会无法使用索引

2)数据丢失和截断

在字符串转数字时,MySQL 会从左到右截取连续数字部分,忽略后续非数字字符

2.查(Retrieve)

2.1 SELECT(select)

2.1.1 全列查询
sql 复制代码
select * from + 表名;

在演示前我们可以先构建一个表再插入一点数据。

sql 复制代码
*创建一个成绩表
 create table exam(
 id bigint,
 name varchar(20) comment '同学姓名',
 chinese float comment '语文成绩',
 math float comment '数学成绩',
 english float comment '英语成绩'
 );
 *构建测试数据
 insert into exam(id,name,chinese,math,english) values 
 (1,"孙悟空",100,89,96),
 (2,"孙行者",98,90,56),
 (3,"行者孙",78,80,88),
 (4,"弼马温",84,78,72),
 (5,"齐天大圣",89,60,66),
 (6,"六耳猕猴",54,90,79);

通过 navicat 进行查询,验证:

2.1.2 指定列查询

指定列查询,可以查询多列也可以只查询一列

sql 复制代码
select 需要查询的列(多个列之间可以用逗号隔开) from 表名;

上图是我们在经过全列查询后的结果,如果我们只想知道语文成绩,就可以使用指定列查询,只查询姓名和语文成绩

2.1.3 查询字段为表达式

我们可以在 select 后面加上一些表达式使查询出来的表格符合我们的预期

示例一:我们现在需要在所有人的数学成绩上加上 10 分

我们可以用

sql 复制代码
select name,math+10 from exam;

查询结果对比:

示例二:我们现在需要统计每个同学的三科成绩汇总

2.1.4 为表达式结果指定别名

我们不难发现上述两个场景中,当我们使用了表达式后表名会发生变化,有些可能会比较不直观,此时我们就可以使用 as ,为表达式设置一个别名

2.1.5 结果去重查询

经过查询表格,我们不难发现数学成绩会出现重复的,如果我们想要在结果集中去除重复记录,可以使用distinct

我们这时候可能会担心,这样重复的数据会不会被删除?实际上,我们 select 出来的结果集都只是一个临时表,它并不会改变数据库中的原有数据

2.2 WHERE(where)

基本语法:

sql 复制代码
select 查询的列 from 表名 where 条件;
2.2.1 基本查询

接下来是一些举例

示例一:想要查询语文成绩不及格的同学,我们可以使用 where 把条件设为 chinese < 60;

示例二:查询总分在 250 分以下的同学

注意这里不可以直接使用别名 sum 进行查询,不然会出现报错

这里主要与我们MySQL查询语句的执行顺序有关,介绍一下 MySQL 查询语句的执行顺序:FROM (确定数据来源)→ JOIN(多表连接) → ON(多表连接时过滤) → WHERE (条件查询)→ GROUP BY (分组查询)→ HAVING(分组后过滤) → SELECT(选择返回列) → DISTINCT(去重) → ORDER BY(排序) → LIMIT(限制)

所以当我们开始执行 where 条件查询时,select 设置的表名还未执行,所以会报错

2.2.2 AND 和 OR

andor ,一个表示且,一个表示或,也是我们条件查询里经常用到的,使用很简单,放在where 语句里就可以了

示例一:查询语文成绩大于 90 且数学成绩大于 80 的同学

示例二:查询数学成绩大于 85 或者英语成绩大于 85 的同学

2.2.3 范围查询

范围查询适用于当我们要查询在某个范围的数据时,此时我们可以用 between and**/ and / in** 来实现

示例:查询语文成绩在 [ 80,90 ] 的同学

1)使用 between and

2)使用 and

3)使用 in

2.2.4 模糊查询

模糊查询(like)主要搭配通配符使用,主要有两个,一个是 % ,可以代表 0 个或者任意个字符;另一个是**_** ,可以代表一个任意字符

演示前先展示一下我们现在表中的数据

示例一:查询所有姓孙的同学

此时,我们可以使用 孙% ,% 可以表示任意个字符

示例二:查询姓孙,但是名字是三个字的同学

此时我们就可以使用 孙_ _ ,_ 可以表示任意一个字符

2.2.5 NULL

空查询主要是用来排除某些空值的,便于我们比对数据

示例:计算这个班级的平均分

我们可能会遇到没有成绩的同学,此时他们就不能被加到平均分的计算,我们就需要排除那些没有成绩的同学,此时就可以用到非空查询is not null

在null这里还有一个需要注意的点:null 与任何值运算结果都为 null

2.3 Order by

我们可以用order by来对数据进行一个基本的排序,排序分两种,升序(asc)、降序(desc)如果没有特殊指定,一般默认为升序

示例一:把语文成绩从低到高排序

示例二:把英语成绩从高到低排序

这里的 null 在排序时,视为比任何值都小;且在 order by 排序时是可以使用别名的

2.4 分页查询

当我们的数据量比较大时,可以用分页查询对所有的数据进行一个分页

语法(常见的两种用法,比较建议用第二种):

sql 复制代码
**从0开始,筛选num条数据
select 列 from 表名 limit num;
**从start开始,筛选num条数据
select 列 from 表名 limit start,num;

示例一:查询第一页的数据(一页有5条数据)

示例二:按成绩的降序,查询第二页的数据

3.改(Update)

3.1 语法

sql 复制代码
update 表名 set 要修改的值 条件;

具体看示例,我这里写的语法可能会有点抽象,看示例就懂了

3.2 示例

示例一:将孙悟空的英语成绩变为100分

示例二:给每位同学的数学成绩都加5分

3.3 注意

这里有两个需要注意的地方

3.3.1 在原来的值做变更时,不能使用 " += "、" -= "这种类型的语法
3.3.2 使用 update,是永久性的修改,不是之前 select 只是生成一个临时表,而是原来的数据库中的值也会被修改

4.删除(Delete)

4.1 语法

sql 复制代码
delete from 表名 条件;

4.2 示例

示例一:删除数学成绩为空的同学的成绩

示例二:删除整张表

4.3 注意区别 delete 和 drop 的区别

delete只是删除表的内容,表头和表的整个结构还是在的;而drop 是将整个表都删除了

5.一些问题

5.1 SQL 中没有字符类型

SQL 有字符类型,但只是没有与 Java 中单个char类型完全对应的字符类型,在 Java 中,char是表示单个16位 Unicode 字符的基本数据类型。而在SQL中,字符数据都是以‌字符串‌的形式来处理的

5.2 SQL 不可以指定行插入

问题:我可以在一个有 5 行的数据表中选择把新的数据插入到第 3 行吗?

SQL中‌ 不能‌像在 Excel 表格里那样指定数据插入到第几行。

5.2.1 SQL表的数据存储特点‌

1)无序存储‌:数据库表本质上是一个无序的集合,行与行之间没有固定的物理位置顺序

2)逻辑排序 ‌:你看到的数据顺序通常是通过查询时的 order by子句临时确定的,并不是数据在磁盘上的实际存储位置

5.2.2 实际插入方式

当你执行 insert into语句时,新数据会被添加到表的末尾(从存储角度),但查询时可以通过排序条件让它显示在任何位置

5.3 正则表达式

正则表达式是一种强大的文本模式匹配工具,可以理解为一种 " 高级查找规则 " 。它使用特定符号来描述字符串的格式特征,帮你快速找到符合特定模式的文本内容‌。

5.3.1 MySQL 中的正则表达式使用

在 MySQL 中,主要通过regexpnot regexp操作符来使用正则表达式‌。

‌5.3.2 常用正则表达式符号
  • **^**匹配字符串开头
  • **$**匹配字符串结尾 ‌
  • . 匹配任意单个字符 ‌
  • [abc] 匹配 a、b 或 c 任意一个字符 ‌
  • * 匹配前面字符零次或多次 ‌
‌5.3.3 与增删改查的关系

正则表达式主要应用在‌**查询(查)**‌ 操作中,用于更灵活的文本筛选

5.4 潜水艇运算符

空值安全比较运算符

在 MySQL 8.0.22 版本中引入了 <=> 运算符,称为 " 空值安全等于运算符 " 。它和普通 **=**运算符的主要区别在于:

  • = :NULL = NULL 返回NULL

  • <=> :NULL <=> NULL 返回1(TRUE)

这个运算符因为能 " 安全地 " 处理NULL值的比较,被形象地称为 " 潜水艇运算符 "

5.5 order by 使用那种排序算法

MySQL 中 order by使用的排序算法主要取决于‌是否能够利用索引‌,具体分为两种情况

5.5.1 索引排序 ( Using Index )

当排序列有合适的索引时,MySQL 会直接利用 **B+**树索引的有序特性来返回结果,不需要额外的排序操作。

‌**适用条件:**‌

  • order by 使用的列是索引的最左前缀

  • where 条件与 order by 组合满足索引使用条件

5.5.2 文件排序 ( FileSort )

当无法使用索引时,MySQL 会进行文件排序,这个过程可能涉及:

**‌1)内存排序阶段:**‌

  • 使用‌快速排序‌算法对 sort_buffer 中的数据进行排序

**‌2外部排序阶段:**‌

  • 当数据量超过 sort_buffer 容量时,会使用‌归并排序‌算法合并临时文件

这部分的内容比较多,希望大家可以慢慢看,慢慢消化~

相关推荐
g***96901 小时前
MySQL版本选择与安装
数据库·mysql
c***72741 小时前
MySQL查看日志
数据库·mysql
222you1 小时前
MybatisPlus配置多数据源
数据库
丝斯20111 小时前
AI学习笔记整理(24)—— AI核心技术(深度学习8)
人工智能·笔记·学习
321茄子1 小时前
MySQL 事务隔离性及锁
java·数据库·mysql
j***89461 小时前
MySQL数据的增删改查(一)
android·javascript·mysql
凉、介1 小时前
Linux 下的 time_before/time_after 接口
linux·运维·服务器·学习
w***95491 小时前
MySQL无法连接到本地localhost的解决办法2024.11.8
数据库·mysql·adb
z***3351 小时前
PON架构(全光网络)
网络·数据库·架构