前面学习记录的都是查询数据,那些也是SQL中最常用的语句,这篇我们来学习和积累一下相数据库中插入数据的SQL。

另外,需要注意的是,很多数据库对查询操作要求的权限可能低一些,但是对于插入、修改、删除等操作都需要较高的权限。

INSERT INTO 语句

1、插入完整的行

例如我们需要插入一条新的订单记录可以这样写:

  • 写法 一 :
    无需指定要插入数据的列名,只需提供被插入的值即可。
    SQL格式 INSERT INTO table_name VALUES (value1,value2,value3,...)
insert into oderlist_new
VALUES (19,'圣女果',10,10.0,'20181021001',32,'吴语','2018-10-21 2:25:55',3)

SQL说明:
上面的 SQL语句高度依赖于表中列的定义次序,如果表结构发生改变时这样写是不安全的,所以虽然这种语法很简单,但应该尽量避免使用。那么我们该怎么写呢?来看第二种写法

  • 写法 二:
    需要指定列名及被插入的值
    SQL格式INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...)
insert into oderlist_new (id,goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
VALUES (20,'圣女果',10,10.0,'20181021002',32,'吴语','2018-10-21 22:28:55',3)

SQL说明:
上面的SQL语句,在表名后的括号里 明确给出了列名,在插入的时候,DBMS 会将 VALUES 列表中的相应值填 入列表中的对应项。
因为提供了列名,VALUES 必须以其指定的次序匹配指定的列名,所以即使表的结构改变,这条 INSERT 语句仍然能正确工作。


2、插入部分行

使用上面的第二种写法,我们也可以进行部分数据的插入,比如,我们只需要插入订单表中的部分数据(商品名、数量、单价),我们可以这样写

insert into oderlist_new (goodsName,quantity,item_price)
VALUES ('圣女果',10,10.0)

SQL说明:
可以看到,我们这里省略其他字段的插入值,在数据表中都用NULL进行了填充。

省略的列 必须满足以下某个条件。
1、该列定义为允许 NULL 值(无值或空值)。
2、在表定义中给出默认值也可以。这表示如果不给出值,将使用默认值。

如果某些列以上两个条件都不满足,那我们将其省略的时候,插入就会报错,比如我们将订单号orderNo设定为非空且无默认值的列,再执行上述插入语句

我们看到插入失败了!


INSERT INTO SELECT 语句

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。SQL格式

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

3、插入检索出的数据

有时候我们需要将某个 SELECT 语句查询出来的结果插入表中,这就是所谓的 INSERT SELECT,它是由一条 INSERT 语句和一条 SELECT 语句组成的。

例如,我们进行了数据库升级需要将老的订单表中的数据(包含订单信息和供应商信息)插入到新的订单表和供应商表中,我们可以这样写

  • 将老订单表中的供应商信息分离出来并插入到供应商表中,同一供应商存储一条记录
    我们直接这样执行的话,会有重复的供应商信息存储到供应商表中
INSERT INTO supplier_new
(supplier,supplierAddress,supplierTel,supplierEmail,supplierContact)
SELECT supplier,supplierAddress,supplierTel,supplierEmail,supplierContact
FROM oderlist;

我们插入了18条相同的供应商信息到供应商表格中

像这种没有唯一标识情况,我们怎么对其进行分组,并防止重复插入呢?
既然不能根据单一字段值进行唯一性判断,我们就取多个字段进行分组判断(这里,我取了供应商的所有相关字段进行唯一性判断,当然实际使用中可以更具实际情况来,比如有的数据中可能只需要更具供应商的名称就可以进行唯一性判断),我们调整一下SQL的写法:

INSERT INTO supplier_new
(supplier,supplierAddress,supplierTel,supplierEmail,supplierContact)
SELECT supplier,supplierAddress,supplierTel,supplierEmail,supplierContact
FROM oderlist
group by supplier,supplierAddress,supplierTel,supplierEmail,supplierContact;

我们将订单表中相同的供应商进行了分组,并且相同的供应商只插入了1条数据到供应商表格中

  • 将老订单表中的订单信息分离出来并插入到新的订单表中,同时关联上供应商信息
INSERT INTO oderlist_new
(goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
SELECT goodsName,quantity,item_price,orderNo,userId,userName,orderTime,4
FROM oderlist;

我们将老订单表中的订单信息全部插入到了新的订单表中

这样,我们就将老的订单表中的供应商信息进行了分离,完成数据库的升级。

补充

再代码中实际使用的时候,我们可以使用这样的SQL来获取我们插入到供应商表中的供应商id,并作为老订单表中数据插入到新订单表中时的supplierId,而不是我上面写死的4,SQL如下:

INSERT INTO oderlist_new
(goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
selecto.`goodsName`   ,o.`quantity` ,o.`item_price`   ,o.`orderNo`    ,o.`userId` ,o.`userName` ,o.`orderTime`    ,(select id from supplier_new where `supplier` = o.supplier and`supplierAddress`   = o.supplierAddress and`supplierTel` = o.supplierTel and`supplierEmail`   = o.supplierEmail and`supplierContact`= o.supplierContact ) as `supplierId`
from oderlist o


将一个表中的数据复制到另一个表

比如我们修改了表的结构(比如指定了外键),现在需要把老表( oderlist_new2 )中的数据全部复制到新表( oderlist_new )中,我们可以这样写

使用SELECT INTO语句:

SELECT *
INTO 新表
FROM 旧表
  • MariaDB、MySQL、Oracle、PostgreSQL和 SQLite使用的不一样
CREATE TABLE 新表
AS
SELECT * FROM 旧表
  • 利用INSERT INTO SELECT实现表的复制
INSERT INTO 新表 *
SELECT *
FROM 旧表

例如,我们将表oderlist_new2 中的全部数据复制给表oderlist_new

INSERT INTO oderlist_new
(goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
SELECT   o.`goodsName`   ,o.`quantity`    ,o.`item_price`  ,o.`orderNo`   ,o.`userId`  ,o.`userName`    ,o.`orderTime`   ,o.`supplierId`
from oderlist_new2 o

SQL学习十二、插入数据相关推荐

  1. PyTorch框架学习十二——损失函数

    PyTorch框架学习十二--损失函数 一.损失函数的作用 二.18种常见损失函数简述 1.L1Loss(MAE) 2.MSELoss 3.SmoothL1Loss 4.交叉熵CrossEntropy ...

  2. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  3. 风控建模十二:数据淘金——如何从APP数据中挖掘出有效变量

    风控建模十二:数据淘金--如何从APP数据中挖掘出有效变量 1.常识知识 2.个例分析 3.分布排查 智能手机的诞生改变了人类的生活方式,智能手机所承载的功能日臻完善.强大,人们在衣.食.住.行.工作 ...

  4. C1认证学习十二(网络拓扑)

    C1认证学习十二(网络拓扑) 任务背景 互联网是一个广义的概念,它泛指是一切通过网路连接在一起的计算机的集合,所以,若果只是局部观察,那就不能再说互联网是一个互联的了,那么,如果说对于一个公司来说,具 ...

  5. Js高级程序设计第三版学习(十二章)

                                  Js高级程序设计第三版学习(十二章) 第十二章 DOM2和DOM3   1.样式: 访问样式属性 任何支持style特性的HTML元素都有一 ...

  6. OpenCV与图像处理学习十二——图像形状特征之HOG特征

    OpenCV与图像处理学习十二--图像形状特征之HOG特征 一.图像特征理解 1.1 颜色特征 1.2 纹理特征 1.3 形状特征 1.4 空间关系特征 二.形状特征描述 2.1 HOG特征 2.1. ...

  7. 【FastAPI 学习十二】定时任务篇 (移步博客园或个人网站 无广告,界面清爽整洁)

    声明 目前个人放弃CSDN平台,文章只发布于个人网站和博客园 博客园地址 [FastAPI 学习十二]定时任务篇

  8. SQL点滴系列之插入数据(四)

    [SQL从一点一滴分析系列文章]为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询 在分析 SQL 时,也会同时分析 mybatis .Hibernate 中的相关操作 点击查看 ...

  9. linux中ftp的工作原理,Linux系统学习 十二、VSFTP服务—简介与原理

    1.简介与原理 互联网诞生之初就存在三大服务:WWW.FTP.邮件 FTP主要针对企业级,可以设置权限,对不同等级的资料针对不同权限人员显示. 但是像网盘这样的基本没有权限划分. 简介: FTP(Fi ...

最新文章

  1. centos7 mysql workbench_centOS下mysql workbench安装配置教程
  2. python selenium自动化_python selenium自动化之-环境搭建
  3. 根据长文本拆分至内表
  4. 数字转化成时分秒(二)
  5. python len函数_知识清单Python必备的69个函数,你掌握了吗?
  6. python基于happybase对hbase增删改查-thrift1
  7. React Native 实现物流进度信息
  8. .net vue漂亮登录界面_6个宝藏级Vue管理后台框架 必须收藏
  9. linux中脚本引入计算bc,linux BC命令行计算器
  10. Android循环ViewPager(二)
  11. Android跑马灯的效果
  12. linux学习--体验免安装版本的linux
  13. 深入理解机器学习(一)——二分类模型评价指标详解(上)
  14. 服务器虚拟化的几种方式,服务器虚拟化究竟应当选择哪种方式?
  15. C.Lorenzo Von Matterhorn(思维+朴素lca思想)
  16. POJ题目分类---计算几何
  17. 远程连接服务器出现channel is not opened通道未打开
  18. 2022-2027年中国股权众筹行业市场调研及未来发展趋势预测报告
  19. 在一个字符串中搜索某个特定的字符值
  20. 超适合新手练习的前端网页

热门文章

  1. TNNLS | GNN综述:A Comprehensive Survey on Graph Neural Networks
  2. 将DNS改成8.8.8.8有什么利与弊?
  3. 科技解放双手 “无人时代”即将来临?
  4. crontab定时任务_net
  5. 高矿化度矿井水深度除氟装置CH-87技术解析
  6. Android开发基础入门教程
  7. js中clientWidth、scrollLeft、offsetX等宽高度和位置的用法
  8. 乒乓操作(Ping-Pong)的理解:为什么是另一种pipeline?
  9. 使用you-get将网站视频下载到本地的具体操作
  10. 单源最短路径问题——分支限界法(Java)