我们在前面两章介绍的是库和表的创建与更改。那么本章节讲解的则是当我们创建好库和表以后,如何向表中插入数据、更改数据、删除数据与查询数据。
我们先创建一张学生表。
这张表中有三个变量,学生的学号(id),学生的姓名(name),学生的邮箱(email)。
insert into 表的名称 values (变量1的值,变量2的值...);
insert into 表的名称 values (变量1的值,变量2的值...),(变量1的值,变量2的值...),(变量1的值,变量2的值...)....;
insert into 表的名称(变量1,变量2...) values (变量1的值,变量2的值...),(变量1的值,变量2的值...)...;
我们在插入数据的时候,往往由于主键或者唯一键对应的值已经存在而导致插入失败。此时,我们可以通过一些语法操作,让我们的插入更新已存在的数据。
在插入数据的语句后方加上:on duplicate key update 变量1 = 更新值1, 变量2 = 更新值2....;
当我们输入插入语句后,如果插入成功的话,mysql会给我们反馈,即Query OK, 2 rows affected (0.08 sec)
。那么这里几行被更新,其实能反馈出我们的数据是冲突后更新,还是直接插入。
-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新
这里要分成两类来讨论。如果说我们插入的数据与主键和唯一键没有冲突,则直接插入数据。如果说我们的插入的数据与主键和唯一键发生了冲突,则将原来数据删除后再插入。
replace into 表的名称 (变量1,变量2...) values (变量值1,变量值2...);
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入
select * from 表的名称;
select 变量1,变量2... from 表的名称;
select 变量1,变量2...表达式1,表达式2... from 表的名称;
select 变量1 别名1,变量2 别名2...from 表的名称;
select distinct 变量1,变量2.... from 表的名称;
在介绍where语句之前,我们再创建一个成绩表并插入一些数据,语句如下:
创建表:
create table exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);
插入数据:
insert into exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
where的后面往往跟随某些条件语句,从而筛选出满足条件的特定数据。
select * from 表的名称 where 数据满足的条件;
select * from exam_result where english < 60;
方法1:
select * from exam_result where chinese >= 80 and chinese <= 90;
方法2:
select * from exam_result where chinese between 80 and 90;
方法1:
select * from exam_result where math = 58 or math = 59 or math = 98 or math = 99;
方法2:
select * from exam_result where math in (58, 59, 98, 99);
select * from exam_result where name like '孙%';
select * from exam_result where name like '孙_';
select name, chinese+math+english 总分 from exam_result where chinese+math+english < 200;
这里用到的是之前创建的stu表。
select * from stu where email is not null;
select * from stu where email is null;
升序排序
select * from 表的名称 order by 变量名(或者表达式) asc
降序排序
select * from 表的名称 order by 变量名(或者表达式) desc
如果我们不写asc或者desc的话,mysql默认升序。
select * from exam_result order by chinese asc;
select name 姓名, chinese+math+english 总分 from exam_result order by chinese+math+english desc;
select 语句后面加 limit n;
select 语句后面加 limit s, n;
select 语句后面加 limit n offset s;
update 表的名称 set 变量1=更新值1,变量2=更新值2... [where...] [order by...] [limit ..]
[ ]中括号内为可选的选项。
如果我们后面对数据不做任何筛选,则该语句会对全表进行数据更新。
将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
delete from 表的名称 [where...] [order by...] [limit...];
[]中括号内为可选选项。如果我们不加任何条件,该语句会删除整个表的数据。
truncate 表的名称;
delete可以对筛选后的特定数据进行删除,但是truncate只能删除整个表。
delete不会重置auto_increment的值,但是truncate会重置auto_increment
我们在这里证明一下第点:是否重置auto_increment。
证明之前,我们先创建一个只有id变量的表T。如下:
然后插入多个数据:
我们先看delete语句:
先用delete删除整个表的数据。
然后我们插入一个数据,看看系统默认补充的数值是多少。
我们发现默认插入的是4,而不是1。
我们还可以通过查看创建表时候的语句来检查自增长的数值。
这里本来应该显示4,但是我们在删除以后,又插入了一个数,所以这里显示的是5。
接着我们看truncate语句:
我们再创建一个表T2,这个表中还是只有一个自增长的变量id。
然后我们用truncate语句删除这个表。
接着我们删除这个表,然后再插入一个空的数据,看看自增长会为该数据赋值为什么?
我们可以用insert语句插入数据,同时我们还可以用select查询数据。那么我们能不能将查询的数据进行插入呢?
答案是可以的。
insert into 表的名称[变量1,变量2....] select ...