DML 数据删除语言,有

  • 插入 insert
  • 修改 update
  • 删除 delete

插入语句

语法

  1. insert into 表名 (字段名1, 字段2 ...) values (值1, 2 ...);

注意点

  • 插入的值要与对应列的类型一致或者兼容

  • 不可以为 null 列必须插入值。可以为 null 的列的值有两种插入方式

    1. 插入时,指定列名,显式指定对应值为 null
      insert into beauty (id, name, sex, borndate, phone)
      values (29, "xxx", "女", null, "1234521");
      
  1. 插入时,不指定列名及其值
    #忽略指定 borndate 列及其值
    INSERT INTO beauty (id, NAME, sex, phone) 
    VALUES (30, "xxx", "女", "1234521");
    
  • 可以省略指定列名,默认所有列,且列名顺序与表中列的顺序一致

插入方式二

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

两种方式的区别

  • 方式一支持插入多行,方式二不支持
    insert into beauty (id, name, sex, borndate, phone) 
    values (29, "xxx", "女", null, "1234521"),
    (30, "xxx", "女", null, "1234521"),
    (31, "xxx", "女", null, "1234521");
    
  • 方式一支持子查询 (将结果集挨个插入),方式二不支持
    insert into (id, name, phone)
    select 32, "2333", "12321";
    

修改语句

修改语句可以修改单表记录,也可以修改多表记录

单表修改

update 表名
set 列=新值, 列=新值...
[where 筛选条件];  #set 的是筛选后的结果集字段
#修改beauty表中姓双的人的电话改为 112233
update beauty
set beauty.`phone` = "112233"
where beauty.`name` like "%双%";

多表修改 (级联修改)

SQL 92

update 表1 别名, 表2 别名
set 字段=值, 字段=值 ...
where 连接条件
and 筛选条件;

SQL 99

update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 字段=值 ...
where 筛选条件;
#修改张无忌的所有女朋友的手机号为 144
update beauty be
inner join boys bo
on be.`boyfriend_id` = bo.`id`
set be.`phone` = "144"
where bo.`boyName` = "张无忌";
#修改没有男朋友的女神的男朋友编号都为 1
update beauty be
left join boys bo
on be.`boyfriend_id` = bo.`id`
set be.`boyfriend_id` = 1
where bo.`id` is null;

删除语句

单表删除

语法

delete from 表名 where 筛选条件;
#删除手机号以 9 结尾的女神信息
DELETE FROM beauty 
WHERE phone LIKE "%9";

使用 truncate 关键字可以删除整张表上的记录,并且不能加筛选条件

truncate table 表名;

多表删除

SQL 92 语法

delete 别名(删哪张表的记录就写哪张表的别名,同时删哪几张表就同时写哪几张表) 
from 表1 别名, 表2 别名
where 连接条件
and 筛选条件;

SQL 99 语法

select 别名(删哪张表的记录就写哪张表的别名,同时删哪几张表就同时写哪几张表) 
from 表1 别名
inner|left|right join 表2 别名
on 连接条件
where 筛选条件;

级联删除和级联置空

级联删除:添加外键约束时追加关键字 on delete cascade

级联置空:添加外键约束时追加关键字 on delete set null

约束的添加

创建表时添加

create table 表名(
    字段名 字段类型 not null,
    字段名    字段类型 default 值,
    字段名 字段类型 unique,
    字段名 字段类型 primary key, #列级约束
    [constraint 约束名] foreign key(字段名) references 主表(被引用字段) #表级约束
);

列级约束和表级约束

  • 列级约束不能使用外键;表级约束不能使用非空和默认
  • 列级约束不能起约束名;表级约束可以起约束名,但是对主键无效
  • 列级约束可以在一个字段上追加多个,相互之间使用空格隔开,无顺序要求

修改表时添加和删除

unique,not null,default

#添加
alter table 表名 modify column 字段名 字段类型 列级约束语法;
#删除
alter table 表名 modify column 字段名 字段类型;

主键

#添加
alter table 表名 add primary key(字段名);
#删除
alter table 表名 drop primary key;

外键

#添加
alter table 表名 add [constraint 约束名] foreign key(字段名) references 主表名(被引用字段);
#删除
alter table 表名 drop foreign key(约束名);

唯一

#添加
alter table 表名 add unique(字段名);
#删除
alter table 表名 drop index 约束名;

delete 和 truncate 区别

  1. delete 能加 where 进行条件筛选,truncate 不能加
  2. 加入要删除的表中有自增长列,如果使用 delete 删除后再插入数据,自增长列的值从最后删的记录的值开始自增;而 truncate 的删除后再插入数据,自增长列的值从 1 开始
  3. truncate 没有返回值;delete 删除有返回值,返回被影响的行数
  4. truncate 删除不能回滚;delete 删除能够回滚
  5. truncate 是直接删除原来的表,再重新创建一个结构相同的新表 ( 导致自增长字段的值从 1 开始 );而 delete 则是一行一行的删除数据