1 insert语句

insert语句用于插入数据到表中,其基本语法有以下三种:

Syntax:
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]
  • 其中 select...values insert...set两种语句都是将指定的数据插入到现成的表中,而insert...select语句是将另外表中数据查出来并插入到现成的表中

  • partiion子句代表可以将数据插入到指定的表分区中

  • table_name代表将数据插入到的目标表

  • col_name 代表要插入指定数据的目标表列,如果是多列则用逗号隔开,如果目标表中的某些列没有在insert语句中指定,则这些列会插入默认值,当然可以使用default显式指定插入默认值

  • values中除了可以指定确定的数值之外,开可以使用表达式expr

insert into tbl_name (col1,col2) values(15,col1*2)	##正确
insert into tbl_name (col1,col2) values(col1*2,15) ##错误

案例演示:

## 修改sid字段,添加auto_increment属性
mysql> alter table students modify sid int auto_increment;
Query OK, 2 rows affected (0.23 sec)
Records: 2 Duplicates: 0 Warnings: 0 ## 修改gender字段,添加默认值0
mysql> alter table students modify gender int default 0;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0 ## 向students表中插入一条数据
mysql> insert into students(sname) values("bbb");
Query OK, 1 row affected (0.04 sec) mysql> insert into students(sid,sname) values(5,"ccc");
Query OK, 1 row affected (0.02 sec) mysql> insert into students(sname) values("ddd");
Query OK, 1 row affected (0.07 sec) mysql> insert into students(sid,sname) values(4,"dd");
Query OK, 1 row affected (0.10 sec) mysql> insert into students values(3*3,'fff',1);
Query OK, 1 row affected (0.09 sec) mysql> select * from students;
+-----+--------+--------+
| sid | sname | gender |
+-----+--------+--------+
| 1 | viktor | 1 |
| 2 | aaa | NULL |
| 3 | bbb | 0 |
| 4 | dd | 0 |
| 5 | ccc | 0 |
| 6 | ddd | 0 |
| 9 | fff | 1 |
+-----+--------+--------+
7 rows in set (0.00 sec)
  • inset...values语句不光可以插入一条数据,也可以插入多条数据
insert into tbl_name(a,b,c) values(1,2,3)(4,5,6)
insert into students values(7,'abc'),(8,'bcd')
  • low_priority关键词代表如果有其他链接正在读取目标表数据,则此insert语句需要等待读取完成

  • low_priorityhigh_priority关键词仅在MylSAMMEMORY MERGE三种存储引擎下才生效

  • ignore关键词代表insert语句如果违反主键和伪意见的约束条件,则不报错而只产生警告信息,违反的行被丢弃,而不是整个语句回退;在数据类型转换有问题时如果有ignore则只产生警告信息,而不是语句回退

mysql> select * from students;
+-----+--------+--------+
| sid | sname | gender |
+-----+--------+--------+
| 1 | viktor | 1 |
| 2 | aaa | NULL |
| 3 | bbb | 0 |
| 4 | dd | 0 |
| 5 | ccc | 0 |
| 6 | ddd | 0 |
| 9 | fff | 1 |
+-----+--------+--------+
7 rows in set (0.00 sec) mysql> insert ignore into students values(1,'aa',1),(7,'cc',0);
Query OK, 1 row affected, 1 warning (0.10 sec)
Records: 2 Duplicates: 1 Warnings: 1

2 insert... select语句

用于从另外的表中查出记录并插入到目标表中

insert into tbl_temp2(fld_id)
select tbl_temp1.fld_order_id
from tbl_temp1 where tbl_temp1.fld_order_id > 100;

当目标表和select语句中的表相同时,则会先将select语句的结果存放在临时表中,再插入到目标表中(注意执行顺序)

mysql> desc student2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sid | int(11) | NO | | NULL | |
| sname | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec) mysql> desc students;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(20) | NO | UNI | NULL | |
| gender | int(11) | YES | | 0 | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec) ## concat用来合并两个字段
mysql> insert into student2(sid,sname) select sid,concat(sid,sname) from students where sid=1;
Query OK, 1 row affected (0.07 sec)
Records: 1 Duplicates: 0 Warnings: 0 ## 当两个表中的字段不匹配时,插入会出现错误
mysql> insert into student2 select * from students;
ERROR 1136 (21S01): Column count doesn't match value count at row 1 ##选定两个字段进行插入
mysql> insert into student2 select sid,sname from students;
Query OK, 8 rows affected (0.07 sec)
Records: 8 Duplicates: 0 Warnings: 0 mysql> select * from student2;
+-----+---------+
| sid | sname |
+-----+---------+
| 1 | 1viktor |
| 2 | aaa |
| 3 | bbb |
| 7 | cc |
| 5 | ccc |
| 4 | dd |
| 6 | ddd |
| 9 | fff |
| 1 | viktor |
+-----+---------+
9 rows in set (0.00 sec)

3 insert on duplicate key update语句

当insert语句中使用on duplicate key update子句时,如果碰到当前插入的数据违反主键或唯一键的唯一性约束,则insert会转变成update语句修改对应的已经存在表中的这条数据。比如,如果a字段有唯一性约束且已经含有1这样的记录,则以下两条语句的执行结果相同。

insert into table(a,b,c) values(1,2,3)
on duplicate key update c=c+1
update table set c=c+1 where a=1;

简而言之,该语句可以解决插入的数据与表之间的冲突。

案例演示:

