当前位置: 首页 > news >正文

MySQL的CRUD

CRUD简介

CURD是对数据库中的记录进⾏基本的增删改查操作:

  • Create (创建)
  • Retrieve (读取)
  • Update (更新)
  • Delete (删除)

电脑上的数据库服务器 -->管理着很多个数据库 --> 其中有很多张表(保存着真实的数据) --> 很多列(字段)–> 很多数据行(记录)

我们操作的部分就是很多的数据行

新增(Create)

1.单行数据 全列插入

insert into 表名 [(字段1,字段2...)] values(值,值...);

示例:将学生张三 id为1插入表student中

insert into student (id,name) values(1,'张三');

在这里插入图片描述

如果列与值的数据类型不匹配就会报一个错误,并且这条记录不会写入数据表中

简写方式: insert into 表名 values(值,值,值…);

不用在表名后面指定列名,在values列表中按照定义字段的顺序设置相应的值

如果values列表中的值与列的数据类型不匹配,依然会报一个错误

2.指定列插入

在这里插入图片描述

insert into student (name) values ("王五");

没有指定id这一列时,只写一个name的值,id这一列就会用默认值去填充,这个默认值就是NULL

3.多行插入

insert into 表名[(指定列…)] values (值[,值…]) [, (值[,值…])] [, (值[,值…])]…

一条insert语句在values部分,可以跟很多个values组,每一组代表要插入的一个数据行

示例:

insert into student (id,name) values (4,'赵六'),(5,'钱七')(6,'李明')

一次性插入一条数据和一次性插入多条数据的效率比较:

  1. 执行所有的SQL时都会有网络开销

  2. 写入数据时还会有磁盘IO开销

  3. 每执行一条SQL语句多会开启一个事务,事务的开启和关闭都需要消耗系统资源

    一次性提交多条数据(在一个可控的范围内数据不是过多)比一次提交一条数据效率高那么一点

**tips:**如果在写入一条中文数据后,出现一个错误有一堆乱码,首先考虑一下数据库的编码集是否设置正确

查询(Retrieve)

1.全列查询

在这里插入图片描述

**注意:**全列查询是非常危险的操作,因为在生产环境中,一个表存储的数据会有很多很多。当一个查询开始的时候,会有磁盘开销、网络开销,这都是非常紧缺的资源。如果这样一个全列查询开始执行,那么就有可能会把服务器的资源占光,其他的程序或是水库操作就要等待当前SQL执行完后才能执行。所以查询需要条件限制条件去限制结果集的条数。

创建表,初始化表的数据

-- 创建考试成绩表
DROP TABLE IF EXISTS exam;
CREATE TABLE exam (id bigint,name VARCHAR(20),chinese DECIMAL(3,1),math DECIMAL(3,1),english DECIMAL(3,1)
);
-- 插入测试数据
INSERT INTO exam (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);

在这里插入图片描述

2.指定列查询

select 列名[, 列名]… from 表名;

示例:只查询id,name,chinese成绩

在这里插入图片描述

3.查询的结果是一个表达式

在这里插入图片描述

数值类型的效果就是让所有的行中都包含一个表达式中的值,但这个值不在真实的表中

应用的示例:

select id,name,chinses + 10 from exam;

在这里插入图片描述

列与列之间也可以参与运算

在这里插入图片描述

这个查询效果就是计算总分,但是这个查询结果并不是很直观,可以使用as关键字来为表达式起别名

在这里插入图片描述

书写方式:

select id,name,chinese+math+english as '总分' from exam;
-- as 可以省略
select id,name,chinese+math+english '总分' from exam;
-- 别名的单引号可以省略
select id,name,chinese+math+english as 总分 from exam;
-- as和单引号同时省略
select id,name,chinese+math+english 总分 from exam;

注意:如果别名的中间有空格,如‘总 分’,则必须使用单引号

在我们的表里本来是没有总分这一列,所以通过表达式查询可以看出查询出来的结果集是通过一个临时表返回的,执行完这个表就被删除了。不仅是表达式查询,MySQL中所有的查询结果都是通过临时表返回给用户。

4.去重:DISTINCT

在查询时可以通过关键字distinct去除重复的数据。

select distinct 列名 from 表名;

在这里插入图片描述

注意:在查询结果中,数据行与数据行之间只有每一列都相同,MySQL才会认为他们是重复的

在这里插入图片描述

5.排序:ORDER BY

用这个order by的子句,让查询结果根据我们指定的规则去对结果排序

排序规则:1.升序 ASC 2.降序 DESC

