说明

DML(Data Manipulation Language)数据操作语言,是指对数据库进行增删改的操作指令,主要有INSERT、UPDATE、DELETE三种,代表插入、更新与删除,这是学习MySQL必要掌握的基本知识。

与之前的章节一致,下方语法中 [] 中内容可以省略。

INSERT操作

逐行插入

语法格式如下:

1 insert into t_name[(column_name1,columnname_2,...)] values (val1,val2);
2 或者
3 insert into t_name set column_name1 = val1,column_name2 = val2;

1、字段名称和值需要保证数量一直,类型一直,位置一 一对应,否则可能导致异常。

2、not null的字段需要保证有插入的值,否则会报非空的异常信息。允许null的字段如果不想输入数据,字段和值都不出现,或者value用null代替。

3、数值类型,值不需要用单引号括起来,其他的如字符型或日期类型,值需要用单引号括起来;

4、如果表名后面的column_name 省略不写,则代表覆盖该表的所有字段。值的顺序和表中字段顺序须保持一致。

5、上述第二种语法的写法更繁琐,现在比较少使用。

测试一下:

 1 mysql> desc `user1`;
2 +---------+--------------+------+-----+---------+----------------+
3 | Field | Type | Null | Key | Default | Extra |
4 +---------+--------------+------+-----+---------+----------------+
5 | id | bigint(20) | NO | PRI | NULL | auto_increment |
6 | name | varchar(20) | NO | | NULL | |
7 | age | int(11) | NO | | 0 | |
8 | address | varchar(255) | YES | | NULL | |
9 +---------+--------------+------+-----+---------+----------------+
10 4 rows in set
11
12 mysql> insert into `user1`(name,age,address) values('brand',20,'fuzhou');
13 Query OK, 1 row affected
14
15 mysql> insert into `user1`(age,address) values(20,'fuzhou');
16 1364 - Field 'name' doesn't have a default value
17
18 mysql> insert into `user1` values('sol',21,'xiamen');
19 1136 - Column count doesn't match value count at row 1
20
21 mysql> insert into `user1` values(null,'sol',21,'xiamen');
22 Query OK, 1 row affected
23
24 mysql> select * from `user1`;
25 +----+-------+-----+---------+
26 | id | name | age | address |
27 +----+-------+-----+---------+
28 | 3 | brand | 20 | fuzhou |
29 | 4 | sol | 21 | xiamen |
30 +----+-------+-----+---------+
31 2 rows in set

批量插入

语法格式如下:

1 insert into t_name [(column_name1,column_name2)] values (val1_1,val1_2),(val2_1,val2_2)...);
2 或者
3 insert into t_name [(column_name1,column_name2)] select o_name1,o_name2 from o_t_name [where condition];

1、上述第一个语法,values 后面的值个数需要同等配对 column的数量,可以设置多个,逗号隔开,提高数据插入效率。

2、第二个语法,select查询的字段和插入数据的字段数量、顺序、类型需要一致。 insert的字段可以省略,代表插入t_name表所有字段。条件可选。

测试一下:

 1 mysql> insert into `user1`(name,age,address) values('brand',20,'fuzhou'),('sol',21,'xiamen');
2 Query OK, 2 rows affected
3 Records: 2 Duplicates: 0 Warnings: 0
4
5 mysql> select * from `user1`;
6 +----+-------+-----+---------+
7 | id | name | age | address |
8 +----+-------+-----+---------+
9 | 5 | brand | 20 | fuzhou |
10 | 6 | sol | 21 | xiamen |
11 +----+-------+-----+---------+
12 2 rows in set
 1 mysql> desc `user2`;
2 +---------+--------------+------+-----+---------+----------------+
3 | Field | Type | Null | Key | Default | Extra |
4 +---------+--------------+------+-----+---------+----------------+
5 | id | bigint(20) | NO | PRI | NULL | auto_increment |
6 | name | varchar(20) | NO | | NULL | |
7 | age | int(11) | NO | | 0 | |
8 | address | varchar(255) | YES | | NULL | |
9 | sex | int(11) | NO | | 1 | |
10 +---------+--------------+------+-----+---------+----------------+
11 5 rows in set
12
13 mysql> insert into `user2` (name,age,address,sex) select name,age,address,null from `user1`;
14 Query OK, 2 rows affected
15 Records: 2 Duplicates: 0 Warnings: 0
16
17 mysql> select * from `user2`;
18 +----+-------+-----+---------+------+
19 | id | name | age | address | sex |
20 +----+-------+-----+---------+------+
21 | 7 | brand | 20 | fuzhou | 1 |
22 | 8 | sol | 21 | xiamen | 1 |
23 +----+-------+-----+---------+------+
24 2 rows in set

UPDATE操作

数据更新

语法格式如下:

1 update t_name [[as] alias] set [ alias.]column_name1 = val1,[alias.]column_name2 = val2 [where condition];

1、alias 是别名的意思,别名越简单识别性越强越好,容易辨认,方便操作,没有别名情况下,表名就是别名

2、as alias 中as也是可选的,where 条件也是可选的,所以用户可以选择需要的,符合特定条件的部分数据进行更新。

