DML(Data Manipulation Language)是指数据操作语言,用来对数据库中表的记录进行更新。

顾名思义,操作数据,因此是针对表记录,不是针对表结构。

插入语句(insert)

实现数据插入需要提供表名、列名、值,因此insert语句中需要包含这几部分。

方式一

其语法如下

insert into 表名(列名)values (对应的一行列值), (对应的一行列值), (对应的一行列值)

注意事项

  • 后面的values是复数形式
  • 插入的值类型要与列类型一致或兼容,l两者要一一对应(位置和数量),但不受顺序影响。
  • 列名可省略,默认按表的顺序列出全部字段。根据上一条,值部分需要写出全部。
  • 不可以为null的值必须插入数据。可以为null(表中列的属性为nullable)的列有两种插入方式
#省略可为空列的列名和值
insert into boy(id,boyname) values(123,'张仨')
#使用null作为可为空列的值
insert into bot(id,boyname,userCp) values('23','李四',null)

方式二

其语法如下

insert into 表名
set 列名=值,列名=值...

这种方式可显式插入有值的列,不必处理null值。

对比

  • 方式一支持批量插入多行数据,方式二不支持
  • 方式一支持子查询,方式2不支持。这导致方式一主流的原因。
insert into shoplist(orderID,flowerID,email,num) 
SELECT max(orderID),1,'a@163.com',1 from myorder  //注意insert后直接是子查询,没有 value关键字。子查询的查询列表是待插入列的值。

更新语句(update)

顾名思义,更新语句一般修改若干条记录,而不是全表,因此多和where子句联用。可分为更新单表记录和多表记录。

更新单表

基本语法

update 表名
set 列名=值,列名=值
[where子句]   //若没有where子句,则更新全表。

更新多表

更新多表指将多个表连接起来,作为一个大表。更新该大表的字段。因连接方式分为sql92和sql99,因此更新多表有两种语法

#sql92
update 表1 别名1,表2 别名2
set 列名=值,列名=值
where 别名1.key = 别名2.key  //连接条件必须有
and  [筛选条件]  

#sql99
update 表1 别名1
inner join | left outer join |right outer join  表2 别名2
on 别名1.key = 别名2.key  //先连接
set 列名=值,列名=值
[where子句]

实例 修改张无忌的女朋友的手机号为1114

#sql99方式
UPDATE beauty b
INNER JOIN 
boys bo
ON b.boyfriend_id = bo.id
SET  b.phone='1114'
WHERE bo.boyName = '张无忌'

#报错 where和set不能调换顺序
UPDATE beauty b
INNER JOIN 
boys bo
ON b.boyfriend_id = bo.id
WHERE bo.boyName = '张无忌' 
SET  b.phone='1114'

实例 修改没有男朋友的女神的男朋友的编号都为2

#使用子查询
UPDATE beauty b
SET boyfriend_id = 2
WHERE boyfriend_id NOT IN(
	SELECT DISTINCT id
	FROM boys
)
#使用连接
UPDATE boys bo
RIGHT JOIN beauty b
ON b.boyfriend_id = bo.id
SET b.boyfriend_id = 2
WHERE bo.id IS NULL

删除语句(delete)

删除的最小单位是行,因此删除操作需要找到删除行的位置,这要求sql语句中提供提供表名、筛选条件。删除语句分为单表删除和多表删除

单表删除(delete)

其基本语法如下。若没有where子句,会删除整个表的数据。

delete from 表名 [where子句]

单表删除(truncate)

其基本语法如下。注意truncate不能使用where子句。

truncate table 表名

truncate和delete对比

  • delete可以使用where子句,truncate不能使用。
  • truncate删除效率更高。
  • 若表中有自增长列,truacate删除后自增长列从1开始,delete删除后自增长列从断点开始。这说明mysql保存了delete删除现场信息。
  • truncate没有返回值,delete返回删除行数。
  • truncate不能回滚,delete可以。这一点呼应第三点,即mysql保存了delete现场。

多表删除(级联删除)

多表删指连接多个表后成为一个中间表,删除中间表的数据。分为sql92和sql99,其语法如下

#sql92
delete 别名1,别名2      //若删除一个表的数据,则只写一个表的别名。否则写两个
from 表1 别名,表2 别名
where 连接条件
and  筛选条件

#sql99
delete 别名1,别名2  //若删除一个表的数据,则只写一个表的别名。否则写两个
from 表1 别名1
inner|left |right join 表名2 别名2
on 连接条件
where 筛选条件