mysql> insert into student2(sid,sname) select sid,sname from students where sid<3;
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from student2;
+-----+--------+
| sid | sname |
+-----+--------+
| 1 | viktor |
| 2 | aaa |
+-----+--------+
2 rows in set (0.00 sec) ## 创建sname字段的unique索引
mysql> create unique index idx_1 on student2(sname);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc student2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sid | int(11) | NO | | NULL | |
| sname | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec) mysql> insert into student2(sid,sname) select sid,sname from students where sid=1;
ERROR 1062 (23000): Duplicate entry 'viktor' for key 'idx_1'
mysql> insert into student2(sid,sname) select sid,sname from students where sid=1 on duplicate key update sname='dabric';
Query OK, 2 rows affected (0.01 sec)
Records: 1 Duplicates: 1 Warnings: 0 mysql> select * from student2;
+-----+--------+
| sid | sname |
+-----+--------+
| 1 | dabric |
| 2 | aaa |
+-----+--------+
2 rows in set (0.00 sec) mysql> insert into student values(1,'bb',0) on duplicate key update sname='b'sex=1;

4 练习

  • 将如下数据插入到dept表中
1,'computer science'; 2,'education'; 4,'accounting'
  • 根据create table...like语句创建teacher_backup表,并插入如下数据:
1,'susan'; 1; 2,'ruth'; 4; 3,'vivian', 4
  • 将teacher_backup表的数据通过insert...select语句插入到teacher表中

SQL基础语法—insert语句的更多相关文章

  1. SQL基础语法—create语句

    1 Create database语句 create database 语句是在MySQL实例上创建一个指定名的数据库,create schema语句的语义和create database是一样的.先 ...

  2. SQL基础语法—update语句

    1 update语句介绍 update语句用来修改表中的数据内容 Single-table syntax: UPDATE [LOW_PRIORITY] [IGNORE] table_reference ...

  3. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  4. Spring mybatis源码篇章-动态SQL基础语法以及原理

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-Mybatis的XML文件加载 前话 前文通过Spring中配置mapperLocations属性来进行对m ...

  5. SQL基础语法笔记教程整理

    PS:本文适用SQL Server2008语法. 一.关系型数据库和SQL 实际上准确的讲,SQL是一门语言,而不是一个数据库. 什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的 ...

  6. SQL 基础:Select语句,各种join,union用法

    一.基本的SELECT语句 1. “*”的注意事项:在SELECT语句中,用*来选取所有的列,这是一个应该抵制的习惯. 虽然节省了输入列名的时间,但是也意味着获得的数据比真正需要的数据多的多.相应的, ...

  7. SQL 基础语法笔记教程整理

    最近从图书馆借了本介绍 SQL 的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用. PS:本文适用 SQL Server2008 语法. 首先,附一个发现的 MySQL 读书笔 ...

  8. SQL基础语法(二)

    SQL SELECT 语句 本章讲解 SELECT 和 SELECT * 语句. SQL SELECT 语句 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SQL ...

  9. PL/SQL 如何导出INSERT语句

    需要把查询出来的数据导出成Insert的语句.忽然发现不会用了. 上网查,找到一些,但都不尽如人意. 于是就写了这篇文章.助人助己. 在PL/SQL Developer左边的树状导航栏里,找到[Tab ...

随机推荐

  1. [Err] 1248 - Every derived table must have its own alias

    问题描述 [Err] 1248 - Every derived table must have its own alias 问题原因 这句话的意思是说每个派生出来的表都必须有一个自己的别名 我的Mys ...

  2. Java多线程之synchronized和volatile

    概述 用Java来开发多线程程序变得越来越常见,虽然Java提供了并发包来简化多线程程序的编写,但是我们有必要深入研究一下,才能更好的掌握这块知识. 本文主要对Java提供的底层原语synchroni ...

  3. php文件操作(最后进行文件常用函数封装)

    文件信息相关API $filename="./1-file.php"; //filetype($filename):获取文件的类型,返回的是文件的类型 echo '文件类型为:', ...

  4. Java中基本数据类型byte的溢出问题

    Java中基本数据类型byte的溢出问题 问题源于:https://www.cnblogs.com/HuoHua2020/p/12326631.html 定义两个byte类型的数据,将其之和赋值给一个 ...

  5. LeetCode136. 只出现一次的数字(异或)

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  6. Codeforces Round #619 (Div. 2) A~D题解

    最近网课也开始了,牛客上一堆比赛题目也没补,所以就D题后面的也懒得补了 A.Three String 水题 #include <cstdio> #include <cstring&g ...

  7. linux 安装java jdk

    1.检查一下系统中的jdk版本 [root@localhost software]# java -version 显示: openjdk version "1.8.0_102" O ...

  8. 字符串匹配算法--暴力匹配(Brute-Force-Match)C语言实现

    一.前言 暴力匹配(Brute-Force-Match)是字符串匹配算法里最基础的算法,虽然效率比较低,但胜在方便理解,在小规模数据或对时间无严格要求的情况下可以考虑. 二.代码 #include & ...

  9. day02_1hibernate

    对象状态与一级缓存 一.对象缓存状态的介绍: ①在使用hibernate时对象的三种状态:(代码如下) 瞬时状态 :没有与session关联,没有主键OID标识(主键的OID指的是对象id,在配置文件 ...

  10. 计蒜客 - A1603.天上的星星

    二维差分,理论上很简单,虽然我实际上做的时候一堆问题 1.边界的星星包含在内,需要在减去的时候往前挪一个 2.我是从0开始的,循环的时候非常不方便 3.x1, x2, y1, y2总是弄混 #incl ...