INSERT语句简介

要向表中添加一行或多行,可以使用INSERT语句。下面说明了INSERT语句的最基本形式:

  INSERT INTO table_name (column_list)
  VALUES (value_list);
  --简写
  INSERT INTO table_name
  VALUES (value_list);

让我们来看一下这个语法的更多细节。

首先,可以指定一个表名,通常,可以通过架构(Scheme)来引用表明,比如dbo.products,启动dbo就是架构名,products就是表名。

其次,指定要在其中插入数据的一列或多列列表。必须将列列表括在括号中,并用逗号分隔列。

如果表中的某列未出现在列列表中,则SQL Server必须能够提供插入值,否则无法插入该行,比如:自增主键就不用手动插入值,SQL Server会自动提供插入值。

SQL Server会自动为表中可用但未出现在INSERT语句列列表中的列使用以下值:

  • 列为IDENTITY属性的标识列,下一个值自动自增。
  • 如果列具有指定的默认值,则为默认值。
  • 如果列的数据类型是时间戳数据类型,则为当前时间戳值。
  • 如果列可为空,则为NULL
  • 如果列是计算列,则为计算值。

第三,提供要插入VALUES子句的值列表。列列表中的每列必须在值列表中具有相应的值。此外,必须将值列表括在括号中。

SQL Server插入语句示例

先创建一个名为Students的学生表

  create table dbo.Students
  (
  Id int primary key identity(1,1), -- 每添加一条数据,Id从1开始,每次自增1
  NickName nvarchar(15), -- unicode
  StudentNo char(11) , -- 学号
  Sex nchar(2),
  Account varchar(20), -- 账号
  [Password] varchar(50) -- 密码
  );

表中的主键Id列是一个标识列,所以该列的值会在添加数据时自动自增。

向表中添加几行数据:

INSERT完整写法

  insert into Students(
  NickName,StudentNo,Sex,Account,[Password]
  )
  values
  ('张三','2001','男','user1','123456')

上面的SQL语句,我们指定了除了Id列外的其他五列,没有指定Id列,因为SQL Server会自动给Id列提供自增值。

正常情况,以上语句会执行成功:

可以执行一下语句验证:

  select * from dbo.Students

返回:

INSERT简写

  insert into Students values
  ('张三','2001','男','user1','123456')

这种方式不需要指定字段名称,但是需要指定所有字段的值(除了自增的主键不需要),并且默认值也需要手动加上,不可省略。