测试一下:

 1 mysql> select * from `user2`;
2 +----+-------+-----+---------+------+
3 | id | name | age | address | sex |
4 +----+-------+-----+---------+------+
5 | 7 | brand | 20 | fuzhou | NULL |
6 | 8 | sol | 21 | xiamen | NULL |
7 +----+-------+-----+---------+------+
8 2 rows in set
9
10 mysql> update `user2` as u2 set u2.name = 'hero',u2.age=23,u2.sex=1 where id=7;
11 Query OK, 1 row affected
12 Rows matched: 1 Changed: 1 Warnings: 0
13
14 mysql> select * from `user2`;
15 +----+------+-----+---------+------+
16 | id | name | age | address | sex |
17 +----+------+-----+---------+------+
18 | 7 | hero | 23 | fuzhou | 1 |
19 | 8 | sol | 21 | xiamen | NULL |
20 +----+------+-----+---------+------+
21 2 rows in set

还有一种方式是同时更新多个表,使用不同的别名以及一些条件去限制,不过不建议这么做,操作易错,并且不好维护。

DELETE操作

delete方式删除

语法格式如下:

1 delete [alias] from t_name [[as] alias] [where condition];

1、跟上面一样,alias代表别名,没有别名情况下,表名就是别名

2、如果表设置了别名,则delete后面必须跟上别名,否则数据库会报异常。

测试一下:

mysql> select * from `user2`;
+----+------+-----+---------+------+
| id | name | age | address | sex |
+----+------+-----+---------+------+
| 7 | hero | 23 | fuzhou | 1 |
| 8 | sol | 21 | xiamen | NULL |
+----+------+-----+---------+------+
2 rows in set mysql> delete from `user2` as alias where sex=1;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as alias where sex=1' at line 1 mysql> delete alias from `user2` as alias where sex=1;
Query OK, 1 row affected mysql> select * from `user2`;
+----+------+-----+---------+------+
| id | name | age | address | sex |
+----+------+-----+---------+------+
| 8 | sol | 21 | xiamen | NULL |
+----+------+-----+---------+------+
1 row in set

3、如果删除表中所有的数据,则后面不带上where条件即可,不过要谨慎使用哟。

 1 mysql> select * from `user2`;
2 +----+-------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+-------+-----+----------+-----+
5 | 8 | sol | 21 | xiamen | 0 |
6 | 10 | brand | 21 | fuzhou | 1 |
7 | 11 | helen | 20 | quanzhou | 0 |
8 +----+-------+-----+----------+-----+
9 3 rows in set
10
11 mysql> delete from `user2`;
12 Query OK, 3 rows affected
13
14 mysql> select * from `user2`;
15 Empty set

truncate方式删除

语法格式如下:

1 truncate t_name;
 1 mysql> select * from `user2`;
2 +----+-------+-----+----------+-----+
3 | id | name | age | address | sex |
4 +----+-------+-----+----------+-----+
5 | 12 | brand | 21 | fuzhou | 1 |
6 | 13 | helen | 20 | quanzhou | 0 |
7 | 14 | sol | 21 | xiamen | 0 |
8 +----+-------+-----+----------+-----+
9 3 rows in set
10
11 mysql> truncate `user2`;
12 Query OK, 0 rows affected
13
14 mysql> select * from `user2`;
15 Empty set

看起来跟delete很像,但是重新插入数据会发现,他的自增主键会重新从1开始,但是delete的是直接在原来的所以自增值之后往上加。看下面id字段。

 1 mysql> insert into `user2` (name,age,address,sex) values('brand',21,'fuzhou',1),('helen',20,'quanzhou',0),('sol',21,'xiamen',0);
2 Query OK, 3 rows affected
3 Records: 3 Duplicates: 0 Warnings: 0
4
5 mysql> select * from `user2`;
6 +----+-------+-----+----------+-----+
7 | id | name | age | address | sex |
8 +----+-------+-----+----------+-----+
9 | 1 | brand | 21 | fuzhou | 1 |
10 | 2 | helen | 20 | quanzhou | 0 |
11 | 3 | sol | 21 | xiamen | 0 |
12 +----+-------+-----+----------+-----+
13 3 rows in set

那 truncate 和 delete有什么区别呢?我们来梳理下。

truncate和delete的比较

1、truncate 指的是清空表的数据、释放表的空间,但不删除表的架构定义(表结构)。因为不包含Where条件,所以不是删除具体行,而是将整个表清空了。

2、而delete 语句是删除表中的数据行,可以在后面带上条件控制删除的维度、范围,它每次从表中删除一行,会同时将该行的删除操作作为事务保存在日志中,用于进行可能的回滚操作。

3、truncate 和 delete 一样的地方是:只是删除数据,涉及到的表结构及其列、约束、索引等均不会变。

4、如果被外键 foreign key 约束,不能使用truncate ,只能使用不带where子句的delete语句。

5、truncate 操作会记录在日志中,delete操作会放到 rollback segement 中,执行时要等事务被commit才会生效;所以delete 会触发删除触发器(如果有的话),truncate 不会。

