【MySQL】表的基础操作

表的基础操作

根据上一节的学习,我们的数据库现在应该是已经创建好表的状态。由于在关系型数据库中,表是用来存储数据的,那么表的基本操作其实就是对数据的增删查改,简称CRUD(create,retrieve,update,delete如果按照英文排列实际上顺序应该是增查改删

那么接下来我们就分别来看这些操作如何进行

增加数据

指定列插入

虽然我们上面说增加的英文是create,但是实际上用的关键字并不是create,我们来看增加数据的语法

INSERT INTO 表名 (列名1,列名2....) VALUES (对应数据1), (对应数据2).....;

看完这一大段可能还有一点懵逼,想着:这啥玩意什么列名123的,对应数据又是什么东西。为了能够理解这里到底在说什么,我们直接来看一个例子


首先我们创建一个学生表,表中包含两个属性:学生代号和学生名字

CREATE TABLE IF NOT EXISTS student(id INT, name VARCHAR(20));

此时我想要给里面加几个数据:1号张三,2号李四,3号王五

那么按照上面的指示,我们就可以这样写

INSERT INTO student (id, name) VALUES (1, '张三'), (2, '李四'), (3, '王五');

注意:MySQL中的字符串既可以用双引号括起来也可以用单引号括起来,都表示字符串

现在我们结合一下这个例子,来看一下我们那个语法是什么意思。实际上列名1,列名2,就是你要填入数据的列。后面的对应数据1,对应数据2,就是对应这你前面指定的列输入的数据。

扫描二维码关注公众号,回复: 17242321 查看本文章

比如我现在要添加一个学生,他只有代号4,但是没有名字,那么就应该这样写(此时没有给予数据的这个位置会自动置空)

INSERT INTO student (id) VALUES (4);

那现在此时可能就有人有问题了:我上面添加三条数据的时候能不能一条一条添加呢?答案是:当然可以。但是这样效率会比我们一次性插入三条数据更低,这是为什么呢?

我们回忆一下上节我们说过,MySQL是一个客户端-服务器结构的软件,我们操作的客户端每进行一个操作就要发给服务器一个请求,随后服务器再返回一个响应,那么如果我们分别3次进行请求,那么服务器也就要返回3次响应。但是如果我们一次性直接插入3个数据,那么我们就只用请求1次,服务器也只用响应1次,这样效率就会有明显提升。依旧是以餐馆为例,假如我是一个客人,我要点三个菜,那么假如我每一次都只说一个菜,然后等餐馆炒完一个菜我再给它讲我下一个菜要什么,这肯定没有我一次性给餐馆说:“我就要这三个菜” 来的快


全列插入

另外,我们也可以在插入数据的时候不写我们要给什么列输入数据,但这样就是默认你要给所有列插入数据,并且如果此时你给的数据类型和列对不上就会直接报错(列的顺序和你创建的时候给的顺序对应)

比如我们把上面插入3个人的数据的语句修改一下

INSERT INTO student VALUES (1, '张三'), (2, '李四'), (3, '王五');

但是如果此时我调转一下顺序就会报错

INSERT INTO student VALUES ('张三', 1);

在这里插入图片描述

包括如果我想插入一个只带id的数据也是不行的

在这里插入图片描述

查找数据

指定列查询

上面我们学会了怎么插入数据,接下来如果想要看看我们插入的数据那就可以用到查找数据的语句,语法如下

SELECT 列名1, 列名2.... FROM 表名;

比如我想看看我刚刚插入的学生代号和学生名字,我就可以输入下面的语句(此时列名不要括号)

SELECT id, name FROM student;

全列查询

同样的我们这里也可以进行全列查询,但是并不是什么都不写,而是要写一个*

SELECT * FROM 表名;

但是注意,在实际使用数据库的时候,这是一个危险操作。为什么?因为在实际的应用场景中,数据库中存储的数据量是很大的,一次性对所有的数据进行查询,可能会导致数据库服务器的卡顿,导致数据库服务器无法被访问,从而造成不可估量的损失。因此我们在查询数据的时候,一般不会查询全列,或者是会加一些条件再进行查找,从而对数据进行筛选,只要找到我们要的数据就行,不要全部都查找出来

条件查询

条件查询,顾名思义就是能够通过一定的条件筛选出一些数据,这样就能够更加迅速的获取需要的数据

SELECT 列... FROM 表名 WHERE 条件表达式;

要进行条件查询,首先我们要借用WHERE关键字,然后再通过条件表达式来写出筛选条件,那么如何写一个条件表达式呢?

我们先来看一些用于书写条件表达式的运算符

条件运算符

运算符 意义
>, <, >=, <= 大于,小于,大于等于,小于等于
= 等于(无法进行NULL运算)
<=> 等于(可以进行NULL运算)
!=, <> 不等于(不能进行NULL运算)
IS NULL 是NULL
IS NOT NULL 不是NULL
BETWEEN…AND… 范围匹配,两边都是闭区间,如果数据在范围内为TRUE(1)
IN(…) 如果数据是括号中的任意一个数据则结果为TRUE(1)
LIKE 模糊匹配,详情看案例

逻辑运算符

运算符 意义
AND
OR
!

这里的运算符也是有优先级的,但是我们没有任何必要去记忆,如果不想因为运算符优先级导致出现不符合需求的查询结果则可以多加一些括号


接下来我们来通过一些实例来演示上列的所有运算符的效果

首先创建一张成绩表,并且插入一些数据

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 VALUES (1, '张三', 98.0, 85.5, 87.5),
                               (2, '李四', 87.0, 60.5, 75.5),
                               (3, '王五', 64.5, 70.0, 90.0),
                               (4, '赵六', 77.0, 95.5, 69.0),
                               (5, '田七', 88.0, 74.5, 86.0),
                               (6, '孙行者', 50.0, 60.0, 70.0),
                               (7, '行孙者', 83.0, 75.0, 60.0),
                               (8, '者行孙', 99.0, 93.5, 83.0),
                               (9, '孙权', 87.5, 83.5, 88.0);

首先我们看前面几个< > <= >=,非常简单直接上案例

#查询语文大于85分的人的所有信息 
SELECT * FROM exam_result WHERE chinese > 85;

其他的几个运算符也是同理于是不再展示,接下来看=,也非常简单直接上案例

#查询数学成绩为75分的人的所有信息
SELECT * FROM exam_result WHERE math = 75;

但是注意,这个=如果在比较过程中遇到了NULL,则结果直接为NULL,也就是FALSE

例如我们这里再插入一个成绩带有NULL的数据

INSERT INTO exam_result VALUES (10, '唐三藏', NULL, NULL, NULL);

此时我们如果尝试用=去查找这个带有NULL的数据,则会发现什么都找不到

SELECT * FROM exam_result WHERE chinese = NULL;

在这里插入图片描述

所以如果要筛选带有NULL的数据,则要用<=>或者IS NULL

SELECT * FROM exam_result WHERE chinese <=> NULL;
#或者用下面的写法
SELECT * FROM exam_result WHERE chinese IS NULL;

这部分!= <>也是同理,也不能和NULL进行比较,如果要比较不为NULL则应该使用IS NOT NULL,或者将逻辑运算符!<=>配合使用,两个正确的比较案例如下

SELECT * FROM exam_result WHERE chinese IS NOT NULL;
#或者可以用下面的写法 当前还没有讲解!的使用 看一下即可
SELECT * FROM exam_result WHERE !(chinese <=> NULL);

接下来看3个比较特殊一点的条件运算符,首先是BETWEEN...AND...,直接先看一个案例

#搜索数学成绩在60到70的人
SELECT * FROM exam_result WHERE math BETWEEN 60 AND 70;

在这里插入图片描述

此时我们可以发现数学成绩等于60和等于70的人也被查询进来了,因为BETWEEN...AND...的两边边界都是闭区间(也就是会包括边界值)


IN虽然看起来有点抽象,但是我们只要一看例子立马就懂,直接上例子

#搜索数学成绩等于60, 70, 80, 90的人
SELECT * FROM exam_result WHERE math IN (60, 70, 80, 90);

这个实际上就是只会筛选出等于我们所列出的情况的数据,相当于将多个等于号浓缩在了一起


LIKE一般用于执行字符串查询,比如我可以用它实现:查询一个姓李的人的成绩,查询一个名字中含有孙的人的成绩

在使用LIKE进行查询的时候,我们用两个特殊符号和字符串组合从而打到模糊匹配的效果:%用于替代任意个字符,包括零个字符,_只能用于替代一个字符

我们直接看例子,结合每一句查询语句和上面的注释来理解模糊匹配的规则

#查询名字里面带孙字的人
SELECT * FROM exam_result WHERE name LIKE '%孙%';

#查询名字为两个字且姓王的人
SELECT * FROM exam_result WHERE name LIKE '王_';

#查询名字第二个字为孙字的人
SELECT * FROM exam_result WHERE name LIKE '_孙%';

#查询名字里面最后一个字为孙字的人
SELECT * FROM exam_result WHERE name LIKE '%孙';

#查询姓孙的人
SELECT * FROM exam_result WHERE name LIKE '孙%';

逻辑运算符其实也非常好理解,逻辑运算符就是对已有的条件表达式进行操作,直接看几个例子

#搜索数学大于80分,并且英语小于90分的人
SELECT * FROM exam_result WHERE math > 80 AND english < 90;

#搜索语文小于80分,或者英语大于80分的人
SELECT * FROM exam_result WHERE chinese < 80 OR english > 80;

或者是我要对条件进行反转:搜索数学在90分以上的人,此时我可以直接写math > 90,但也可以利用!逻辑取反来达到相同的结果

#搜索数学在90分以上的人
SELECT * FROM exam_result WHERE !(math <= 90);

指的一提的是,ANDOR同时使用的时候可能就会发生一些运算符优先级的问题,因此在多次同时使用两者的时候建议加上括号

分页查询

有些时候我们即使运用了条件查询,一次性展示的数据还是有点多,我们此时希望能够通过其他的方式来进一步减少数据的展示量,那么就可以使用分页查询来做到这一点,语法如下

SELECT * FROM exam_result LIMIT 单次查询的数据量 OFFSET 偏移量

单次查询的数据量很好理解,就是我们一次要查的数据的数量,偏移量则是指的要从哪个位置开始查询(第一个位置的偏移量为0,类似于数组的下标)

这里依旧借用上一部分的成绩表中的数据来进行举例,直接看例子

#查询前三条数据
SELECT * FROM exam_result LIMIT 3 OFFSET 0;

如果要从第4条数据开始查询,那么我们就将OFFSET修改为3即可,其他的以此类推

#从第四条数据开始查询
SELECT * FROM exam_result LIMIT 3 OFFSET 3;

另外还有一些写法,我们简单看一下即可,我们使用分页查询时主要使用上面的那种方式即可

#查询x条数据,默认OFFSET为0
SELECT * FROM exam_result LIMIT x;

#查询x条数据,OFFSET为y
SELECT * FROM exam_result LIMIT y, x;

表达式查询

表达式查询支持我们在查询的时候直接对列进行运算,例如我们想要查询同学们成绩的总和,此时并不需要我们创建一张新的表并且新建一列自己算,我们可以直接使用表达式查询,语法如下

SELECT 列名/表达式 FROM exam_result;

这里就以查找同学们的总成绩为例子

#查询语文+数学+英语的总和
SELECT id, name, chinese + math + english FROM exam_result;

包括我们也可以查询语文减去10分,英语加上10分等等类似的表达式

#查询数学+10分后的结果
SELECT id, name, math + 10 FROM exam_result;

此时可能有人产生了一些问题:我的这个表达式操作,会不会影响我们数据库中存储的数据呢?

答案是并不会,首先我们执行的本身就不是修改的操作,而是查询的操作。并且我们此时看到的表实际上并不是数据库中实际的表,而是一张服务器返回给我们看的临时表,因此即使我们再怎么修改这张临时表上面的数据,数据库存储的数据并不会改变

别名查询

使用了表达式查询后,我们会发现有时候一些表达式过于累赘,一大串在那里非常难看并且不直观,那么此时我们就可以使用别名查询,给我们的表达式取一个别名,语法如下

SELECT 列名/表达式名 AS 别名 FROM 表名;

比如我们将上面查询总分的chinese + math + english取一个别名为total

#查询语文+数学+英语的总和,并且将表达式命名为total
SELECT id, name, chinese + math + english AS total FROM exam_result;

并且我们还可以对列名进行别名查询,也可以同时取多个别名

#分别赋予别名
SELECT id AS student_id, name AS student_name, chinese + math + english AS total FROM exam_result;

排序查询

我们还可以对查询的数据进行排序,语法如下

SELECT 列名 FROM 表名 ORDER BY 列名 排序方式;

其中排序方式有两种:ascdesc,分别指代了升序和降序(也可以不指定排序方式,此时默认为升序)

例如,我要查询以数学成绩降序排序的数据

#根据数学成绩降序排序
SELECT id, name, math FROM exam_result ORDER BY math DESC;

另外我们也可以利用别名来进行排序,但是前提是一定要在前面设置过这个别名

例如,给求总分的表达式设置一个别名total,并且使用total给查询出的数据进行排序

#根据总成绩降序排序
SELECT id, name, chinese + math + english AS total FROM exam_result ORDER BY total DESC;

我们还可以利用我们没查询的列来进行排序

例如,我们查询语文成绩,但是是以英语成绩来排序的

#根据英语成绩升序排序,但是没有查询英语列
SELECT id, name, chinese FROM exam_result ORDER BY english ASC;

去重查询

去重查询,顾名思义就是能够帮我们把内容相同的数据进行去重,只展示一次,语法如下

SELECT DISTINCT 列名 FROM 表名;

为了能够测试效果,我们先往这个成绩表里面加两个数学成绩相同的数据

INSERT INTO exam_result (id, name, math) VALUES (11, '孙悟空', 90.0), (12, '沙悟净', 90.0);

然后我们先不用去重直接查询一波数学成绩,并且为了能够直观观察我们使用一个排序

SELECT math FROM exam_result ORDER BY math;

此时我们会发现数学成绩为90.0的那个数据出现了两次
在这里插入图片描述

接下来我们加上去重关键字再查询一次

SELECT DISTINCT math FROM exam_result ORDER BY math;

那么这个时候我们就会发现,数学成绩为90.0的那个数据就只会出现一次了

在这里插入图片描述

但是注意,我们这个时候如果再查询一个id或者name这样的数据,那么此时这两个数学成绩为90.0的数据就不会再被认为是重复的了,也就不会被去重

总结

上面讲的很多不同的查询模式,上面讲述的时候为了方便理解没有混合使用,但是实际上也是可以混合进行使用的,并不是说我每一次只能用一个查询方法,例如我可以排序后进行分页查询等等类似操作。但是这个就交给各位自行研究了

删除数据

删除数据的语法一般情况下是要借用条件查询的条件语法的,语法如下

DELETE FROM exam_result WHERE 条件表达式;

直接看例子

#删除全部成绩都为空的数据
DELETE FROM exam_result WHERE chinese IS NULL AND math IS NULL AND english IS NULL

删除并没有什么好多讲的,主要核心就是条件语法的书写


实际上我们也可以不使用任何条件语法,但是这样就是一个危险操作,是直接删除整个表的数据,不推荐使用,使用前务必确认自己要执行这样的操作

修改数据

修改数据一般也需要借用条件查询的条件语法,否则后果同上,修改数据的语法如下

UPDATE 表名 SET 要修改的列 = 要设定的数据 WHERE 条件表达式;

直接看一个例子

#将11号同学的英语成绩修改为85.5分
UPDATE exam_result SET english = 85.5 WHERE id = 11;

我们还可以直接给要要修改的列直接以自身为标准进行修改

#将11号同学的英语成绩加10分
UPDATE exam_result SET english = english + 10 WHERE id = 11;

但是此时假如我们尝试对这里面的列乘二那就可能会报错

#给11号同学的英语成绩乘2
UPDATE exam_result SET english = english * 2 WHERE id = 11;

在这里插入图片描述

因为此时我们的结果数据超出了DECIMAL(3, 1)的表达范围,因此在执行修改操作的时候要注意不要超出数据类型的表达范围


如果不指定条件,这里也会直接修改该列中所有行的数据,务必在执行这样的操作的时候反复确认,不要因为误操作导致不可挽回的后果

猜你喜欢

转载自blog.csdn.net/qq_42150700/article/details/132883804
今日推荐