目录
1、新增操作(Create)
1.1 单行数据 + 全列插入
1.2 多行数据 + 全列插入
1.3 单行数据 + 指定列插入
2、修改操作(Update)
3、删除操作(Delete)
如何给一张表新增数据呢? 新增(Create),在我们数据库中,用 insert into 来进行新增操作,首先我们需要有一张表:
create table student (
id int,
name varchar(10),
sex varchar(2)
);
现在我们就对这个 student 这个表进行增加数据的操作。
这个意思就是,一次只插入一行,每一列都会插入数据,不存在没有不插入数据的列:
insert into student values(1, '张三', '男');
这样我们就插入了一条语句了,这里也可以用 value 不用 values,使用 value 在一次性插入多行的时候效率更优,而 values 在只插入一行的时候速度更优,所以不要看到有一个 s 就表示多行就更快了,其实是反着的。
如果一次性我有很多行数据想要插入,每列都要插入数据,如何做呢?
insert into student value
(2, '小美', '女'),
(3, '赵六', '男');
-- Query OK, 2 rows affected (0.00 sec)
-- Records: 2 Duplicates: 0 Warnings: 0
这里通过 mysql 客户端给出的信息,也能看到我们成功插入了 2 行数据了。
在我们这个 student 表中,所有的列都是允许为空值的,也就是表示该列中可以不填任何数据,如果我们要插入 李四,而 李四又 不想告诉别人他的性别,那我们就可以不用给 李四 插入性别那一列了:
insert into student (id, name) values (4, '李四');
-- Query OK, 1 row affected (0.00 sec)
那里面 sex 这一列没有被填充怎么办呢?那肯定就是用默认值去填充了!我们这里就是 NULL:
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| sex | varchar(2) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
-- 3 rows in set (0.00 sec)
注意:values () 括号中的内容,个数和类型一定要和表的结构匹配!如果是指定列插入,试具体情况而定!
insert into student(id, name) values(1, '张三', '男');
-- ERROR 1136 (21S01): Column count doesn't match value count at row 1
就比如说,我指定插入 id 和 name 这两列,但是我插入了三列,这样就会报错!多行数据 + 指定列插入也是如此,这里就在讲述了。
很多同学在学习阶段不重视修改操作,导致在面试的时候连修改的 SQL 是写错的,所以增删改查,一个都不能少!
语法:
update 表名 set 列名 = 值 where 条件;
我们先来看下表中有哪些数据:
select * from student;
+------+--------+------+-------+--------+
| id | name | sex | java | python |
+------+--------+------+-------+--------+
| 1 | 张三 | 男 | 88.20 | 87.90 |
| 2 | 李四 | 男 | 92.50 | 78.20 |
| 3 | 小美 | 女 | 80.90 | 68.60 |
| 4 | 小花 | 男 | 97.00 | 71.30 |
| 5 | 李四 | 男 | NULL | NULL |
| 6 | 小花 | 女 | NULL | NULL |
+------+--------+------+-------+--------+
-- 6 rows in set (0.02 sec)
● 这里 python 老师觉得有些同学分数太低,决定把 python 分数低于 80 分的同学加上 5 分:
update student set python = python + 5 where python < 80;
-- Query OK, 3 rows affected (0.00 sec)
-- Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from student;
+------+--------+------+-------+--------+
| id | name | sex | java | python |
+------+--------+------+-------+--------+
| 1 | 张三 | 男 | 88.20 | 87.90 |
| 2 | 李四 | 男 | 92.50 | 83.20 |
| 3 | 小美 | 女 | 80.90 | 73.60 |
| 4 | 小花 | 男 | 97.00 | 76.30 |
| 5 | 李四 | 男 | NULL | NULL |
| 6 | 小花 | 女 | NULL | NULL |
+------+--------+------+-------+--------+
-- 6 rows in set (0.00 sec)
这里我们发现 id 为 2,id 为 3, id 为 4,的同学 python 分数都加了 5 分,而后面两个 python 成绩为 NULL 的同学为什么没有加呢?前面不是说过 NULL 是最小值吗?但是这里我们注意,NULL 是最小值,但是 NULL 是无法进行算数运算的!
注意:update 操作是实际在修改服务器硬盘上的数据!
● 将所有同学的 java 成绩减少 5 分:
update student set java = java - 5;
-- Query OK, 4 rows affected (0.00 sec)
-- Rows matched: 6 Changed: 4 Warnings: 0
mysql> select * from student;
+------+--------+------+-------+--------+
| id | name | sex | java | python |
+------+--------+------+-------+--------+
| 1 | 张三 | 男 | 83.20 | 87.90 |
| 2 | 李四 | 男 | 87.50 | 83.20 |
| 3 | 小美 | 女 | 75.90 | 73.60 |
| 4 | 小花 | 男 | 92.00 | 76.30 |
| 5 | 李四 | 男 | NULL | NULL |
| 6 | 小花 | 女 | NULL | NULL |
+------+--------+------+-------+--------+
-- 6 rows in set (0.00 sec)
上述可以发现,如果 update 后面不加 where 条件的话,默认就是对指定列的每一行都匹配上了!仍然还是有空值,因为空值是无法进行算数运算的!
注意:这里的 java = java - 5,一定不要写成 java -= 5,因为 SQL 是一门比较老的语言,很多的语法细节和 Java 啥的还是差别比较大的。
● 如果小美考试作弊了,被老师发现了,每一科的成绩都将按照 0 分进行处理,这时我们 update 也可以同时去修改多个列:
update student set java = 0, python = 0 where name = '小美';
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from student;
+------+--------+------+-------+--------+
| id | name | sex | java | python |
+------+--------+------+-------+--------+
| 1 | 张三 | 男 | 83.20 | 87.90 |
| 2 | 李四 | 男 | 87.50 | 83.20 |
| 3 | 小美 | 女 | 0.00 | 0.00 |
| 4 | 小花 | 男 | 92.00 | 76.30 |
| 5 | 李四 | 男 | NULL | NULL |
| 6 | 小花 | 女 | NULL | NULL |
+------+--------+------+-------+--------+
-- 6 rows in set (0.00 sec)
● 学校为了避免同学们成绩相差过大而失去信心,现需将总分为前两名同学每科成绩降低 3 分:
update student set java = java - 3, python = python - 3 order by java + python desc limit 2;
-- Query OK, 2 rows affected (0.00 sec)
-- Rows matched: 2 Changed: 2 Warnings: 0
这个 SQL 执行是这样的,先按照总分进行降序排序,然后再只选取两个,由于没有 where 条件,所以匹配的是对应列所有行,但是由于 limit 2,限制了只有 2 行,所以就能达到针对前两名的总分减 3 了:
mysql> select * from student;
+------+--------+------+-------+--------+
| id | name | sex | java | python |
+------+--------+------+-------+--------+
| 1 | 张三 | 男 | 80.20 | 84.90 |
| 2 | 李四 | 男 | 84.50 | 80.20 |
| 3 | 小美 | 女 | 0.00 | 0.00 |
| 4 | 小花 | 男 | 92.00 | 76.30 |
| 5 | 李四 | 男 | NULL | NULL |
| 6 | 小花 | 女 | NULL | NULL |
+------+--------+------+-------+--------+
-- 6 rows in set (0.00 sec)
通过查询修改后的,发现确实总分前两名的同学每科成绩都减少了 3 分。
对于 update 操作,我们也需要谨慎,update 中的条件,务必保证要是正确的,千万不能把不该改的数据给改了!!!
delete from 表名 where 条件;
● 删除 java 成绩或者 python 成绩为 NULL 的同学信息:
delete from student where java <=> NULL or python <=> NULL;
-- Query OK, 2 rows affected (0.01 sec)
mysql> select * from student;
+------+--------+------+-------+--------+
| id | name | sex | java | python |
+------+--------+------+-------+--------+
| 1 | 张三 | 男 | 80.20 | 84.90 |
| 2 | 李四 | 男 | 84.50 | 80.20 |
| 3 | 小美 | 女 | 0.00 | 0.00 |
| 4 | 小花 | 男 | 92.00 | 76.30 |
+------+--------+------+-------+--------+
-- 4 rows in set (0.00 sec)
注意 :删除操作也是在操作数据库服务器的硬盘,需要小心!
delete 的操作,后面的条件是可以跟 update 一样的,支持 where,order by,limit 等操作。
如果没有写任何条件,那就是把整个表中的数据都删除了:
delete from student;
-- Query OK, 4 rows affected (0.00 sec)
select * from student;
-- Empty set (0.00 sec)
对于这两期的内容来说,并没有什么难点,需要是多加练习,熟悉 SQL 的语法,不要去记忆一些关键字,一定要孰能生巧,你敲多了,自然就记住了!
下期预告:【MySQL】查询操作(基础篇)