注意:查询表结构中用到了desc(describe)描述,而排序中也用到了 desc(descend)这一个关键字表示了两种意思

select 列名 from 表名 order by 列名 [ASC|DESC];

默认是升序,也就是ASC

示例:按语文成绩从高到低排

select *from exam order by chinese DESC;

指定了排序的列,返回的结果就是针对这个列进行排序后的结果集

注意:NULL数据排序,视比任何值都小,升序出现在最上面,降序出现在最下面

使用表达式别名排序

select id,name,chinese+math+english as total from exam order by total desc;

mysql中的NULL

  1. 无论和什么值进行运算,返回值都是NULL
  2. NULL始终被判定为FALSE
  3. NULL的值不是像Java中一样是0,在MySQL中它就是NULL

可以为多个字段指定排序规则

对多个字段进行排序,排序的优先级和书写规则有关

示例:先按数学降序排列,再按语文的升序排列,最后按照英语进行升序

select id,name,chinese,math,english from exam order by math desc,chinese asc,english asc;

在这里插入图片描述

6.条件:WHERE

根据指定的一些条件,过滤掉不符合条件的记录,把符合条件的记录返回给用户。可以通过一些运算符进行筛选,比如:比较运算符,逻辑运算符。

比较运算符

运算符说明
>, >=, <, <=⼤于,⼤于等于,⼩于,⼩于等于
=等于,对于NULL的⽐较不安全,⽐如NULL = NULL结果还是NULL
<=>等于,对于NULL的⽐较j是安全的,⽐如NULL <=> NULL结果是TRUE(1)
!=, <>不等于
value BETWEEN a0 AND a1范围匹配,[a0, a1],如果a0 <= value <= a1,返回TRUE或1,NOT BETWEEN则取 反
value IN (option, …)如果value 在optoin列表中,则返回TRUE(1),NOT IN则取反
IS NULL是NULL
IS NOT NULL不是NULL
LIKE模糊匹配,% 表⽰任意多个(包括0个)字符;_ 表⽰任意⼀个字符,NOT LIKE则取反

逻辑运算符

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

tips:逻辑运算符有优先级的,不建议记忆,建议使用加小括号的方式手动指定优先级。(NOT 大于 AND 大于 OR)

语法

select * from 表名 where 列名/表达式 运算符 条件

条件查询时,首先要确定好给哪个列设置相应的条件

示例:

-- 基本查询-- 查询英语不及格的同学及英语成绩 ( < 60 )
select name,english from exam where english<60;
-- 查询语⽂成绩⾼于英语成绩的同学
select name,english,chinese from exam where chinese>english;
-- 总分在 200 分以下的同学
select name,chinese+math+english as '总分' from exam where chinese+math+english<200; -- AND和OR-- 查询语⽂成绩⼤于80分且英语成绩⼤于80分的同学
select name,chinese,english from exam where chinese>80 AND english>80;
-- 查询语⽂成绩⼤于80分或英语成绩⼤于80分的同学
select name,chinese,english from exam where chinese>80 OR english>80;
-- 观察AND和OR的优先级
select * from exam where chinese > 80 or math > 70 and english > 70;
select * from exam where (chinese > 80 or math > 70) and english > 70;-- 范围查询-- 语⽂成绩在 [80, 90] 分的同学及语⽂成绩
-- 注意左右都是闭区间
select name,chinese from exam where chinese between 80 and 90;
-- 数学成绩是 78 或者 79 或者 98 或者 99 分的同学及数学成绩
select name,math from exam where math IN (78,79,98,99);-- 模糊查询-- 查询所有姓孙的同学-- %匹配任意多个(包括0个)字符select * from exam where name like '孙%';-- 如果是'%孙'则代表查询所有以孙结尾的-- 查询姓孙且姓名共有两个字同学-- '_'严格匹配一个任意字符,可以加多个_表示要匹配的字符个数select * from exam where name like '孙_';-- 查询姓孙且姓名共有三个字同学select * from exam where name like '孙__';-- NULL的查询-- 构造数据-- 写⼊⼀条数据,英语成绩为NULL
insert into exam values (8, '张⻜', 27, 0, NULL);-- 查询英语成绩为NULL的记录select * from exam where english is null;-- 查询英语成绩不为NULL的记录select * from exam where english is not null;-- NULL与其他值进⾏运算结果为NULLselect name, chinese + math + english as 总分 from exam;-- 运行后结果集中新插入的‘张飞’总分为NULL

