前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >入门MySQL——DML语句篇

入门MySQL——DML语句篇

作者头像
MySQL技术
发布2019-09-08 09:35:36
7530
发布2019-09-08 09:35:36
举报
文章被收录于专栏:MySQL技术MySQL技术

前言:

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

这里说明下DDL与DML语句的分类,可能有的同学还不太清楚。 DDL(Data Definition Language):数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。 DML(Data Manipulation Language):数据操纵语言,主要对表记录进行更新(增、删、改)。常见的有insert,update,delete等。

1.插入数据

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

代码语言:javascript
复制
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语句最常用的一种,标准用法为:

代码语言:javascript
复制
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语句一次只能插入一条数据,可以向表中插入部分列的值,这种方式更为灵活。

代码语言:javascript
复制
INSERT INTO <表名>SET <列名1> = <值1>,    <列名2> = <值2>,    …#其中 INTO 可以省略

INSERT INTO ... SELECT ...

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

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

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

代码语言:javascript
复制
INSERT INTO test_bak select * from test;

INSERT ... ON DUPLICATE KEY UPDATE

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

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

代码语言:javascript
复制
#假设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. 否则,直接插入新数据。

同样举个例子说明下:

代码语言:javascript
复制
#还是上面那个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语句用于更新表数据,官方推荐语法为:

代码语言:javascript
复制
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] ...

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

代码语言:javascript
复制
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ][ORDER BY 子句] [LIMIT 子句]

语法说明如下:

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

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

代码语言:javascript
复制
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name    [PARTITION (partition_name [, partition_name] ...)]    [WHERE where_condition]    [ORDER BY ...]    [LIMIT row_count]

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

代码语言:javascript
复制
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]

语法说明如下:

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

总结:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.插入数据
  • 2.更新数据
  • 3.删除数据
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档