MySQL数据库增删改查之 查找 与 修改

写在前面

数据库的增删改查里查找数据是我们经常使用的操作,关于查找这里面有很多需要仔细研究的细节,今天我们先说一下简单的,后面复杂的查找方法我们用到的时候再说。由于修改数据的内容较少,我们一起说了吧。

我们先为今天的内容提供一个背景

创建一个表

CREATE TABLE exam_result (
id INT,
name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1)
);

插入一部分数据

INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98.5, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', NULL, 65, 30);

image-20220310133351724

查询

查询的操作有很多,我们先给他们分一下类

  • 全列查询
  • 指定列查询
  • 查询字段为表达式
  • 指定别名
  • 去重查找
  • 排序
  • 条件查询
  • 模糊匹配

全列查询

说实话,全列查询我们最好不要做,对于我们个人来说,这种查询方式不会耗费多长时间,但是对于公司的数据而言,这中方式查询的列越多,意味着需要传输的数据量越大 ,而且可能会影响索引的使用。

select * from <表名>;   

image-20220310134417265

指定列查询

我们可以指定列查询,这种方式很不错

指定一列

我们可以指定一列来查询数据

select <列名> from <表名>;

image-20220310134915742

指定多列

select <列名1>,<列名2> from <表名>;   -- 列名于列名之间要用 , 隔开

image-20220310135216035

查询字段为表达式

我们可以对查询的字段进行算术运算,下面我以多列的形式来表现一下,我们先看看现象,后面在好好分析一下

select <列名1> + <列名1>,<列名2>, <列名3> + 10 from <表名>; 

image-20220310135811325

分析一下

  • 我们看到表是一张临时表原表的内容不会改变
  • 临时表的字段名和我们的表达式的形式一样
  • 我们会看到,之前我们创建的表的math字段是这样,math DECIMAL(3,1),,我们都可以知道math的有效数据是三位,有一位是小数。但是我们 math+100,都超出了这个模式,实际上我们的临时表不遵循原表的限制,尽可能使得数据精确

指定别名

我们在看表达式查询的时候,出现了 id + id这样的字段名,看着很不舒服,我们想要对他指定别名

select <列名1> + 10 as 别名,<列名2> + <列名3> from <表名>  -- as 不写也可以

image-20220310140933212

去重查找

我们再插入一个数据

INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(7,'宋公明', NULL, 65, 30),
(7,'吴用', NULL, 65, 30);

image-20220310141452911

指定单列去重

现在我们开始进行去重

select distinct <字段名> from <表名>;    -- distinct 理解为关键字

image-20220310141713287

我们去重得到的表也是临时表

指定多列去重

我们也可以多列去重,但是我们也要知道要求

  • 所有的 列名 在distinct后面
  • 只有 当我们指定多列全部相同时,才会去重
select distinct <字段名1>, <字段名2> from <表名>;

image-20220310142146335

排序

排序很简单,我们看几个例子就可以了

  • NULL不是0,是最小的 NULL ,加上任何数都是 NULL
  • asc 是升序 desc 是 降序,默认是升序
  • 排序支持指定别名
select * from exam_result order by math asc;   --  按照 math 的大小进行 升序

image-20220310144716493

按照总成绩 支持别名

select id,name,chinese + math + english total from exam_result order by total asc;

image-20220310145234104

支持 多列来排序

select * from exam_result order by <字段1>,<字段2> asc;  -- 字段1 的优先级高
  • 只有 字段1 相同时,才会比较 字段 2

升序和降序可以混合使用,但是也有优先级的

-- 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
SELECT name, math, english, chinese FROM exam_result
ORDER BY math DESC, english, chinese

image-20220310145627630

条件查询

条件查询才是今天的正菜,我们用的是where判断语句,里面有条件表达式,我们先看一下条件查询的语句格式

select <字段名1>, <字段名2> from <表名> where <判断语句>;

比较运算符

运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=>等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <>不等于
between A and B[A,B]
int(a,b,c)数据只要是a,b,c中的一个就是 true
is not null不是NULL 是 true
is null是NULL 为true
like模糊匹配 (下面细说)

算数运算符之 比较相等 ( = & <=> )

我们来稍微说一下这两个的区别,大家一看就i明白了

NULL 安全 <=>
select name from exam_result where chinese <=> null;  -- null 是安全的

image-20220310185912325

NULL不安全 =
select name from exam_result where chinese = null;

image-20220310190121386

逻辑运算符

这里逻辑运算符和我们学的语言中的作用一样,我们一起来看看,

运算符说明
and逻辑与
or逻辑或
not逻辑非

条件语句的使用

后面的运算符我一一使用一下,很简单,我们没有用全部,他们的原理都是一样的

>
select * from exam_result where chinese > math;    -- 语文成绩 大于 数学成绩 

image-20220310190356797

between A and B
select * from exam_result where chinese between 70 and 100;    -- 语文成绩 在 70到100之间的,包括 70和100

image-20220310190616980

#### in(a,b,c,d...)

select * from exam_result where chinese in(67,70.0,88,100); -- 语文成绩 在等于 67,70.0,88,100 几个中的一个

image-20220310191313497

is null
select * from exam_result where chinese is null;

image-20220310200327568

and
select * from exam_result where chinese in(67,70.0,88.0) and chinese > math;

image-20220310191742967

模糊匹配 like

模糊匹配的意思是看字符串是不是相似,我们需要搭配下面的通配符

  • % 看作任意个 字符
  • _ 看作一个字符
select * from exam_result where name like '宋%';   --  只要是 以 宋 开头的

image-20220310192654918

select * from exam_result where name like '宋_';   --  以 宋 头的 并且要有两个字符组成

image-20220310192811639

总结

我们使用条件语句的时候,由于符号的优先级问题,最好加上括号,并且where语句后面不能使用别名

select id,name,chinese + math + english total from exam_result where total > 100;  --错误

image-20220310200310042

我们查找的时候遵循 最左原则 也就是第一次除去数据最多的,后面的 依次减少,使得我们查找数据所用的时间最短

分页查找

有时候我们就是只想要一个数据表一部分,比如要求要求考试的前三名,这就要使用 分页查找

分页的查找的关键字是 **limit **

select name,math+chinese+english as total from exam_result order by total desc limit 3;

image-20220310193526114

我们也可以查找 第 4,5,6名同学的总成绩

使用 offset N 从下标为N的位置开始查找 下标从 0 开始

select name,math+chinese+english as total from exam_result order by total desc limit 3 offset 3;

image-20220310193826003

这里有些注意的地方

  • limit A offset B ; A 过大超出数据的数量 相当于 全部查找
  • limit A offset B ; B过大 查找的数据为空

image-20220310194133654

修改

修改表中的数据我们也是比较常用的,这是真正修改原始表中数据的方法,这部分知识点较少

update <表名> set <字段名1> = 新数据 , <字段名2> = 新数据 where 语句;  -- where 语句 省略修改的是整张表

我们使用一下

update exam_result set id = 9, chinese = 90 where name like '吴_';

image-20220310195617013

-- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
update exam_result set math = math + 30 order by chinese + math + english LIMIT 3;

image-20220310195844098

update exam_result set id = 0; --  把所有的 id 置为 0 

image-20220310200229044

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄鸟轩墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值