使用简写的方式,如果我不想给所有字段都赋值,怎么办?(把不想赋值的字段赋null(前提是这个字段可以允许为空):

  insert into UserInfo values('高大侠','7','保密',null,null)

插入同时返回插入的值

要拿到插入的值,可以使用OUTPUT子句。例如,以下语句将新行插入Students表,并返回主键Id列的插入值:

  insert into Students(
  NickName,StudentNo,Sex,Account,[Password]
  ) OUTPUT inserted.Id
  values
  ('李四','2002','男','user2','123456')

执行结果:

如果要获取多个插入的列的值,如下所示:

  insert into Students(
  NickName,StudentNo,Sex,Account,[Password]
  ) OUTPUT
  inserted.Id,
  inserted.NickName,
  inserted.StudentNo,
  inserted.Sex,
  inserted.Account,
  inserted.[Password]
  values
  ('王五','2003','女','user3','123456')

执行结果:

在标识(IDENTITY)列中插入显式值

通常,您是不需要指定表示列的值,因为SQL Server会自动提供标识列的值。

但是,在某些情况下,您可能希望在标识列中插入一个值,例如数据迁移。

看如下插入语句:

  insert into Students(
  Id,NickName,StudentNo,Sex,Account,[Password]
  )
  values
  (4,'王麻子','2004','男','user4','123456')

执行,SQL Server会报如下错误:

  Cannot insert explicit value for identity column in table 'Students' when IDENTITY_INSERT is set to OFF.

翻译:当IDENTITY_INSERT设置为OFF时,无法在表Students中插入identity列(Id列)的显式值。

要为标识列插入显式值,必须首先执行以下语句:

  SET IDENTITY_INSERT table_name ON;

要关闭标识插入,请使用类似的语句:

  SET IDENTITY_INSERT table_name OFF;

让我们执行以下语句,在学生表中插入主键Id列的值:

  SET IDENTITY_INSERT dbo.Students ON;
   
  insert into dbo.Students(
  Id,NickName,StudentNo,Sex,Account,[Password]
  )
  values
  (4,'王麻子','2004','男','user4','123456')
   
  SET IDENTITY_INSERT dbo.Students OFF;

在本例中,我们首先打开了标识插入,然后为标识列插入了一个具有显式值的行,最后关闭了标识插入。
执行成功

插入后的数据:

插入多行数据

语法如下:

  INSERT INTO table_name (column_list)
  VALUES
  (value_list_1),
  (value_list_2),
  ...
  (value_list_n);
  --简写
  INSERT INTO table_name
  VALUES
  (value_list_1),
  (value_list_2),
  ...
  (value_list_n);

在这种语法中,不是使用单个值列表,而是使用多个逗号分隔的值列表进行插入

使用这种形式的INSERT语句,一次可以插入的行数为1000行。如果要插入更多的行,应考虑使用多个INSERT语句、BULK INSERT或派生表。

请注意,此插入多行语法仅在SQL Server 2008或更高版本中受支持。

要插入SELECT语句返回的多行,可以使用INSERT INTO SELECT子句。

SQL Server插入多行示例

  insert into Students(
  NickName,StudentNo,Sex,Account,[Password]
  )
  values
  ('张三','2001','男','user1','123456'),
  ('李四','2002','男','user2','123456'),
  ('王麻子','2003','女','user3','123456')

简写如下:

  insert into Students
  values
  ('张三','2001','男','user1','123456'),
  ('李四','2002','男','user2','123456'),
  ('王麻子','2003','女','user3','123456')

INSERT INTO SELECT语句

INSERT INTO SELECT简介

要将其他表中的数据插入表中,请使用以下SQL Server INSERT INTO SELECT语句:

  INSERT [ TOP ( expression ) [ PERCENT ] ]
  INTO target_table (column_list)
  query

在这种语法中,语句将query返回的行插入到target_table中。3

query是从其他表检索数据的任何有效SELECT语句。它必须返回与column_list中指定的列相对应的值。

TOP子句部分是可选的。它允许您指定要插入目标表的查询返回的行数。如果使用percent选项,则语句将插入行的百分比。请注意,最佳做法是始终将TOP子句与ORDER BY子句一起使用。

INSERT INTO SELECT示例

首先创建一个名为addresses的表:

  CREATE TABLE sales.addresses (
  address_id INT IDENTITY PRIMARY KEY,
  street VARCHAR (255) NOT NULL,
  city VARCHAR (50),
  state VARCHAR (25),
  zip_code VARCHAR (5)
  );

插入另一个表中的所有行

以下语句将customers(客户)表中的所有地址插入addresses(地址)表:

  INSERT INTO sales.addresses (street, city, state, zip_code)
  SELECT
  street,
  city,
  state,
  zip_code
  FROM
  sales.customers
  ORDER BY
  first_name,
  last_name;

要验证插入,请使用以下查询:

  SELECT
  *
  FROM
  sales.addresses;

输出:

插入另一个表中的部分行

以下语句将位于Santa CruzBaldwin的商店地址添加到addresses(地址)表中:

  INSERT INTO
  sales.addresses (street, city, state, zip_code)
  SELECT
  street,
  city,
  state,
  zip_code
  FROM
  sales.stores
  WHERE
  city IN ('Santa Cruz', 'Baldwin')

插入前N行

要插入按名字和姓氏排序的前10位客户,请使用INSERT TOP INTO SELECT语句,如下所示:

  INSERT TOP (10)
  INTO sales.addresses (street, city, state, zip_code)
  SELECT
  street,
  city,
  state,
  zip_code
  FROM
  sales.customers
  ORDER BY
  first_name,
  last_name;

插入行的顶部百分比

  INSERT TOP (10) PERCENT
  INTO sales.addresses (street, city, state, zip_code)
  SELECT
  street,
  city,
  state,
  zip_code
  FROM
  sales.customers
  ORDER BY
  first_name,
  last_name;

转载至https://www.cnblogs.com/michaelshen/p/16597624.html

seql sever INSERT语句简介的更多相关文章

  1. 【SQL Sever】将SQL Sever中的一个数据表的数据导出为insert语句

    例如:这SQL   Sever中的一张数据表,想要将这张数据表中的数据  转化成一个一个的insert语句存储在txt的文档中,那么不论走到那里这个insert语句一执行,我们就能将这个数据表中的数据 ...

  2. sql server 数据库导出表里所有数据成insert 语句

    有时候,我们想把数据库的某张表里的所有数据导入到另外一个数据库或另外一台计算机上的数据库,对于sql server有这样的一种方法 下面我以sql server 2008 R2,数据库是Northwi ...

  3. sql server 2008R2 导出insert 语句(转载)

    转载来源: https://blog.csdn.net/zengcong2013/article/details/78648988. sql server 2008R2数据库导出表里所有数据成inse ...

  4. 通过DbVisualizer 工具运行DB2存储过程实现INSERT语句主键自增造数

    1.需求简介 最近开发人员需要进行一批数据进行生产上SQL语句耗时过长问题的验证与优化.所以在性能测试库中批量建造数据,由于交易本身业务逻辑过于复杂以及需要各种授权,最后决定采用插表的方式完成. 2. ...

  5. SQLTest系列之INSERT语句测试

    原文地址:https://yq.aliyun.com/articles/64375?spm=5176.100239.blogcont69187.22.fhUpoZ 摘要: 一款可以测试MSSQL Se ...

  6. SQL Sever查询语句集锦

    一. 简单查询简单的Transact-SQL查询只包括选择列表.FROM子句和WHERE子句.它们分别说明所查询列.查询的表或视图.以及搜索条件等. 例如,下面的语句查询testtable表中姓名为“ ...

  7. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  8. PL/SQL客户端中执行insert语句,插入中文乱码

    问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual;    结果为AMERICAN_ ...

  9. Sql Server系列:Insert语句

    1 INSERT语法 [ WITH <common_table_expression> [ ,...n ] ] INSERT { [ TOP ( expression ) [ PERCEN ...

  10. SQLServer将表数据导出为Insert语句

    从网上找到的方法,不过很不错,记录下来,也算是分享下~~ 有一个表,city,有列:cityID,cityName;将此表中所有数据,变为insert语句 select 'insert into ta ...

随机推荐

  1. for循环 rang方法

    今日内容 while循环补充说明 1.死循环 真正的死循环是一旦执行 cpu的功耗急剧上升 直到系统采取紧急措施 2.嵌套及全局标志位 强调: 一个break只能结束他所在那一层的循环 如果想一次性结 ...

  2. 探究BrainSplit-集群脑裂

    本篇文章将会以redis集群为例,分享在主从集群中会导致数据丢失的一个问题:BrainSplit-集群脑裂 1.什么是集群脑裂 所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求.而 ...

  3. 行为型模式 - 访问者模式Visitor

    学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 行为型模式,我之所以把他放到第一个,是因为它号称是GoF中最难的一个. 模式的定义与特点 在访问者模式中(Visitor Pat ...

  4. 11月28日内容总结——多表查询的两种方法及部分小知识点、可视化软件Navicat安装及简单使用讲解及多表查询练习题、python代码操作MySQL(pymysql模块)

    目录 一.多表查询的两种方法 方式1:连表操作 inner join(内连接) left join(左连接) right join(右连接) union(全连接) 方式2:子查询 二.小知识点补充说明 ...

  5. dotnet 缓存

    Net 内置内存缓存 asp.net 中是有缓存的实现:HttpContext.Cache,缓存的数据是放到 Web 服务器的进程 内存里. 在控制台.WinForm.子线程.SignalR 等不支持 ...

  6. 软件教程 | Jupyter&stata之stata_kernel攻略

    ![](http://mdimg.yxj1010.top/xlbxs_ydt2.png) 目录: 目录 一.什么是stata_kernel 1. stata_kernel简介 2. 为什么要使用sta ...

  7. TCTrack

    TCTrack TCTrack: Temporal Contexts for Aerial Tracking,空中追踪的时间上下文 论文 官方代码 贡献: 提出了一种时间自适应卷积TAdaCNN. 提 ...

  8. Os-Hax

    Os-Hax 目录 Os-Hax 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.2.1 目录分析 2 反弹Shell 3 提权 3.1 尝试提权 3.2 收集当前系统信息 3.3 利用su ...

  9. 代码随想录算法训练营day01 | leetcode 704/27

    前言   考研结束半个月了,自己也简单休整了一波,估了一下分,应该能进复试,但还是感觉不够托底.不管怎样,要把代码能力和八股捡起来了,正好看到卡哥有这个算法训练营,遂果断参加,为机试和日后求职打下一个 ...

  10. python爬取网页的多种方式以及保存方法

    爬取网页信息并保存 bs4和lxml都是用来将接收的数据解析html 1.bs4+excel(openpyxl): import requests from bs4 import BeautifulS ...