MySQL 表的增删改查(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL 表的增删改查(上)

什么是 CURD



CURD 是针对于数据库的四个核心操作。


C:create (增)

U:update (改)

R:retrieve (查)

D:delete (删)


一、增加数据



1. insert into 语句


-- 默认将此表中的所有列都插入数据
insert into 表名 values (列的值);
-- 往表中的部分列中插入值,列数要和待插入的值的数量对应起来
insert into 表名(列A,列B...) values (值A,值B...);


2. insert 语句注意事项


注意①: 在 values 后面括号中,插入列的个数与表头约定的列数及其对应的类型,需要匹配。


注意②: 在 SQL 语句中表示字符串的时候,我们可以使用双引号,也可以使用单引号。因为在 SQL语句中,没有单独的字符类型。(但还是建议实用单引号)


注意③: 如果某一行是 datatime 类型,即日期类型,此时我们应该如何插入呢?


方式一:通过指定格式的字符串来插入一个指定的时间。


' YYYY-MM-DD hh:mm:ss '
年-月-日  时:分:秒

方式二:通过 now( ) 函数来插入一个当前的系统时间。


58082f67af104604a31884d164d3ccbf.png


注意④: 使用 insert into 语句进行插入的时候,同样也支持一次性插入多行。


insert into 表名 values (列的值), (列的值), (列的值)...;


( 一次插入 n 条记录的速度 ) 比 ( 一次插入一条记录,分 n 次插入) 要快好几倍,因为每次插入一条记录,客户端和服务器两者之间就要交互一次。


ce770e6867034c95b7ef48dbce6337ac.png


注意⑤: 如果需要插入中文,数据库可能会失败哦 ! 如果失败了,我们就可以将数据库给配置成中文(utf 8 编码方式 ),步骤如下:


步骤1:先查看当前数据库的编码方式,使用下面的 SQL 语句:


show variables like 'character%';


由于我的数据库的编码方式已经是 utf 8 编码方式了,当然,如果小伙伴的编码方式不是和我一样,也可以解决。


4839964e98cc4410a85628fb91a6cb08.png


步骤2:在 windows 【 服务 】中,打开 MySQL属性,如下界面,并复制红色框框中的文件路径。这个路径就是 MySQL 对应的配置文件的位置所在 。


image.pngimage.png


步骤3:用记事本打开红色框框中的 【my.ini】文件,并准备对其修改。注意,打开此文件时,我们需要备份一份,以防止修改出错的情况,这样我们还有挽回的余地 !!! 这在工作中,是一个良好的习惯 !


c3bb943ba4204b8da13c54b93966b4d6.png


步骤4:配置文件中的一些语法


#:表示注释
[client] :从这里往下,给客户端的配置项
[mysql]:从这里往下,客户端服务器都用到的配置项
[mysqld]:从这里往下,服务器的配置项


此时 我们需要改动两个地方,如下图的红色框框:


7e5fd830c2c54240a196a3310ffc822a.png


步骤5:最后两步:


  • 重启 MySQL / 重启电脑。
  • 把之前应用不了中文输入的数据库删了,重新创建新的数据库。


二、查询数据



查找语句是 SQL 中最核心也是最复杂的操作。


1. 全列查找


最基础的查找,全列查找,直接把一个表中的所有列和所有行都查询出来。下面为语法格式:


select * from 表名;
--其中 * 称为通配符,表示一个表中所有的列


通过上面的 select 语句,实查询的结果是一个 " 临时表 ",显然,这个表不是放在硬盘上,而是放在内存中,其在输出之后,数据就被释放了。


36a1783787d244eb83ea91320bfd4463.png


针对这个操作【 select * from 表名 】,是一个很危险的操作, 如果生产环境中保存的数据非常大,若是有几个 TB 级别,此时意味着 MySQL 服务器会疯狂地读取硬盘数据,而生产环境的服务器无时无刻地给用户提供响应,数据库瞬间就会崩坏 ! 那么会给用户带来严重的损失。


2. 指定列查找


指定列查找,顾名思义,只关注自己需要的列。相比于之前的全列查找,指定列查找的效率要高很多,用此方法也较为频繁。


select 列名,列名... from 表名;
-- 列名可以不管表中顺序,即可以乱序输出


同样地,此语句的查询结果,只是一个临时表。( 在客户端内临时保存的一个数据表,随着输出的进行,内存就被释放了。) 临时表的结果对于数据库服务器的原始数据没有任何影响。


3. 指定列查询为表达式


在查询的时候,我们甚至可以进行一些运算操作 ( 列和列之间 ),也就是说:针对指定列中的每一行数据都进行同样的运算。而行和行之间互不影响。


select 列名 (加减乘除) 列名... from 表名;


① 例如:我查询一个同学的数学成绩,我可以让其输出多 10 分。


96e5b9e0aba34b078a4f04d462c20d81.png


② 例如:我可以查询一个同学的总成绩,这是通过表中几个列一起相加的结果。


5f3df8b1802b478999c306fe4411832e.png


注意上面两个例子,select 语句操作的结果依旧是 " 临时表 ",这里的查询结果与数据库的持久数据不同,只能说明,数据库服务器针对查询的结果进行了加工,把加工后的数据作为临时表显示出来了。


这里同样需要注意一件事情:临时表的结果的数据类型不一定和原始的表的数据类型完全一致。比方说,我一开始为各门成绩设定为 3位 有效数字,当 select 查询并结算成绩总和的时候,可以设定为 4位有效数字。


4. 查询列指定别名


此操作相当于是给查询结果的临时表,指定新的列名。


select 列名 (加减乘除) 列名... as 自定义列名 from 表名;
其中 as 可以省略,但不建议省略
as 不省略更不容易出错,代码可读性也更高


例如:我们把一位同学的成绩相加之和的名字作为 total,如下图所示:


55c6222adfeb4d62b2cc1d770e235fe2.png


5. 查询结果去重


查询结果去重,是针对查询的结果,把重复的记录去掉,例如:同一列有两份及两份以上一样的数据,那么输出的时候只显示一份。


注意:如果是针对多个列来进行去重,此时多个列的值都相同才会去重。


select distinct 列名,列名... from 表名;


在下面程序中,我们发现,当使用 【distinct id, name】的时候,并没有将 id 多余的 1 去除掉,因为当 id, name 都有重复的时候,才能去重。


而我们单独使用 【distinct id】的时候,可以发现能够去重。


9722d760a6354795bab1d37a77c3028f.png


6. 针对查询结果进行排序


select 列名... from 表名 order by 列名 asc/desc;
-- asc:升序(ascend)
-- desc:降序(descend)
--如果不加 asc/desc,那么默认为是升序


0c5b520dafea4d279a77b75e38bd3a1c.png


注意事项:


① 有的数据库记录中是带有 NULL 值的,那么 NULL 就是被认为是最小的(所以,升序排序数据时,NULL 就在最前面,降序排序数据时,NULL 就在最后面。)

② 排序时,也可以依据表达式或别名来进行排序。


1067672934e54510af70a2c97dc0ed08.png


③ 排序时可以指定多个列来进行排序,如果第一个列结果相同,相同结果之间再通过第二个列来进行排序。(需要明确优先级)


也就是说:如果有多个列进行排序,所有的列都基于第一列的结果再次排序。

如下图分析,如果一位同学的语文成绩相同了,那么在此情况下,再去排序数学成绩。


1a930aa168c14cfeb1f3a1cad199dc09.png


7. select 中的条件查询


154503604d0243febc40e3a6ad08a16b.png


select 列名 from 表名 where 条件;


在 C/Java 中 " == " 表示比较相等,

而在 SQL 中," = " , " <=> " 都表示比较相等。

其中,SQL 中有一个特殊的语法:


NULL = NULL
=> 结果仍然是 NULL
其中 NULL 被认为是假,条件不成立
/
NULL <=> NULL
=> 结果是 真


注意事项:


① where 条件会针对查询结果进行筛选,服务器会遍历表中的每一条记录,如果记录符合条件,就会返回给客户端;反之,就跳过。显然,这里 select 语句依旧是创建了临时表。


325fbebb45914b799b9397bd68c88153.png


② 这里需要注意一点:比较两个列的时候,是针对同一行的不同列进行比较的,不涉及行和行之间的比较。


7f40dba016f747bb853e930213570845.png


③ where 后面的条件和 select 后面的表名之间没有任何关系。我们可以只比较两行,但输出五行。


3dc70f178a4b4264bc5e7b4834308186.png


④ where 语句不能使用别名。


6bdca604777c478eaf8873e1f80df062.png


⑤ 表达式中若有 and 和 or 同时存在,先计算 and,再计算 or,如果想要打破优先级,就需要加 ( ) 。这和 C/Java 中的语法十分相似。


⑥ between…and… 语句和 in( ) 语句的用法


between - and 侧重于范围(闭合),in( ) 语句侧重于精确某个值。


c3b555edb71e4fe3aaf6b0787a1e0f7d.png61e16c01a4324aeca0a891f16d2ba51c.png


8. 模糊查询 Like


模糊查询 like 可以搭配通配符来使用,只要查找的字符串符合此处描述的某个形式,就能被检索出来。


select 列名 from 表名 where '... %或_ ...'
-- 通配符 % :代表任意个任意字符(也包含 0 个字符)
-- 通配符 _  :代表一个字符


(1)

① 在下图中,我们查询一个人的姓氏为孙,那么可以采取 ’ 孙%’ 的形式。


705bf290fcfc40b48499d99aa3f3c930.png


注意,此时我们只能查找到任意以 ’ 孙 ’ 开头的字符串。但是类似于 【 aaa 孙,bbb 孙 ccc】,系统检索不出来,因为我们事先已经给系统约定了一个规则。

② 如果是 ’ %孙% ',我们可以匹配到下列字符串


aaa孙
aaa孙bbb
孙aaa


(2)


通配符 _    仅代表一个字符
两个 _ _    代表两个字符


2addc857adef4231a8715745118fc54a.png


9. 查询 NULL


select 列名... from 表名 where 列名 <=> null; //某列值是空值
select 列名... from 表名 where 列名 is null;  //某列值是空值
select 列名... from 表名 where 列名 is not null; //某列值不是空值


当我们使用 " select 列名 from 表名 where 列名 = null " 这条语句时,对于 ’ 杰克 ’ 来说,Chinese 成绩确实是空值,但此时相当于 " null = null " ,被视为 false,所以输出空集。


这样一来,还是建议大家使用上面的三条正确语句。另外,在 SQL 语句中,不区分大小写,所以 NULL 可以写成 null.


e93e8f856e18474fa0a430492cf763a8.png


10. 分页查询 limit


select 列名... from 表名 limit num;
select 列名... from 表名 limit num1 offset num2;
-- limit  限制查询的行数 num
-- offset 代表 num2 偏移 num1 的量



be60fb30e5134e73aa40c5cd707dfd0b.png


② limit 可以搭配其他的 SQL 语句,比方说查询一个班级里,分数排名的前三位同学的名字和分数。


710e5dc269fb44d9880b8eba86fd7ea8.png


③ 分页查询 及 limit 存在的意义:


上文提到,当我们使用【 select * from 表名; 】这条语句时,对于生产环境来说,是非常危险的 ! 因为当我们在服务器中的数据量巨大时,会让数据库崩溃。


那么,我们就可以使用 where 和 limit 来限制查找时的范围,这样一来,就会让此时的查找比全列查找轻松许多 !


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
45 0
|
3月前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
23天前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
39 3
|
1月前
|
关系型数据库 MySQL 大数据
C#使用SqlSugar操作MySQL数据库实现简单的增删改查
C#使用SqlSugar操作MySQL数据库实现简单的增删改查
142 2
|
21天前
|
关系型数据库 MySQL 数据库
MySQL数据库的增删改查
MySQL数据库的增删改查
12 0
|
28天前
|
SQL 关系型数据库 MySQL
"Python与MySQL的浪漫邂逅:一键掌握增删改查,开启你的数据库编程之旅!"
【8月更文挑战第21天】Python因其简洁的语法和强大的库支持,成为连接数据库的首选工具。本文介绍如何使用Python连接MySQL数据库并执行基本操作。首先需安装`mysql-connector-python`库。通过配置连接信息建立数据库连接后,可利用`cursor.execute()`执行SQL语句进行数据的增删改查,并通过`commit()`提交更改。查询时使用`fetchall()`或`fetchone()`获取结果。记得处理异常及关闭连接以释放资源。掌握这些基础,有助于高效进行数据库编程。
27 0
|
1月前
|
前端开发 Java 关系型数据库
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
141 0
|
2月前
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
|
2月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表
|
3月前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
56 2

热门文章

最新文章