DML语言
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 筛选条件