MySQL之表数据操作

华子目录

  • 一、插入数据
    • insert语句
      • 方式1
      • 方式2
    • replace语句
      • 方式1
      • 方式2
    • insert和replace的区别
  • 二、修改数据
    • update语句
  • 三、删除数据
    • delete语句
    • truncate语句
  • drop,delete,truncate的区别

一、插入数据

insert语句

在表里面插入数据:默认情况下,一次插入操作只插入一行

方式1

语法

mysql> insert [into] 表名[(column1,column2......)] values
    -> (value1,values2......),
    -> (value1,values2......),
    -> ......................
    -> (value1,values2......);
mysql> create table class(
    -> `班号` int primary key auto_increment
    -> )engine=innodb auto_increment=1001 default charset=utf8mb4 row_format=dynamic;
Query OK, 0 rows affected (0.02 sec)


mysql> insert class(`班号`) values
    -> (null),
    -> (null),
    -> (null);
Query OK, 3 rows affected (0.01 sec)


mysql> select * from class;
+------+
| 班号 |
+------+
| 1001 |
| 1002 |
| 1003 |
+------+


mysql> insert class(班号) values
    -> (null);
Query OK, 1 row affected (0.01 sec)

mysql> select * from class;
+------+
| 班号 |
+------+
| 1001 |
| 1002 |
| 1003 |
| 1004 |
+------+

mysql> create table stu(
    -> `学号` int primary key auto_increment,
    -> `姓名` varchar(20) not null,
    -> `性别` enum('男','女'),
    -> `班级` int not null,
    -> constraint stu_class_foreign foreign key(`班级`) references class(班号)
    -> )engine=innodb auto_increment=1 default charset=utf8mb4 row_format=dynamic;
Query OK, 0 rows affected (0.03 sec)


mysql> desc stu;
+-------+-----------------+------+-----+---------+----------------+
| Field | Type            | Null | Key | Default | Extra          |
+-------+-----------------+------+-----+---------+----------------+
| 学号  | int             | NO   | PRI | NULL    | auto_increment |
| 姓名  | varchar(20)     | NO   |     | NULL    |                |
| 性别  | enum('男','女') | YES  |     | NULL    |                |
| 班级  | int             | NO   | MUL | NULL    |                |
+-------+-----------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> insert stu(学号,姓名,性别,班级) values
    -> (1,小天,,1001);
ERROR 1054 (42S22): Unknown column '小天' in 'field list'   # 小天不是字符串类型
mysql> insert stu(学号,姓名,性别,班级) values
    -> (1,'小天',,1001);
ERROR 1054 (42S22): Unknown column '男' in 'field list'  # 男不是字符串类型
mysql> insert stu(学号,姓名,性别,班级) values
    -> (1,'小天','男',1001);
Query OK, 1 row affected (0.01 sec)   # 单引号包裹,插入成功

mysql> insert stu(学号,姓名,性别,班级) values
    -> (1,"小红","女",1002);
ERROR 1062 (23000): Duplicate entry '1' for key 'stu.PRIMARY'    # 1必须是唯一值,否则插入失败
mysql> insert stu(学号,姓名,性别,班级) values
    -> (null,"小红","女",1002);
Query OK, 1 row affected (0.00 sec)   # auto_increment允许插入null

mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
|    1 | 小天 || 1001 |
|    2 | 小红 || 1002 |
+------+------+------+------+
2 rows in set (0.00 sec)

mysql> insert stu(学号,姓名,性别,班级) values
    -> (null,"小红","女",1009);   # 存在外键约束,1009不属于class表中的`班号`字段的范围
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`huazi`.`stu`, CONSTRAINT `stu_class_foreign` FOREIGN KEY (`班级`) REFERENCES `class` (`班号`))
mysql> insert stu(学号,姓名,性别,班级) values
    -> (null,"小刚","男",1004);
Query OK, 1 row affected (0.01 sec)  # 双引号包裹

mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
|    1 | 小天 || 1001 |
|    2 | 小红 || 1002 |
|    4 | 小刚 || 1004 |
+------+------+------+------+
# 为什么会是124,而不是123呢,因为当插入值为null时,auto_increment不管插入成功还是失败,都会自动加1


mysql> insert stu values
    -> (3,'乐乐','男',1003),
    -> (9,'天天','男',1002);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
|    1 | 小天 || 1001 |
|    2 | 小红 || 1002 |
|    3 | 乐乐 || 1003 |
|    4 | 小刚 || 1004 |
|    9 | 天天 || 1002 |
+------+------+------+------+
# 当插入3时,为什么3在4的前面?因为auto_increment有自动排序的功能

mysql> insert stu values
    -> (11,'小明','nn',1003);
ERROR 1265 (01000): Data truncated for column '性别' at row 1
# 插入失败的原因:'nn'不在('男','女')中

mysql> insert stu values
    -> (11,'小明',null,1003);
Query OK, 1 row affected (0.03 sec)
# 插入成功的原因:enum允许插入null值

方式2

语法

mysql> insert [into] 表名 set 字段1=,字段2=....;
mysql> insert stu set 学号=5,姓名='小花',性别='女',班级=1001;
Query OK, 1 row affected (0.01 sec)

