作者:~小明学编程
文章专栏:MySQL
格言:目之所及皆为回忆,心之所想皆为过往
前面给大家分享了关于数据库的一些基本的操作,今天分享的是数据库的核心内容,那就是我们常说的增删查改,也是我们数据库的灵魂所在。
目录
增(Create)
单行插入
多行插入
指定列的插入
查(Retrieve)
全列查找
指定查询列
去重
排序
条件查询
NULL问题
别名问题
模糊查询
分页查询
改(Update)
删(Delete)
增(Create)
顾名思义就是向我们的表中添加数据,这里我们示范,创建一个student2的表。
接着我们介绍我们的增添数据的语句,其中我们的 into 可以省略。
insert into 表名 values (数据);
单行插入
insert into 表名 values(数据);
多行插入
insert into 表名 values
('lisi',18,3.9),
('wangwu',19,6.8),
('zhangliu',20,7.6);
因为我们的单行插入比较的繁琐,插入一行的数据就需要去insert一下,所以这里我们就采用多行插入法,一个insert插入多个数据。
指定列的插入
指定列插入就意味着我们可以只插入我们想要的那一列或者几列数据就可以了
insert into 表名 (列1,列2) values (数据,数据);
当然,在我们插入的时候我们也可以对指定的列赋上NULL值。
例如:
insert into student2 (name,age) values ('liqi',NULL);
查(Retrieve)
在我们插入完数据之后就是搜索我们想要的数据,也就是我们所说的查,在我们查之前我们先,向我们的表中插入一些数据。
insert into exam_result (id,name, chinese, math, english) values
(1,'小a', 67, 98, 56),
(2,'小b', 87.5, 78, 77),
(3,'小c', 88, 98.5, 90),
(4,'小d', 82, 84, 67),
(5,'小e', 55.5, 85, 45),
(6,'小f', 70, 73, 78.5),
(7,'小g', 75, 65, 30);
然后我么介绍我们的第一条的查找语句
全列查找
select * from 表名;
我们可以看到该语句可以查找出整个表的内容,但是这种写法不推荐使用,这里是因为我们的表比较的小,当我们的表比较的大的时候数据很多,这时候我们再去用全列搜索就会产生问题,首先我们从磁盘中读取我们的数据一次性也就几百兆,当数据非常多达到几个G的时候我们不能读完就会占用我们本地的IO,同时当我们从服务器中去查询数据的时候如果该次数据返回的非常多,就会占用所有的资源去返回该次指令所要的数据,那么别的请求就不能再从该服务器中获取想要的数据了。
指定查询列
查询所有的列,一般情况下属于浪费我们的资源,因为一般我们不需要那么多的东西,所以我们一般只需要查询我们想要的那几列就行了。
select 列1,列2 from 表;
这时我们想到一个问题,我们能不能将列表中的成绩×2呢,或者我们要查询的是math,chinese,english三个成绩之和呢?当然没问题。
可以看到只要在我们查询的时候,对我们查询的列进行表达式的运算就能达到我们的要求了。
别名:
但是我们刚刚在计算三科成绩之和的时候我们发现列名太长了,看着就很不舒服,这时我们会想我们能不能给它起一个别名呢?
select 列名 as 别名 from 表;
这里我们可以看到此时的列名就简洁很多了。
去重
当我们在查询数据的时候可能会遇到一些重复的数据,此时我们想要将这些重复的数据去除该怎么操作呢?
select distinct 列 from 表;
我们也可以写成下面这种
这意味着只有当我们的math和chinese都相等的时候才会去重。
排序
上述在我们查到我们想要的数据之后我们发现此时的数据是乱序的,也就是我们插入时候的顺序,这时我们想让其按顺序列出来该如何去操作呢?
例如上面的数据我们想要查看math从低到高的排序
此时我们可以看到,我们拿到了我们想要的结果了,但是我们如果想要从高到底去排序呢?
我们只需要在最后面加上desc就可以了,其实从小到大也有关键字那就是asc,可以省略但是不推荐,所以我们暂时可以总结出来我们的查询排序操作为
select 列 from 表 order by 列 asc -- 从小到大排序
select 列 from 表 order by 列 desc -- 从大到小排序
注意:
1.我们的order by 后面也可以用别名进行排序
select name, chinese + english + math total from exam_result
order by total desc;
2.我们排序的时候可以指定多个标准
select 列 from 表 order by 列1 desc 列2 asc -- 先按照列1从大到小排序当遇到相同的时候就按照列2从小到大排序
条件查询
前面我们说到的查询都是查询的指定的列,那么我们能不能查询指定的行呢?
这就要用到我们的条件查询了,例如我们想要查询,在查询之前我们要俩姐MySQL中的运算符。
select 列 from 表 where 条件;
运算符 | 说明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,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 个)任意字符;_ 表示任意一个s |
这是我们原表的所有的数据,现在我们对其进行一系列的条件查询来示范怎么去使用条件查询。
首先我们可以查询一下,所有的数学成绩在80分以上的人的姓名和数学成绩,
select name,math from exam_result where math>80;
当然我们也可以加入我们前面的排序语句, 这样我们就得到了数学成绩大于80并且从小到大排序的一个表。
between and 的左闭右闭需要注意一下,
这里我们采用的是左右都是闭区间,和我们一般的语法规则有些不同需要注意一下。
NULL问题
1.
首先先说一下带有NULL的排序问题,当我们排序的时候我们数据中如果有NULL那么NULL会排在哪里呢?
可以看到,这里我们这里采用的是asc从小到大的排序,然后NULL是放在最前面的也就是最小。
2.
当我们查找的时候想查找谁的数据为NULL时该怎么办呢?
直接等于是办不到的查找结果也是NULL,上面的表中我们也提到了,所以我们要用一些其它的语句。
别名问题
这里我们想要查询总成绩大于200的人和成绩,并且给和起了个别名total,但是我们where后面的条件依然没用别名,这里我们用别名岂不是更方便
但是事实却不是这样,这里给我们报错了,意思是不认识total,因为我们是首先执行后面where的所以我们当时还没有起上别名,就导致了我们找不到别名这个关键字。
模糊查询
LIKE关键字主要用于我们的模糊查询,当我们只知道我们字符串的某些部位的时候,这时我们可以查询该列数据中带有此关键字的所有的数据。
例如:我们现在查询名字中头一个字符是小的
其中%表示匹配多个字符,也就是此时我们可以匹配小a,小aaaa都没问题,当我们想要查询name中带有小的话就可以写成%小%。
当我们要查找指定位置有某一个字符的时候,可以用_字符例如:
这就意味着我们的d的前面必须有一个字符来让我们去匹配。
分页查询
我们前面谈到select * 查询会出现一些问题一般不建议这样去使用,因为一次性返回的数据太多了,所以现在我们想一次性返回指定规模的数据。
这就要用到我们的分页查询了,
select 列 from 表 limit 一次显示数据的数量 offset 指定小标开始;
注意:这里我们需要注意的是我们以上的查询操作只是把我们数据库里面的数据按照我们的需要展示出来并不会修改数据库里面的数据,同时我们也没有生成一个表,在我们数据展示的那一刻起就已经释放掉了。
改(Update)
接下来要介绍的是修改我们的数据,
update 表 set 列1,列2 where 修改的对象;
例如我们现在要将我们小a的math成绩修改为80,english成绩修改为60,就可以写成
这里我们就修改完毕了,当但是一般情况下我们用到修改的时候会比较的复杂将会和多个语句一起使用,例如:将总成绩倒数前三的 3 位同学的数学成绩加上 10 分这样的语句我们该怎么去写呢?
这是我们要找的三个人,注意 :我们的NULL进行运算结果还是NULL,如NULL+10=NULL
update exam_result set math = math+10 order by chinese+math+english asc limit 3;
按照当前需求写出来的sql语句,我们执行之后看看结果, 我们可以看到数据已经更改了。
下面我们再进行一个操作,将我们所有人的语文成绩加上10,
update exam_result set chinese = chinese+10;
删(Delete)
delete from 表 where 条件;
我们可以看到我们操作完毕之后,数据库中就没有id=9的数据了,当我们没有where的时候就是删除该表里面的所有的数据。
以上就是本章给大家分享的MySQL的一些基本的增删改查的知识。