详解mysql DML语句的使用
前言:
在上篇文章中,主要为大家介绍的是DDL语句的用法,可能细心的同学已经发现了。本篇文章将主要聚焦于DML语句,为大家讲解表数据相关操作。
这里说明下DDL与DML语句的分类,可能有的同学还不太清楚。
DDL(DataDefinitionLanguage):数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。
DML(DataManipulationLanguage):数据操纵语言,主要对表记录进行更新(增、删、改)。常见的有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)]...[ONDUPLICATEKEYUPDATEassignment_list] INSERT[LOW_PRIORITY|DELAYED|HIGH_PRIORITY][IGNORE][INTO]tbl_name[PARTITION(partition_name[,partition_name]...)]SETassignment_list[ONDUPLICATEKEYUPDATEassignment_list] INSERT[LOW_PRIORITY|HIGH_PRIORITY][IGNORE][INTO]tbl_name[PARTITION(partition_name[,partition_name]...)][(col_name[,col_name]...)]SELECT...[ONDUPLICATEKEYUPDATEassignment_list] value:{expr|DEFAULT} value_list:value[,value]... assignment:col_name=value assignment_list:assignment[,assignment]...
有兴趣的同学可以咨询研究下上面的各个选项哦,下面我将分类给大家介绍几个常用的语法。
INSERTINTO...VALUES(...)
这可能是你写insert语句最常用的一种,标准用法为:
INSERTINTO<表名>[<列名1>[,…<列名n>]]VALUES(值1)[…,(值n)]; INSERTINTOtable(column1,column2...)VALUES(value1,value2,...),(value1,value2,...),...;
语法说明如下:
- <表名>:指定被操作的表名。
- <列名>:指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用INSERT<表名>VALUES(…)即可。
- VALUES或VALUE子句:该子句包含要插入的数据清单。数据清单中数据的顺序要和列的顺序相对应。
INSERT...SET...
insert...set语句一次只能插入一条数据,可以向表中插入部分列的值,这种方式更为灵活。
INSERTINTO<表名>SET<列名1>=<值1>,<列名2>=<值2>,…
INSERTINTO...SELECT...
INSERTINTO…SELECT…FROM语句用于快速地从一个或多个表中取出数据,并将这些数据作为行数据插入另一个表中。
SELECT子句返回的是一个查询到的结果集,INSERT语句将这个结果集插入指定表中,结果集中的每行数据的字段数、字段的数据类型都必须与被操作的表完全一致。
举个例子,假如test表和test_bak表结构完全一致,我们想把test表中的数据插入到test_bak表中,那么我们可以这么操作:
INSERTINTOtest_bakselect*fromtest;
INSERT...ONDUPLICATEKEYUPDATE
如果要插入的新行违反主键(PRIMARYKEY)或UNIQUE约束,则MySQL会报错,此语法就是为了解决此错误。当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。
下面举个例子为大家演示下效果:
CREATETABLE`student`(`xuehao`int(11)primarykey,`name`varchar(255)DEFAULTNULL,`age`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8; mysql>select*fromstudent;+--------+------+------+|xuehao|name|age|+--------+------+------+|1001|aaa|18||1002|bbb|19||1003|ccc|20|+--------+------+------+ insertintostudent(xuehao,name,age)values(1003,'ccc',19)onDUPLICATEKEYUPDATEage=19; mysql>select*fromstudent;+--------+------+------+|xuehao|name|age|+--------+------+------+|1001|aaa|18||1002|bbb|19||1003|ccc|19|+--------+------+------+ updatestudentsetage=19wherexuehao=1003;
REPLACEINTO...VALUES...
replaceinto跟insert功能类似,不同点在于:replaceinto首先尝试插入数据到表中,1.如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。2.否则,直接插入新数据。
同样举个例子说明下:
mysql>select*fromstudent;+--------+------+------+|xuehao|name|age|+--------+------+------+|1001|aaa|18||1002|bbb|19||1003|ccc|19|+--------+------+------+ replaceintostudentvalues(1003,'ccc',17); mysql>select*fromstudent;+--------+------+------+|xuehao|name|age|+--------+------+------+|1001|aaa|18||1002|bbb|19||1003|ccc|17|+--------+------+------+
2.更新数据
update语句用于更新表数据,官方推荐语法为:
UPDATE[LOW_PRIORITY][IGNORE]table_referenceSETassignment_list[WHEREwhere_condition][ORDERBY...][LIMITrow_count] value:{expr|DEFAULT} assignment:col_name=value assignment_list:assignment[,assignment]...
同样的,这里只给大家介绍常用的单表更新语法:
UPDATE<表名>SET字段1=值1[,字段2=值2…][WHERE子句][ORDERBY子句][LIMIT子句]
语法说明如下:
- <表名>:用于指定要更新的表名称。
- SET子句:用于指定表中要修改的列名及其列值。其中,每个指定的列值可以是表达式,也可以是该列对应的默认值。如果指定的是默认值,可用关键字DEFAULT表示列值。
- WHERE子句:可选项。用于限定表中要修改的行。若不指定,则修改表中所有的行。
- ORDERBY子句:可选项。用于限定表中的行被修改的次序。
- LIMIT子句:可选项。用于限定被修改的行数。
3.删除数据
delete语句用于删除表数据,官方文档推荐语法:
DELETE[LOW_PRIORITY][QUICK][IGNORE]FROMtbl_name[PARTITION(partition_name[,partition_name]...)][WHEREwhere_condition][ORDERBY...][LIMITrow_count]
使用DELETE语句从单个表中删除数据,语法格式为:
DELETEFROM<表名>[WHERE子句][ORDERBY子句][LIMIT子句]
语法说明如下:
- <表名>:指定要删除数据的表名。
- ORDERBY子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除。
- WHERE子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行。
- LIMIT子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值。
总结:
本文主要介绍了三种DML语句的语法,看似简单,其实其中各种选项还是很复杂的,特别是insert语句,经常用到的选项就有很多。在这里也要提醒大家,执行update或delete语句时一定要小心,不使用where条件会更新或删除全部数据哦。
以上就是详解mysqlDML语句的使用的详细内容,更多关于mysqlDML语句的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。