【MySQL】表的增删查改

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

思维导图

学习目标

      CRUD:Create(创建),Retrieve(读取),Update(更新),Delete(删除)

一、Create(创建)

1.1 语法

insert into 表名 [选项1,选项2,选项3……] values (value_list);

举个例子:创建一张学生表:

CREATE TABLE students (
              id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
              sn INT NOT NULL UNIQUE COMMENT '学号',
              name VARCHAR(20) NOT NULL,
              qq VARCHAR(20)
        );

1.2 单行数据 + 全列插入

      插入两条记录,value_list的数量必须和定义表中的数量及顺序一致。注意,在插入的时候,也可以不用指定id(因为id是自增长,但是我们也是可以对id进行重新赋值),那么mysql会使用默认的值进行自增。

insert into student values(100, 1000, '唐三藏', NULL);
insert into student values(101, 1001, '孙悟空', '1111');

1.3 多行数据 + 指定列插入

      插入两条记录,value_list数量必须和指定列数量即顺序是一致的。

insert into student(sn, name) values(20001, '曹孟德');

1.4 插入否则更新

1.4.1 概念

由于主键或者唯一键对应的值已经存在而导致插入失败:

  • 主键冲突
  • 唯一键冲突

我们在插入数据时,可以选择性的进行同步更新操作。其语法:

insert .... on  duplicate key update 字段1 = XXX, 字段2 = XXX

1.4.2 我们可以根据插入后的提示来了解是否有数据冲突,数据是否已经更新?

0 row affected:   表中有冲突数据,但冲突数据的值和update的值相同
 
1 row affected:   表中没有冲突数据,数据被插入
 
2 row affected:   表中有冲突数据,并且数据已经被更新

同样,我们可以根据MySQL函数来获取受到影响的数据行数:

select ROW_COUNT();

                                     

1.5 替换

语法:

replace into students (sn, name) values (20001, '张三');

      这个语句的用法和1.4 中的语句的用法差不多,我们可以使用1.5中的语句进行冲突的更新,因为代码短。

  • 主键或者唯一键没有冲突,则直接插入
  • 主键或者唯一将如果有冲突,则删除后再插入
  • 1 row affected :表中没有数据冲突,数据被插入
  • 2 row affected :表中有数据冲突,删除后重新插入

二、Retrieve(读取)

2.1 语法:

SELECT
     [DISTINCT] {* | {column [, column] ...} //字段名字
     [FROM table_name]     // 数据表
     [WHERE ...]                    //条件
     [ORDER BY column [ASC | DESC], ...]  // 排序操作
     LIMIT ...        // 进行分页操作

创建一个例子:创建表结构

构建一个列子:-- 创建表结构
CREATE TABLE exam_result (
          id INT UNSIGNED PRIMARY KEY      
          AUTO_INCREMENT,
          name VARCHAR(20) NOT NULL COMMENT '同学姓名',
          chinese float DEFAULT 0.0 COMMENT '语文成绩',
          math float DEFAULT 0.0 COMMENT '数学成绩',
          english float DEFAULT 0.0 COMMENT '英语成绩'
);
-- 插入测试数据
INSERT INTO exam_result (name, chinese, math, english)   VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);

2.2 SELECT 列

2.2.1 全列查询

select * from 表名

通常条件下,不建议使用 * 进行全列查询:

  • 查询的列越多,意味着需要传输的数据量越大
  • 可能会影响到索引的使用

2.2.2 指定列查询

语法:

select 字段1(字段2,字段3……)  from 表名;  // 指定列的顺序不需要按照定义表的顺序来

2.2.3 查询字段为表达式

select 字段1,字段2…… 10 from 表名;  // 表达式中不含任何字段

表达式包含一个字段

表达式也可以包含多个字段

2.2.4 为查询结果指定别名

语法:

select id, name, chinese + math + english 总分 from 表名;

2.2.5 结果去重

语法:

select distinct 字段 from 表名;

