DML 数据操作语言
数据操纵语言(Data Manipulation Language, DML)
一、 增 insert
-- 多条数据插入的话用关键字values
1、insert into table_name values ('','','',''),('','','','');
注:当插入的数据发生主键重复时,就会报错
2、insert into table_name values ('','','','') on duplicate update 主键=值,字段2=值2;
解释:当插入数据时,会先比较主键,如果主键重复,【on duplicate update】会使主键自动按设置的值进行赋值修改,
如果不重复,则正常插入
另外两种插入数据的方式
-
relpcae into
replace into table_name values ('','','',''); 注意:要求在表中必须存在主键或者唯一索引,执行时会判断主键或者唯一索引, 如果存在,那么会将原表中该条数据删除,然后再插入新的数据,如果不存在则会直接插入新数据
-
拓展情况: insert ignore into (使用 ignore 关键字可以忽视错误,使语句在发生错误时不报错)
insert ignore into table_name values ('','','',''); 注意:实际效果和正常的 insert into 一样,如果数据和插入的值相同,则忽略错误,否则正常插入 insert into在插入相同数据时会进行报错
二、 删 delete
-
最基础的条件删除
delete from table_name where 判断条件 注意:无where子句时,底层操作为一条一条删除所有行的数据,事务中可以回滚, 拓展:truncate table table_name; -- DDL语言,删除数据,底层操作为释放存储空间,删除整张表之后再建一张新表,保留原有表结构,在事务中不可回滚
-
按序删除
delete from table_name order by 字段名 limit n
-
delete 语句中使用join语句
-- 代码语句可能存在错误,需要验证修改 DELETE a FROM tablename AS a LEFT JOIN temp_name AS b ON a.ID = b.ID WHERE b.UserID > 0; DELETE a FROM tablename AS a LEFT JOIN temp_name AS b ON a.ID = b.ID WHERE b.ID IS not null;
-
on delete cascade
现有A、B两表根据某字段进行关联 在外键约束定义的末尾加上 on delete cascade [建B表时建立外键约束] foreign key(a_id) references A(a_id) on delete cascade (默认为A为主表,B为从表) 注意:当删除主表A的数据时,从表B中相关联的数据也会删除,因此此删除仅限于支持外键的存储引擎
三、 改 update
-
常规修改语句的统一结构
update [ignore] table_name -- 使用ignore关键字,当发生冲突时,忽视报错 set 字段1=值1,字段2=值2,....... [where 条件] -- 增加条件,筛选需要修改的数据,where子句和select中的使用方式一致 [order by .....] -- 对筛选出的数据进行排序,和select一样,正常使用。合理使用,可以防止主键发生冲突 [limit n]
-
update修改语句可涉及多表连接
-
赋值语句中使用子查询
update table_name A set 字段1=值1,字段2=(select子查询语句) -- 无论怎么变化,set子句依旧是表A特定字段1,2的赋值操作 where 子句 注意:update语句操作只会执行一次,成功执行一次where语句,则会成功执行一次子查询
-
第一种 update子句中加入多表连接 【笛卡尔连接】
-- 以下情况没有on子句来连接AB两表,实际情况则是对两表做笛卡尔积【m x n】 update A join B set 字段1=值1,字段2=值2,... where子句;
-
第二种 update子句中加入多表连接 【非join的多表连接】
update A,B set 字段1=值1,字段2=值2,... where 连接条件 and 数据筛选条件
-
第三种 update子句中加入多表连接 【外连接的多表连接】
update A join B [left|right] on AB两表连接条件 set 字段1=值1,字段2=值2,... where 某字段 is [not] null and 其他条件; 注意:外连接容易产生很多数据为null的字段,因此需要额外注意数据为空的情况
-