SQL学习十二、插入数据

前面学习记录的都是查询数据,那些也是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;
执行结果

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


插入18条记录

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

补充

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

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`   ,
    (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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,938评论 2 89
  • SQL与MySQL简介 数据库基础 从SQL的角度来看,数据库就是一个以某种有组织的方式存储的数据集合。我们可以采...
    heming阅读 3,086评论 1 8
  • 小侄女拿着老爸的放大镜玩耍,拍了照片,突然就想画出来。 第一次自己创作,纪念一下。
    喵呜的喵咪阅读 245评论 0 1
  • 风吹着田野里的花草,空气里有阳光的香味,却也布满了燥热,在夏日的洗礼下,怎样的风景都有了烦躁不安。 陈光和他...
    就这样一个涂涂阅读 203评论 0 0