2.3 WHERE 条件

2.3.1 比较运算符

运算符 说明
>, >=, <, <= 大于,大于等于,小于,小于等于
= 等于,NULL不安全,例如 NULL = NULL 的结果是 NULL
<=> 等于,NULL安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <> 不等于
between a0 and a1 范围匹配,[a0, a1] ,如果 a0 <= value <= a1,返回 TRUE(1)
in (option,……) 如果是 option 中的任意一个,返回 TRUE(1)
is null 是 NULL
is not null 不是 NULL
like 模糊匹配, % 表示任意多个(包括0个)任意字符;_ 表示任意一个字符

2.3.2 逻辑运算符

运算符 说明
AND 多个条件必须都为TRUE(1),结果才是TRUE(1)
OR 任何一个条件为TRUE(1),结果为TRUE(1)
NOT 条件为TRUE(1),结果为FALSE(0)

2.3.3 一些基本操作

2.3.3.1 英语不及格的同学及英语成绩
select name, english from exam_result where english < 60;
2.3.3.2 语文成绩在 [80, 90] 分的同学及语文成绩
select name, chinese from exam_result where chinese >= 80 and chinese <= 90;
select name, chinese from exam_result where chinese between 80 and 90;
2.3.3.3 数学成绩是58分或者59分或者98分或者99分的同学及成绩
select name, math from exam_result where math = 58 or math = 59 or math = 98 or math = 99;
select name, math from exam_result where matn in (58, 59, 98, 99);
2.3.3.4 姓孙的同学及孙某同学
select name from exam_result where name like '孙%';
select name from exam_result where name like '孙_';
2.3.3.5 语文成绩好于英语成绩的同学
select name, chinese, english from exam_result where chinese > english;
2.3.3.6 总分在200分以下的同学
select name, chinese + math + english 总分 from exam_result where chinese + math + english < 200;
2.3.3.7 语文成绩 > 80 并且不姓孙的同学
select name, chinese from exam_result where chinese > 80 and name not like '孙%';
2.3.3.8 孙某同学,或者要求总成绩 > 200 并且语文成绩 < 数学成绩 并且 英语成绩 > 80
select name, chinese, math, english, chinese + math + english 总分 from exam_result where name like '孙%‘ or (chinese + math + english > 200 and chinese < math and english > 80);

2.3.4 NULL的查询

NULL 和 NULL 的比较, = 和 <=> 的区别:

2.4 结果排序

语法:

--ASC为升序(从小到大) --DESC为降序(从大到小) 默认为ASC

SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];

注意:没有 order by 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序。

2.4.1 一些基本操作:

2.4.1.1 同学及数学成绩,按数学成绩升序表示
 select name, math from exam_result order by math;
select name, math from exam_result order by math asc;
2.4.1.2 同学及qq号,按qq号排序显示
select name, qq_num from exam_result order by qq_num;
select name, qq_num from exam_result order by qq_num asc;
2.4.1.3 查询同学各门成绩,依次按照数学降序,英语升序,语文升序的方式显示
1. select name, math, chinese, english from exam_result order by math desc, english, chinese;
2. select name, math, chinese, english from exam_result order by math desc, english asc, chinese asc;
2.4.1.4 查询同学及总分,由高到低
select name, math + chinese + english 总分 from exam_result order by math + chinese + english desc;
select name, math + chinese + english 总分 from exam_result order by 总分 desc;
2.4.1.5 查询姓孙的同学或者姓曹的同学的数学成绩,结果按数学成绩由高到低排序
select name, math from exam_result where name like '孙%' or name like '曹%' order by math desc;

2.5 筛选分页结果

-- 起始下标为 0

-- 从 s 开始,筛选 n 条结果

       SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;

-- 从 0 开始,筛选 n 条结果

       SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;

-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用

       SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

      建议:对未知表金你修改查询时,最好加上一条 limit 1,避免因为表中数据过大,查询全表数据导致数据库卡死

