前言:

在上篇文章中,主要为大家介绍的是DDL语句的用法,可能细心的同学已经发现了。本篇文章将主要聚焦于DML语句,为大家讲解表数据相关操作。

这里说明下DDL与DML语句的分类,可能有的同学还不太清楚。

DDL(Data Definition Language):数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。

DML(Data Manipulation Language):数据操纵语言,主要对表记录进行更新(增、删、改)。常见的有insert,update,delete等。

1.插入数据

插入数据主要用到的是insert语法,官方文档同样给出很多选项:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list] INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
SET assignment_list
[ON DUPLICATE KEY UPDATE assignment_list] INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
SELECT ...
[ON DUPLICATE KEY UPDATE assignment_list] value:
{expr | DEFAULT} value_list:
value [, value] ... assignment:
col_name = value assignment_list:
assignment [, assignment] ...

有兴趣的同学可以咨询研究下上面的各个选项哦,下面我将分类给大家介绍几个常用的语法。

INSERT INTO ... VALUES (...)

这可能是你写insert语句最常用的一种,标准用法为:

INSERT INTO <表名> [ <列名1> [ , … <列名n>] ]
VALUES (值1) [… , (值n) ]; #插入多行
INSERT INTO table(column1,column2...)
VALUES (value1,value2,...),
(value1,value2,...),
...;

语法说明如下:

  • <表名> :指定被操作的表名。
  • <列名> :指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…) 即可。
  • VALUES 或 VALUE 子句:该子句包含要插入的数据清单。数据清单中数据的顺序要和列的顺序相对应。

INSERT ... SET ...

insert ... set语句一次只能插入一条数据,可以向表中插入部分列的值,这种方式更为灵活。

INSERT INTO <表名>
SET <列名1> = <值1>,
<列名2> = <值2>,

#其中 INTO 可以省略

INSERT INTO ... SELECT ...

INSERT INTO…SELECT…FROM 语句用于快速地从一个或多个表中取出数据,并将这些数据作为行数据插入另一个表中。

SELECT 子句返回的是一个查询到的结果集,INSERT 语句将这个结果集插入指定表中,结果集中的每行数据的字段数、字段的数据类型都必须与被操作的表完全一致。

举个例子,假如test表和test_bak表结构完全一致,我们想把test表中的数据插入到test_bak表中,那么我们可以这么操作:

INSERT INTO test_bak select * from test;

INSERT ... ON DUPLICATE KEY UPDATE

如果要插入的新行违反主键(PRIMARY KEY)或UNIQUE约束,则MySQL会报错,此语法就是为了解决此错误。当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。

下面举个例子为大家演示下效果:

#假设student表结构和原始数据如下:
CREATE TABLE `student` (
`xuehao` int(11) primary key,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> select * from student;
+--------+------+------+
| xuehao | name | age |
+--------+------+------+
| 1001 | aaa | 18 |
| 1002 | bbb | 19 |
| 1003 | ccc | 20 |
+--------+------+------+ #比如我们想插入这条数据,MySQL发现主键重复后会执行后面的更新语句
insert into student (xuehao,name,age)
values (1003,'ccc',19) on DUPLICATE KEY UPDATE age = 19; #执行之后发现数据变成了这样
mysql> select * from student;
+--------+------+------+
| xuehao | name | age |
+--------+------+------+
| 1001 | aaa | 18 |
| 1002 | bbb | 19 |
| 1003 | ccc | 19 |
+--------+------+------+ #即上条语句等效于执行 update student set age = 19 where xuehao = 1003;

REPLACE INTO ... VALUES ...

replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。

同样举个例子说明下:

#还是上面那个student表,xuehao是主键 原有数据为
mysql> select * from student;
+--------+------+------+
| xuehao | name | age |
+--------+------+------+
| 1001 | aaa | 18 |
| 1002 | bbb | 19 |
| 1003 | ccc | 19 |
+--------+------+------+ #如果执行
replace into student values (1003,'ccc',17); #则新的表数据为
mysql> select * from student;
+--------+------+------+
| xuehao | name | age |
+--------+------+------+
| 1001 | aaa | 18 |
| 1002 | bbb | 19 |
| 1003 | ccc | 17 |
+--------+------+------+ #效果等同于将xuehao为1003的行删除,然后再插入新行

2.更新数据

update语句用于更新表数据,官方推荐语法为:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET assignment_list
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count] value:
{expr | DEFAULT} assignment:
col_name = value assignment_list:
assignment [, assignment] ...

同样的,这里只给大家介绍常用的单表更新语法:

UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
[ORDER BY 子句] [LIMIT 子句]

语法说明如下:

  • <表名>:用于指定要更新的表名称。
  • SET 子句:用于指定表中要修改的列名及其列值。其中,每个指定的列值可以是表达式,也可以是该列对应的默认值。如果指定的是默认值,可用关键字 DEFAULT 表示列值。
  • WHERE 子句:可选项。用于限定表中要修改的行。若不指定,则修改表中所有的行。
  • ORDER BY 子句:可选项。用于限定表中的行被修改的次序。
  • LIMIT 子句:可选项。用于限定被修改的行数。

3.删除数据

delete语句用于删除表数据,官方文档推荐语法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

使用 DELETE 语句从单个表中删除数据,语法格式为:

DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]

语法说明如下:

  • <表名>:指定要删除数据的表名。
  • ORDER BY 子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除。
  • WHERE 子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行。
  • LIMIT 子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值。

