前言
DML,即Data Manipulation Language, 数据操作语言,更加通俗一下就是对表中记录进行增删改操作。
DML语言分为
- 插入:insert
- 修改:update
- 删除:delete
一、insert插入
这里的语法有两种方式,第一种
INSERT INTO 表名[(列名,...) ]VALUES (值1,...)[,(值1,...),...];
这里的列名可以省略,如果省略则默认对表中所有字段都需要在VALUES
后面的括号中给出对应的值。对应的列名顺序就是默认顺序。
这里需要注意的是,不论列名是否省略,列名和值名一定是相互对应的,比如他们的类型、数量,必须一一对应,否则会报错或者出现意料之外的结果。
它支持同时插入多行数据,并且还支持子查询的方式进行插入,如下面语法
INSERT INTO 表名[(列名,...) ] SELECT '',''...
SELECT
后面就是一个查询结果集了,这里可以是一些常量,也可以是一个对数据库表的查询返回的结果集,但是有一点很重要,就是一定要和前面的插入列名相对应。
第二种:
INSERT INTO 表名
SET 列名=值,列名=值...
第二种方式使用的较少,因为第二种方式是不支持多行插入的,同时也是不支持子查询的,其实第二种方式和修改命令有点相似。
例子:
INSERT INTO `student`
(id,`name`,`address`)
VALUES
(7,'frank','china');
INSERT INTO `student`
(id,`name`,`address`)
VALUES
(8,'jake','American'),
(9,'lili','American');
INSERT INTO `student`
(id,`name`,`address`)
SELECT gra.id, gra.studentId, gra.class
FROM `grade` gra; # 这里没有放到括号里面
INSERT INTO `student`
SET id=13, `name`='zhonghua', address='Inuit';
二、update修改
修改可以对单表进行修改,当然也可以对多表进行修改
单表修改
UPDATE 表名
SET 列名=新值,列=新值....
[WHERE 筛选条件]
多表修改
可以使用92年语法的多表修改,这里就不举例了
UPDATE 表名1 别名
INNER|LEFT|RIGHT JOIN 表名2 别名
ON 连接条件
SET 列名=新值,列=新值....
[WHERE 筛选条件]
可以看到不管是单表修改还是多表修改都是可以加筛选条件,当然了正常情况下也是要加筛选条件,因为如果不加筛选条件mysql就认为你是对于所有记录都进行修改,正常情况下都是对特定的记录进行修改的,所以筛选条件是很重要的。
关于这里,我认为多表修改,它肯定是先进行一个查询操作,然后对查询出来的结果集进行一个数据更新,然后再将新的结果集赋值原来的结果集中。这有点像java多线程中免锁容器了。
例子:
UPDATE `student`
SET id=1, `name`='我不叫小明了', address='Inuit'
WHERE id=1;
UPDATE `student`stu
JOIN `grade` gra
ON gra.studentId=stu.id
SET stu.address='我是连表修改',gra.class='中学'
WHERE stu.id=1;
三、delete删除
删除同样有两种方式,第一种是DELETE
,第二种是TRUNCATE
。
DELETE
删除
DELETE FROM 表名
[WHERE 筛选条件] # 单表删除
DELETE 要删除的表别名...
FROM 表1 别名
INNER|LEFT|RIGHT JOIN 表2 别名
[WHERE 筛选条件] # 多表删除,这是99年多表连接语法,92年就不介绍了
TRUNCATE
删除
TRUNCATE TABLE 表名
对比一下这两个删除的不同呢,主要有以下几点
DELETE
可以加WHERE
筛选条件,而·TRUNCATE
不能加;TRUNCATE
删除其实就是整表删除,不需要考虑那么多的条件,所以效率会高一些;TRUNCATE
删除没有返回值,DELETE
删除有返回值(删除的条数);- 在事务中,
TRUNCATE
删除不能回滚,而DELETE
删除可以回滚; - 假设表中有自增字段,那么
DELETE
删除再插入数据,自增长列从断电开始;而TRUNCATE
删除后,再插入数据,自增长列的值从1开始。
例子:
DELETE FROM `student`
WHERE id=10;
DELETE stu,gra
FROM `student` stu
LEFT JOIN `grade` gra
ON gra.studentId=stu.id
WHERE gra.id=10;
需要注意的就是当多表删除的时候,在DELETE
后面的别名代表着要删除的记录,如果需要删除哪个表中的记录,那么就需要把哪个表的别名放到DELETE
后面。反之,如果不将别名放到DELETE
后面,哪怕是符合筛选条件的记录也不会被删除。
结语
这一篇博客比较简单,相对于上一节DQL的语法复杂程度来说差了很多,下一节是DDL,数据库定义语言。