三、Update(更新)

语法:

UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...][ORDER BY ...] [LIMIT ...]

对查询到的结果进行列值更新

一些基本操作

3.1.1 将孙悟空同学的数学成绩变更为80分

select name, math from exam_rseult where name = '孙悟空';  // 查看原数据
update exam_result set math = 80 where name = '孙悟空';  // 数据更新

3.1.2  将曹孟德同学的数学成绩变更为60分,语文成绩变更为80分

1. select name, math, chinese from exam_result where name = '曹孟德';
2. update exam_result set math = 60, chinese = 80 where name = '曹孟德';

3.1.3 将总成绩倒数前三的3位同学的数学成绩加上30分

select name, chinese + math + english 总分 from exam_result order by 总分 asc limit 3;
update exam_result set math = math + 30 order by chinese + math + english asc limit 3;

3.1.4 将所有的同学的语文成绩更新为原来的2倍(更新全表的语句慎用)

update exam_result set chinese = chinese * 2;

四、Delete(删除)

4.1 删除数据

语法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...];

4.2 一些基本操作

4.2.1 删除孙悟空同学的考试成绩

select * from exam_result where name = '孙悟空';  // 查看原始数据
delete from exam_result where name = '孙悟空';    // 删除数据
select * from exam_result where name = '孙悟空';  // 查看删除结果

4.2.2 删除整张表的数据(慎用)

delete from exam_result;

不会将auto_increment项进行清空!!!!

4.2 截断表(这个操作慎用)

语法:

TRUNCATE [TABLE] table_name;
  1. 只能对整表进行操作,不能像DELETE一样针对部分数据操作;
  2. 实际上MySQL不对数据进行操作,所以比DELETE更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
  3. 会重置AUTO_INCREMENT项
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
3月前
|
SQL Java 关系型数据库
MySQL数据库基础:增删查改
本文详细介绍了数据库中常用数据类型的使用方法及其在Java中的对应类型,并演示了如何创建表、插入数据、查询数据(包括全列查询、指定列查询、去重查询、排序查询、条件查询和分页查询)、修改数据以及删除数据。此外,还特别强调了处理NULL值时的注意事项,以及在执行修改和删除操作时应谨慎使用条件语句,以避免误操作导致的数据丢失。
78 14
MySQL数据库基础:增删查改
|
2月前
|
存储 关系型数据库 MySQL
【探究Mysql表中的增删查改(进阶篇)】
【探究Mysql表中的增删查改(进阶篇)】
54 7
|
5月前
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
|
5月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表
|
6月前
|
关系型数据库 MySQL
蓝易云 - 如何修复MySQL中损坏的表
最后,为了防止数据丢失,定期备份数据是非常重要的。
154 3
|
5月前
|
运维 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在处理MySQL表新增数据记录时,没有正确触发变更事件,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 关系型数据库 MySQL
ClickHouse(23)ClickHouse集成Mysql表引擎详细解析
ClickHouse的MySQL引擎允许执行`SELECT`查询从远程MySQL服务器。使用`MySQL(&#39;host:port&#39;, &#39;database&#39;, &#39;table&#39;, &#39;user&#39;, &#39;password&#39;[,...])`格式连接,支持简单`WHERE`子句在MySQL端处理,复杂条件和`LIMIT`在ClickHouse端执行。不支持`NULL`值,用默认值替换。系列文章涵盖ClickHouse安装、集群搭建、表引擎解析等主题。[链接](https://zhangfeidezhu.com/?p=468)有更多
268 0
|
6月前
|
SQL 缓存 关系型数据库
MySQL操作全攻略:库、表、数据、事务全面指南
MySQL操作全攻略:库、表、数据、事务全面指南
|
6月前
|
SQL 关系型数据库 MySQL
经验大分享:MySQL(三)数据库表的查询操作【重要】
经验大分享:MySQL(三)数据库表的查询操作【重要】
67 0