6、如果像上面我们测试的那样,包含自增字段,truncate方式清空之后,自增列的值会被初始化从1开始。

delete方式要分情况判断(如果数据全部delete,数据库未被重启,则按照之前max+1;数据库重启了,则一样会重新开始计算自增列的初始值)。

7、前面章节我们还学过drop,drop语句会删除表包括 结构、数据、依赖该表的约束(constrain),触发器(trigger)索引(index)等。

MySQL全面瓦解5:数据操作-DML的更多相关文章

  1. MySQL数据操作(DML)

    表结构准备: mysql> CREATE TABLE student( -> sid INT PRIMARY KEY AUTO_INCREMENT, ), -> age INT, ) ...

  2. (六)MySQL数据操作DML

    (1)insert:插入数据 顺序插入数据 insert into 表名 values(值1,值2,值3); 指定字段插入数据 insert into 表名(字段1,字段2,字段3) values(值 ...

  3. mysql笔记4之数据操作

    1修改数据 插入:insert into stu(id,name,age,addr) values(2,"李四",44,"重庆"); 2修改某一列 updata ...

  4. MySQL表的创建和表中数据操作

    这篇文章主要介绍在navicat的命令界面操作mysql.主要涉及建立表结构,和对表中数据的增加删除修改查询等动作.站在一个新手角度的简单mysql表结构和数据操作. ☆ 准备工作 1,保证自己的电脑 ...

  5. Mysql对表中 数据 的操作 DML

    上一知识点回顾: mysql的备份: 直接使用navicat进行备份 转储SQL文件:有结构和数据/ 仅结构 两种 需要还原时 单击 数据库名字  运行SQL文件  创建表ctreate 修改表alt ...

  6. MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】

    全部章节   >>>> 本章目录 3.1 使用 DDL 定义数据库表结构 3.1.1 SQL 简介 3.1.2 维护数据库和创建数据表 3.2 使用 DDL 维护数据库表结构 ...

  7. MYSQL初级学习笔记三:数据的操作DML!(视频序号:初级_24,25,36)

    知识点五:数据的操作DML(24,25,36) 插入数据: --测试插入记录INSERT CREATE TABLE IF NOT EXISTS user13( id TINYINT UNSIGNED ...

  8. MySQL的数据库,数据表,数据的操作

    数据库简介 概念 什么是数据库?简单来说,数据库就是存储数据的"仓库", 但是,光有数据还不行,还要管理数据的工具,我们称之为数据库管理系统! 数据库系统 = 数据库管理系统 + ...

  9. MySQL 服务器变量 数据操作DML-视图

    原文:MySQL 服务器变量 数据操作DML-视图 SQL语言的组成部分 常见分类: DDL:数据定义语言 DCL:数据控制语言,如授权 DML:数据操作语言 其它分类: 完整性定义语言: DDL的一 ...

随机推荐

  1. C++逐字输出函数

    void fun(string a) { for(int i=0;i<a.length();i++) { cout<<a[i]; usleep(10000); } cout<& ...

  2. sqli-labs第三关 详解

    通过第二关,来到第三关 我们用了前两种方法,都报错,然后自己也不太会别的注入,然后莫名的小知识又增加了.这居然是一个带括号的字符型注入, 这里我们需要闭合前面的括号. $sql=select * fr ...

  3. 074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现

    074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现 本文知识点:综合案例-数组移位-主方法功能3的实现 说明:因为 ...

  4. c++ 十进制、十六进制和BCD的相互转换,与打印printf,与函数调用

    转载: https://blog.csdn.net/sjhuangx/article/details/49947179   c++ 十进制.十六进制和BCD的相互转换 https://blog.csd ...

  5. matlab中的qr函数

    转自:https://blog.csdn.net/qq278672818/article/details/62038630 实数矩阵A的QR分解是把A分解为 A = QR 这里的Q是正交矩阵(意味着Q ...

  6. C++派生类与基类的关系

    派生类与基类有这些关系: 1.公有派生类从基类继承所有成员和成员函数 2.公有派生类无法直接访问从基类继承的私有成员,但可以通过继承的公共接口访问. 3.公有派生类无法继承基类的友元函数. 4.基类先 ...

  7. P6268 [SHOI2002]舞会

    题目描述 Link 某学校要召开一个舞会.已知学校所有 \(n\) 名学生中,有些学生曾经互相跳过舞.当然跳过舞的学生一定是一个男生和一个女生.在这个舞会上,要求被邀请的学生中的任何一对男生和女生互相 ...

  8. c#类(class)

    类 类的定义是以关键字class开始的,后面跟类的名称,类的主题包含一个花括号里,下面是类定义的一般格式. <access specifier> class class_name { // ...

  9. phpstorm中配置使用svn详细步骤

    一.搭建SVN环境 1.下载VisualSVN Sever.下载地址:https://www.visualsvn.com/server/download/ 2.安装VisualSVN Server. ...

  10. 用flannel实现跨主机container通信

    最近在看kubernetes,看到了网络部分,这部分是集群设计的难点,也是我比较感兴趣的部分.书上提到不同node的container之间通信主要使用flannel,openvswitch等技术,这些 ...