mysql> insert stu set 学号=6,姓名='小哈',性别='未知',班级=1001;
ERROR 1265 (01000): Data truncated for column '性别' at row 1
# 插入失败的原因:'未知'不在('男','女')中


mysql> insert stu set 学号=6,姓名='小哈',性别=null,班级=1001;
Query OK, 1 row affected (0.00 sec)
# 插入成功的原因:enum允许插入null值

replace语句

方式1

语法

mysql> replace [into] 表名[(字段1,字段2......)] values
	-> (value1,values2......),
	-> (value1,values2......),
	-> .......................
	-> (value1,values2......);

方式2

语法

mysql> replace [into] 表名 set 字段1=1,字段2=2........;

insert和replace的区别

  • insert语句和replace语句的功能基本相同。不同之处在于:使用replace语句向表中插入新数据时,如果新数据的主键或唯一建约束的字段值与原有数据相同,则原有数据会被先删除,再插入新数据
  • 使用replace的最大好处就是可以将delete和insert合二为一(效果相当于更新),形成一个原子操作,这样就无需将delete操作与insert操作置于事务中了

注:原有数据删除时也不能违背外键约束的条件

二、修改数据

update语句

语法

mysql> update 表名 set 字段1=,字段2=...where 条件;
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
|    1 | 小天 || 1001 |
|    2 | 小红 || 1002 |
|    3 | 乐乐 || 1003 |
|    4 | 小刚 || 1004 |
|    5 | 小花 || 1001 |
|    6 | 小哈 | NULL | 1001 |
|    9 | 天天 || 1002 |
|   10 | 小哈 || 1001 |
|   11 | 小明 | NULL | 1003 |
+------+------+------+------+
9 rows in set (0.00 sec)

#将学号为6的性别改为男
mysql> update stu set 性别='男' where 学号=6;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
|    1 | 小天 || 1001 |
|    2 | 小红 || 1002 |
|    3 | 乐乐 || 1003 |
|    4 | 小刚 || 1004 |
|    5 | 小花 || 1001 |
|    6 | 小哈 || 1001 |
|    9 | 天天 || 1002 |
|   10 | 小哈 || 1001 |
|   11 | 小明 | NULL | 1003 |
+------+------+------+------+
9 rows in set (0.00 sec)


#将姓名为小哈的数据的性别改为女
mysql> update stu set 性别='女' where 姓名='小哈';
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
|    1 | 小天 || 1001 |
|    2 | 小红 || 1002 |
|    3 | 乐乐 || 1003 |
|    4 | 小刚 || 1004 |
|    5 | 小花 || 1001 |
|    6 | 小哈 || 1001 |
|    9 | 天天 || 1002 |
|   10 | 小哈 || 1001 |
|   11 | 小明 | NULL | 1003 |
+------+------+------+------+
9 rows in set (0.00 sec)


mysql> update stu set 性名='原有' where 性名='小天';
ERROR 1054 (42S22): Unknown column '性名' in 'where clause'
#修改错误的原因:update不能修改自身

注:当修改单个数据时,where条件必须具有唯一性,否则将修改多个数据

三、删除数据

delete语句

语法

mysql> delete from 表名 where 条件;(清空条件中的某一行或几行数据)

mysql> delete from 表名; (清空全部数据)
mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
|    1 | 小天 || 1001 |
|    2 | 小红 || 1002 |
|    3 | 乐乐 || 1003 |
|    4 | 小刚 || 1004 |
|    5 | 小花 || 1001 |
|    6 | 小哈 || 1001 |
|    9 | 天天 || 1002 |
|   10 | 小哈 || 1001 |
|   11 | 小明 || 1003 |
+------+------+------+------+


mysql> delete from stu where 班级=1004;
Query OK, 1 row affected (0.01 sec)

mysql> select * from stu;
+------+------+------+------+
| 学号 | 姓名 | 性别 | 班级 |
+------+------+------+------+
|    1 | 小天 || 1001 |
|    2 | 小红 || 1002 |
|    3 | 乐乐 || 1003 |
|    5 | 小花 || 1001 |
|    6 | 小哈 || 1001 |
|    9 | 天天 || 1002 |
|   10 | 小哈 || 1001 |
|   11 | 小明 || 1003 |
+------+------+------+------+

mysql> select * from class;
+------+
| 班号 |
+------+
| 1001 |
| 1002 |
| 1003 |
| 1004 |
+------+

mysql> delete from class where 班号=1004;
Query OK, 1 row affected (0.01 sec)

mysql> delete from class where 班号=1001;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`huazi`.`stu`, CONSTRAINT `stu_class_foreign` FOREIGN KEY (`班级`) REFERENCES `class` (`班号`))
# 不能删除的原因:存在外键约束

注:有外键约束时,当子表中存在主表的数据值,该主表中的数据值不能被删除;当主表中某数据值不在子表中时,主表中该数据值可以被删除

truncate语句

语法

mysql> truncate table 表名;(清空全部数据)

drop,delete,truncate的区别

  • drop: 删除数据库表中的列,删除速度最快。
  • delete:删除数据,保留表结构可以回滚如果数据量大,很慢
  • truncate: 删除所有数据保留表结构不可以回滚,一次全部删除所有数据,速度相对很快。

你可能感兴趣的:(mysql,数据库,运维)