总结:

本文主要介绍了三种DML语句的语法,看似简单,其实其中各种选项还是很复杂的,特别是insert语句,经常用到的选项就有很多。在这里也要提醒大家,执行update或delete语句时一定要小心,不使用where条件会更新或删除全部数据哦。

入门MySQL——DML语句篇的更多相关文章

  1. 入门MySQL——基础语句篇

    前言:  前面几篇文章,我们介绍了MySQL的基础概念及逻辑架构.相信你现在应该有了自己的一套MySQL环境,接下来我们就可以开始练习MySQL了.本文将从MySQL最基础的语句出发,为你展示出创建及 ...

  2. mysql DML语句学习1

    DML 操作是指对数据库中表记录的操作,主要包括表记录插入(insert).更新(update).删除(delete)和查询(select) 1. 插入记录 表创建好后,就可以往里插入记录,基本语句如 ...

  3. 《Mysql DML语句》

    1:DISTINCT 用于去重,但是需要注意的是,它是用于所有列的,也就是说,除非指定的列全部相同,否则所有的行都会被检索出来. 2:ORDER BY 用于排序,但是应该注意的是,它因该是 SELEC ...

  4. mysql DML语句

    1, 插入数据 insert into emp1(ename,hiredate,sal,deptono) values('kingle','2000-01-01','2000',1); 插入数据加入需 ...

  5. 详解MySQL第二篇—DML语句

    DML 语句: DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert).更新(update).删除(delete)和查(select),是开发人员日常使用最频繁的操作.下面将依次 ...

  6. JDBC基础篇(MYSQL)——使用statement执行DML语句(insert/update/delete)

    注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day02_statement; import java.sql.Connection; import java.s ...

  7. MySQL的DDL语句、DML语句与DCL语句

    背景:近几年,开源数据库逐渐流行起来.由于具有免费使用.配置简单.稳定性好.性能优良等优点,开源数据库在中低端应用上占据了很大的市场份额,而 MySQL 正是开源数据库中的杰出代表.MySQL 数据库 ...

  8. mysql语句-DML语句

    DML语句 DML是指对数据库中表记录的操作,主要包括数据的增删改查以及更新,下面依次介绍 首先创建一张表:: 表名:emp 字段:ename varchar(20),hiredate date ,s ...

  9. 入门MySQL——架构篇

    前言:  上篇文章我们介绍了入门MySQL的基本概念,看完上篇文章,相信你应该了解MySQL的前世今生了吧.本篇文章将带你从架构体系来学习MySQL.我认为学习MySQL架构体系应该是入门阶段必须的, ...

随机推荐

  1. Noip 2016 天天爱跑步 题解

    [NOIP2016]天天爱跑步 时间限制:2 s   内存限制:512 MB [题目描述] 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...

  2. Java面试题汇总---基础版(附答案)

    基于我个人对面试的认知和招聘经验,在此我总结一下Java开发者的基础知识掌握要求,及应聘者面试的需要准备的内容. 首先,Java基础是每个面试官都会问到的,可能只是针对工作经验的多少,对问题追踪深度有 ...

  3. MySql的数据库优化到底优化啥了都(3)

    嘟嘟在上两个文章里面简单粗糙的讲了讲关于MySql存储引擎的一些特性以及选择.个人感觉如果面试官给我机会的话,至少能说个10分钟了吧.只可惜有时候生活就是这样:骨感的皮包骨头了还在那美呢.牢骚两句,北 ...

  4. python红蓝英雄大乱斗(面向对象实现)

    红蓝英雄大乱斗 游戏规则 ''' 有红蓝两方英雄(可自定义个数) 随机一方英雄使用随机攻击方式攻击另一方英雄,任意一方英雄全部阵亡则游戏结束 每个英雄有 名字.生命值.普通攻击.Q技能攻击.W技能攻击 ...

  5. 【数据库】postgresql数据库创建自增序列id的注意事项

    1.创建一张表 CREATE TABLE "public"."tt" ( "name" varchar(128), "status ...

  6. python课堂整理13---函数的作用域及匿名函数

    name = 'alex' def foo(): name = 'jinling' def bar(): print(name) return bar a = foo() print(a) 阅读上述代 ...

  7. ios下,微信小程序scrollview组件中的fixed元素抖得和帕金森病人一样

    问题现象 这个问题是最近在优化小程序代码时发现的. 在ios环境下,微信小程序的scrollview组件包裹着一个position:fixed的view. 当在scrollview组件上滑动时,这个v ...

  8. 使用钉钉对接禅道的bug系统,实现禅道提的bug实时在钉钉提醒并艾特对应的开发人员处理

    现在公司测试中有一个痛点是每次测试人员提完bug后,需要定期去提醒开发人员查看禅道的bug记录及修复bug. 导致测试人员在项目测试中不仅要测试整个软件,还要负起实时监督提醒功能的“保姆角色”,身心疲 ...

  9. 【转】解决eclipse连接不到genymotion的问题

    (1)很多朋友在使用genymotion开发安卓应用程序的时候,会遇见完全正确的安装但是在运行的时候仍然找不到,genymotion上的设备,在打开的devices上找不到如下图所示: (2)解决的方 ...

  10. Git 从master拉取代码创建新分支

    从master拉取新分支并push到远端 开发过程中经常用到从master分支copy一个开发分支: 1.切换到被copy的分支(master),并且从远端拉取最新版本 $git checkout m ...