注意:where子句中不能用别名去当过滤条件,当where条件中使用了表达式时,要把表达式完整的写在where子句中,不能用别名。

在这里插入图片描述

7.分页查询:LIMIT

作用:限制查询结果集中的条数

在这里插入图片描述

通过分页查询可以有效的控制一次查询出来的结果集中的记录的条数,可以有效的减少数据库服务器的压力,同时对于用户查看查询结果也比较友好

语法:

-- 起始下标为0
-- 从0开始,筛选n条结果
-- limit是关键字表示要查询的条数,n表示一次查询出来的条数
select ... from table_name [where ...] [order by ...] limit n;-- 从 s 开始,筛选 n 条结果
select ... from table_name [where ...] [order by...] limit s,n;-- 从 s 开始,筛选 n 条结果
-- offset,表示偏移量,也就是从哪里开始的意思
select ... from table_name [where ...] [order by ...] limit n offset s;

修改(Update)

在这里插入图片描述

示例:

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

update exam set math = 80 where name='孙悟空';

如果此时我们再插入一条学生的信息名为’‘孙悟空’,再次执行该语句,执行结果会显示匹配到了两条语句,但只修改了一条数据。这是因为其中一条的math已经是80分了,只修改需要修改的数据行。

update exam set math = 90 where name='孙悟空';

如果是把math修改为90分,就会看见这时两条数据都被检修改了。

注意:如果修改的时候不加where条件,修改的将会是整张表,是非常危险的操作。

– 将曹孟德的数学成绩变更为60分,语文成绩变为70分。

update exam set math=60,chinese=70 where name='曹孟德';

– 将总成绩倒数前三的同学的数学成绩减上30

update exam set math=math+30 where math is not null order by (chinese+math+english) desc limit 3;

注意:不能写成是math-=30,这样的写法MySQL是不支持的。

– 把所有语文成绩小于50的同学的语文成绩更新为原来的2倍

update exam set chinese=chinese*2 where chinese<50;

注意:如果此时表中有同学的语文成绩为0,它在乘2以后实际的值并没有改变,匹配时会匹配4条数据,但显示修改的数据只有3条。

删除(Delete)

语法:
在这里插入图片描述

示例:删除英语成绩倒数前三的同学的所有考试成绩

delete from exam order by english desc limit 3;

总结

在这里插入图片描述

http://www.dtcms.com/a/494599.html

相关文章:

  • 【C语言】基本语法结构(上篇)
  • 云原生进化论:加速构建 AI 应用
  • 【论文阅读】PathMR: Multimodal Visual Reasoning for Interpretable Pathology Analysis
  • 做护肤品好的网站不用流量的地图导航软件
  • 网站建网站建设wordpress自动标签添加内链插件
  • Java集合【开发的重点*】
  • 深度学习笔记39-CGAN|生成手势图像 | 可控制生成(Pytorch)
  • 第7篇 halcon12导出c++在vs2019配置环境显示图片
  • Socket.IO 聊天应用实例
  • 首发即交付,智元精灵G2携均胜集团过亿订单落地
  • 网站建设需要步骤到哪里查网站备案信息
  • 哈尔滨网站制作哪里专业西安公司网站制作要多少钱
  • WPF中的DataTemplate
  • 浙江建设局网站泰安北京网站建设公司哪家好
  • TensorFlow2 Python深度学习 - 使用Dropout层解决过拟合问题
  • Python数据分析实战:基于5年地铁犯罪数据构建多维安全评估模型【数据集可下载】
  • YOLO系列——OpenCV DNN模块在YOLOv11检测物体时输出的边界框坐标问题
  • 网站地图怎么用wordpress发布文章添加新字段
  • OpenCV轻松入门_面向python(第六章 阈值处理)
  • Visual Studio 2017(VS2017)可以编译 OpenCV 4.5.5 为 32 位(x86)版本
  • 使用 Wireshark 进行 HTTP、MQTT、WebSocket 抓包的详细教程
  • 一个基于BiTCN-LSTM混合神经网络的时间序列预测MATLAB程序
  • 火是用什么做的视频网站wordpress贴吧主题
  • 团购网站开发网址交易网站
  • git revert commit和undo commit的区别
  • HTTP 协议的演进之路:从 1.1 到 3.0
  • 开源CICD工具Arbess,从安装到入门零基础指南
  • Maya动画基础:自动关键帧切换、曲线图编辑器、摄影机录制动画
  • Unreal5从入门到精通之一些有用的编辑器首选项
  • 深度解析:HTTP/2 与 HTTP/3 的适用场景与技术取舍