当前位置: 移动技术网 > IT编程>数据库>Mysql > 入门MySQL——DML语句篇

入门MySQL——DML语句篇

2019年08月18日  | 移动技术网IT编程  | 我要评论

前言: 

在上篇文章中,主要为大家介绍的是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 InnoDB表空间加密示例详解

    前言从 mysql5.7.11开始,mysql对innodb支持存储在单独表空间中的表的数据加密 。此功能为物理表空间数据文件提供静态加密。该加密是在引擎内部数... [阅读全文]
  • 如何解决mysql无法关闭的问题

    如何解决mysql无法关闭的问题

    mysql关闭不了的解决办法:右键点击电脑的任务栏,打开任务管理器点击服务,找到mysql服务右键点击该服务,选择停止就可以了内容扩展:mac系统mysqld进... [阅读全文]
  • mysql不是内部命令的错误解决方案

    mysql不是内部命令的错误解决方案

    出现mysql不是内部命令的错误是因为没有把mysql的bin目录路径添加到环境变量中解决方法:打开电脑的环境变量,选择系统变量,打开path,将mysql的b... [阅读全文]
  • 关于MySQL主从复制的几种复制方式总结

    关于MySQL主从复制的几种复制方式总结

    异步复制mysql的复制默认是异步的,主从复制至少需要两个mysql服务,这些mysql服务可以分布在不同的服务器上,也可以在同一台服务器上。mysql主从异步... [阅读全文]
  • 详细分析MySQL主从复制

    详细分析MySQL主从复制

    前言:在mysql中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习mysql过程中必不可... [阅读全文]
  • MySQL单表恢复的步骤

    正休息的时候一个电话将我的睡意完全打散,“开发童鞋写update sql的时候忘了加where条件了”,相信每一个dba同学听到这个消息的时候都有骂街的冲动吧。... [阅读全文]
  • MySQL性能优化之如何高效正确的使用索引

    实践是检验真理的唯一途径,本篇只是站在索引使用的全局来定位的,你只需要通读全篇并结合具体的例子,或回忆以往使用过的地方,对整体有个全面认识,并理解索引是如何工作... [阅读全文]
  • MySQL如何优化查询速度

    前面章节我们介绍了如何选择优化的数据类型、如何高效的使用索引,这些对于高性能的mysql来说是必不可少的。 但这些还完全不够,还需要合理的设计查询。 如果查询写... [阅读全文]
  • MySQL优化SQL语句的技巧

    在面对不够优化、或者性能极差的sql语句时,我们通常的想法是将重构这个sql语句,让其查询的结果集和原来保持一样,并且希望sql性能得以提升。而在重构sql时,... [阅读全文]
  • 简述MySql四种事务隔离级别

    隔离级别:隔离性其实比想象的要复杂。 在sql标准中定义了四种隔离级别, 每一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通... [阅读全文]
验证码:
移动技术网