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

目录
写在前面
查询
全列查询
指定列查询
指定一列
指定多列
查询字段为表达式
指定别名
去重查找
指定单列去重
指定多列去重
排序
条件查询
比较运算符
算数运算符之 比较相等 ( = & <=> )
NULL 安全 <=>
NULL不安全 =
逻辑运算符
条件语句的使用
>
between A and B
is null
and
模糊匹配 like
总结
分页查找
修改
写在前面
数据库的增删改查里查找数据是我们经常使用的操作,关于查找这里面有很多需要仔细研究的细节,今天我们先说一下简单的,后面复杂的查找方法我们用到的时候再说。由于修改数据的内容较少,我们一起说了吧。

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

创建一个表

CREATE TABLE exam_result (
id INT,
name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1)
);
1
2
3
4
5
6
7
插入一部分数据

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);
1
2
3
4
5
6
7
8


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

全列查询
指定列查询
查询字段为表达式
指定别名
去重查找
排序
条件查询
模糊匹配
全列查询
说实话,全列查询我们最好不要做,对于我们个人来说,这种查询方式不会耗费多长时间,但是对于公司的数据而言,这中方式查询的列越多,意味着需要传输的数据量越大 ,而且可能会影响索引的使用。

select * from <表名>;
1


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

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

select <列名> from <表名>;
1


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


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

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


分析一下

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

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


去重查找
我们再插入一个数据

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


指定单列去重
现在我们开始进行去重

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


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

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

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


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

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


按照总成绩 支持别名

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


支持 多列来排序

select * from exam_result order by <字段1>,<字段2> asc; -- 字段1 的优先级高
1
只有 字段1 相同时,才会比较 字段 2
升序和降序可以混合使用,但是也有优先级的

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


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

select <字段名1>, <字段名2> from <表名> where <判断语句>;
1
比较运算符
运算符 说明
>, >=, <, <= 大于,大于等于,小于,小于等于
= 等于,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 是安全的
1


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


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

运算符 说明
and 逻辑与
or 逻辑或
not 逻辑非
条件语句的使用
后面的运算符我一一使用一下,很简单,我们没有用全部,他们的原理都是一样的

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


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


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

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


is null
select * from exam_result where chinese is null;
1


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


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

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


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


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

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


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

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

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

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


我们也可以查找 第 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;
1


这里有些注意的地方

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


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

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

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


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


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

 

 

原文链接:https://blog.csdn.net/m0_61334618/article/details/123409571

posted @ 2022-06-30 17:20  瘋耔  阅读(239)  评论(0编辑  收藏  举报
跳至侧栏