当前位置: 首页 > news >正文

14.插入数据、复制数据--SQL

一、插入完整的行


 要求指定表名和插入到新行中的值

INSERT INTO Customers
VALUES('1000000006',
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA',
NULL,
NULL);

分析▼

这个例子将一个新顾客插入到Customers表中。存储到表中每一列的数据在VALUES子句中给出,必须给每一列提供一个值。如果某列
没有值,如上面的cust_contact和cust_email列,则应该使用NULL值(假定表允许对该列指定空值)。各列必须以它们在表定义中出现的次序填
充。

提示:INTO关键字
在某些SQL实现中,跟在INSERT之后的INTO关键字是可选的。但是,即使不一定需要,最好还是提供这个关键字,这样做将保证SQL代码
在DBMS之间可移植。

警告

虽然这种语法很简单,但并不安全,应该尽量避免使用。上面的SQL语句高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。即
使可以得到这种次序信息,也不能保证各列在下一次表结构变动后保持完全相同的次序。因此,编写依赖于特定列次序的SQL语句是很不安全
的,这样做迟早会出问题。

二、插入部分-指定列(使用INSERT的推荐方法是明确给出表的列名)


 

INSERT INTO Customers(cust_id,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES('1000000006',
'Toy Land',
'123 Any Street',
'New York',
'NY',
'11111',
'USA');

分析▼
在本课前面的例子中,没有给cust_contact和cust_email这两列提供值。这表示没必要在INSERT语句中包含它们。因此,这里的INSERT语句省
略了这两列及其对应的值。

 

警告:省略列
如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件。

  • 该列定义为允许NULL值(无值或空值)。
  • 在表定义中给出默认值。这表示如果不给出值,将使用默认值。

如果对表中不允许NULL值且没有默认值的列不给出值,DBMS将产生错误消息,并且相应的行插入不成功。

警告:省略所需的值
如果表中不允许有NULL值或者默认值,这时却省略了表中的值,DBMS就会产生错误消息,相应的行不能成功插入。

 

三、插入检索出的数据


 

INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM CustNew;

说明:新例子的说明
这个例子从一个名为CustNew的表中读出数据并插入到Customers表。为了试验这个例子,应该首先创建和填充CustNew表。CustNew表的结
构与附录A中描述的Customers表相同。在填充CustNew时,不应该使用已经在Customers中用过的cust_id值(如果主键值重复,后续
的INSERT操作将会失败)。

分析▼
这个例子使用INSERT SELECT从CustNew中将所有数据导入Customers。SELECT语句从CustNew检索出要插入的值,而不是列出它
们。SELECT中列出的每一列对应于Customers表名后所跟的每一列。这条语句将插入多少行呢?这依赖于CustNew表有多少行。如果这个表为
空,则没有行被插入(也不产生错误,因为操作仍然是合法的)。如果这个表确实有数据,则所有数据将被插入到Customers。

 

提示:INSERT SELECT中的列名
为简单起见,这个例子在INSERT和SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,DBMS一点儿也不关
心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充
表列中指定的第二列,如此等等。


INSERT SELECT中SELECT语句可以包含WHERE子句,以过滤插入的数据。
提示:插入多行
INSERT通常只插入一行。要插入多行,必须执行多个INSERT语句。INSERT SELECT是个例外,它可以用一条INSERT插入多行,不
管SELECT语句返回多少行,都将被INSERT插入。

四、从一个表复制到另一个表


 SELECT INTO语句

与INSERT SELECT将数据添加到一个已经存在的表不同,SELECT INTO将数据复制到一个新表(有的DBMS可以覆盖已经存在的表,这依赖于
所使用的具体DBMS)。
说明:INSERT SELECT与SELECT INTO
它们之间的一个重要差别是前者导出数据,而后者导入数据。

SELECT *
INTO CustCopy
FROM Customers;

分析▼
这条SELECT语句创建一个名为CustCopy的新表,并把Customers表的整个内容复制到新表中。因为这里使用的是SELECT *,所以将
在CustCopy表中创建(并填充)与Customers表的每一列相同的列。要想只复制部分的列,可以明确给出列名,而不是使用*通配符。

 

MariaDB、MySQL、Oracle、PostgreSQL和SQLite使用的语法稍有不同:

CREATE TABLE CustCopy AS
SELECT * FROM Customers;

在使用SELECT INTO时,需要知道一些事情:

  • 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY;
  • 可利用联结从多个表插入数据;
  • 不管从多少个表中检索数据,数据都只能插入到一个表中。

提示:进行表的复制
SELECT INTO是试验新SQL语句前进行表复制的很好工具。先进行复制,可在复制的数据上测试SQL代码,而不会影响实际的数据。

 

转载于:https://www.cnblogs.com/lbonet/p/7552082.html

相关文章:

  • 研磨设计模式之 单例模式-2
  • 初入SpringBoot——使用IDEA构建最小SpringBootDemo
  • Spring.NET学习笔记7——依赖对象的注入(基础篇) (转)
  • Forword(请求转发)与Redirect(重定向) 区别
  • [delphi]保证程序只运行一个实例
  • vue常用的指令
  • 商业计划书范本
  • 聊聊kafka0.8的topic的partition以及topicCountMap
  • FloodFill(漫水填充)算法
  • 升级BIOS解决DELL R730XD虚拟机死机问题
  • C# 委托,事件和Lambda表达式
  • ES6学习笔记四 default、rest、Multi-line Strings
  • SharePoint 2010 Excel Service 入门——在网页上显示Excel内容
  • New Concept English Two 33 94
  • 100%高度全屏自适应
  • .pyc 想到的一些问题
  • 【个人向】《HTTP图解》阅后小结
  • canvas绘制圆角头像
  • egg(89)--egg之redis的发布和订阅
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaWeb(学习笔记二)
  • PV统计优化设计
  • Python学习笔记 字符串拼接
  • SOFAMosn配置模型
  • vue-cli在webpack的配置文件探究
  • vue-router的history模式发布配置
  • 官方解决所有 npm 全局安装权限问题
  • 基于webpack 的 vue 多页架构
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 浅谈web中前端模板引擎的使用
  • 如何设计一个比特币钱包服务
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 学习使用ExpressJS 4.0中的新Router
  • 异步
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (一)为什么要选择C++
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net的socket示例
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [20170713] 无法访问SQL Server
  • [ACTF2020 新生赛]Include
  • [BZOJ] 2044: 三维导弹拦截
  • [c]扫雷
  • [codevs 1296] 营业额统计
  • [DevOps云实践] 彻底删除AWS云资源
  • [HDU]2161Primes