数据库管理员使用SQL语言与关系数据库通信。常见的关系数据库包括Microsoft SQL Server、Oracle、PostgreSQL和MySQL。虽然在关系数据库上使用SQL的许多细节可能因供应商而异,但SQL语法的基本知识本质上是相同的。使用SQL,您可以创建数据库、在其中存储数据、更新现有数据和查询数据。您可以使用输出来生成报告或填充网站。

当数据库管理员必须更改关系数据库中的数据或表时,他们使用数据操作语言(DML),这是SQL语言的一部分。DML的三个基本功能是添加新数据、更新现有数据和删除数据。在编写查询时,可以将DML语句与其他SQL语句一起使用。在本文中,我们将研究三个常见的DML语句之一,INSERT INTO。

完整的SQL训练营2021:从零到英雄

最后更新2021年5月

畅销书
  • 83讲座
  • 所有级别
4.7 (99034)

成为SQL的专家!|由穆Portilla

探索课程

SQL插入到语句中

在SQL中,将插入语句用于将一个记录或行插入或将一个记录或行添加到关系数据库中的表中。

SQL插入的基本语法为语句是:

插入table_name(列1,column2,column3,columnn)值(value1,value2,value3,... valuen);

我们计划在表中插入的列出现在“值”列表中。将单引号内的插入值括在单引号内,以获取字符和日期/时间数据类型。单个引用不需要数字数据类型或空值。每个列应该存在值,值应与表中显示的列相同的顺序。

SQL插入到示例中

这是插入仪中的基本版本,它将允许您将一个记录添加到数据库表中。对于其他示例查询的其余部分,我们将使用着名的Northwinds示例数据库。

以下是Customers表中的记录:

客户ID 顾客姓名 联系名称 地址 城市 PostalCode 国家
1 Alfreds Futerkiste. 玛丽亚Anders. Obere Str。57 柏林 12209. 德国
2 Ana Trujillo Emparedados y helados 安娜特鲁希略 Avda。de la Constitución 2222 墨西哥测向 05021. 墨西哥
3. 安东尼奥·莫雷诺位置,看得我目瞪口呆 Antonio Moreno. Mataderos 2312 墨西哥测向 05023 墨西哥

以下是供应商表中的示例记录:

供应商 SupplierName 联系名称 地址 城市 邮政编码 国家
1 奇异的液体 夏洛特库珀 49 Gilbert St. 伦敦 EC1 4 sd 英国
2 新奥尔良卡津喜悦 雪莱伯克 邮政信箱78934 新奥尔良 70117 美国
3. 奶奶凯利的家园 Regina墨菲 707年牛津Rd。 安阿伯 48104 美国

因此,如果我们想向Customer表中添加一条记录,它将看起来像这样,假设CustomerID是一个主键,数据库会自动增加:

插入客户(Customername,ContactName,地址,城市,后码,国家)值('Bob Smith','Joe Smith','111 Main ST','堪萨斯城','64115','美国');

这是一个您可以使用的查询,但是它比我们在本例中需要的更冗长。由于CustomerID列是一个自动递增字段,因此我们拥有完成表中一整行所需的每个值。因此,我们不必指定正在使用的列,只要值按列的顺序相同。所以我们可以用下面的语句替换上面的查询:

INSERT INTO Customers VALUES ('Bob Smith', 'Joe Smith', '111 Main St', 'Kansas City', '64115', 'USA');

但是,当插入部分列时,必须指定列,如此查询:

INSERT INTO Customers (CustomerName, City, PostalCode, Country) VALUES ('Bob Smith', 'Kansas City', '64115', 'USA');

但这些例子只是划伤了你可以用插入物做的表面。让我们看几个。

使用插入到多个记录中

我们刚刚查看了如何使用插入到数据库表中添加一个记录。一次,这就是你能做的一切。如果要使用符号语句将多个记录插入表中,则必须编写多个查询。

1992年,SQL语言标准中出现了多行插入的能力。大多数关系数据库现在都支持此功能,但您可能会遇到某些功能。Microsoft SQL Server并未添加直到2008年的功能。

在VALUES列表中添加多条记录的语法正是SQL所期望的。下面是我们如何将多个客户输入到Customer表中:

插入客户(CustomerName,ContactName,地址,城市,后级码,国家)值('Bob Smith','Joe Smith','111 Main St','堪萨斯城','64115','USA'),('Richard Smith','Joe Smith','123 Weber St','堪萨斯城','64105','美国'),('John Smith','Joe Smith','333华盛顿ST','独立','64055','美国');

通过支持此支持的大多数关系数据库,您还可以使用速记版本,因为值与表中的列匹配。

INSERT INTO Customers VALUES('鲍勃·史密斯','乔·史密斯','堪萨斯城','64115','USA'),('约翰·史密斯','乔·史密斯','333华盛顿街','独立','64055','USA');

这种类型的查询在MS SQL中无法工作。对于这个数据库,你必须使用以下查询:

插入客户选择“鲍勃·史密斯”,“张三”,“111年主要圣”,“堪萨斯城”,“64115”,“美国工会所有选择“理查德·史密斯”,“张三”,“123年韦伯圣”,“堪萨斯城”,“64105”,“美国工会所有选择“约翰·史密斯”,“张三”,“333年华盛顿圣”,“独立”,“64055”,“美国”甲骨文,你必须使用双表,这样的查询:INSERT INTO users SELECT 'Bob Smith', 'Joe Smith', '111 Main St', 'Kansas City', '64115', 'USA' FROM DUAL UNION ALL SELECT 'Richard Smith', 'Joe Smith', '123 Weber St', 'Kansas City', '64105', 'USA' FROM DUAL UNION ALL SELECT 'John Smith', 'Joe Smith', '333 Washington St', 'Independence', '64055', 'USA' FROM DUAL

SQL SELECT语句

SELECT语句表示SQL中的数据查询语言(DQL)。将表填充到语句中,我们可以使用SELECT与FROM子句一起以有组织的可读方式从数据库中提取数据。查询中的SELECT关键字后跟由于查询输出而要显示的列列表。

除了关键字from之外,一个SELECT语句后面还可以跟着其他关键字,比如WHERE和ORDER by,以便在SELECT语句中施加条件。

SELECT语句的语法:

SELECT[列1,列2,…]FROM source_table

如果要将所有列复制到新表中,则在SELECT语句后使用' * '。

语法:

SELECT * INTO newtable FROM table1;SQL SELECT INTO示例,创建一个客户表的副本:

语法:

SELECT * INTO CustomersCopy FROM Customers;

如果我们想要将特定的列名复制到新表中,那么输入:

语法:

从客户中选择[CustomerID,CustomArmame]进入PartialCustomers;

在这里,它将创建一个新表,其中包含SELECT语句中定义的列名称和类型。

使用INSERT INTO SELECT语句

现在我们将看看我们如何使用我们刚刚学到的东西来编写更强大的查询。插入和选择语句的组合有助于您根据另一个表的查询结果将多个行和数据插入表中。查询是用户询问数据库的问题,返回的数据是问题或查询的答案。插入和选择语句的组合允许您有条件地或无条件地将数据插入多个表中。此语句减少了表扫描,并且必须编写更少的代码来执行多个条件插入。

使用INSERT和SELECT语句插入多条记录的基本语法是:

从source_table中插入到表(列1,column2,...)中选择Expression1,Expressi2,...

说明上面语法中使用的参数或参数:

使用INSERT ...在目标和源表之间选择时,必须确保SELECT语句返回的数据类型与目标表中的数据类型兼容。

INSERT INTO SELECT示例

我们的两个Northwind数据库表有效,有关使用插入进入选择的示例,因为客户表和供应商表都有类似的列。让我们说我们想让每个供应商成为客户。您可以用一个查询执行此操作。

插入客户(CustomerName,ContactName,地址,城市,后级代码,国家)选择“供应商的国家/地区,城市,Postalcode,来自供应商的国家/地区;

注意,我们指定了列。这是因为两个表都有自动递增的id,并且我们希望创建新客户。如果我们使用像下面这样使用星号的速记查询,我们就会遇到错误。

SELECT * INTO Customers FROM Suppliers;

一个错误是因为供应商具有供应商栏,客户有一个CustomerName列。此外,每个表的ID列会发生冲突。

但是,如果他们来自美国,我们只想只希望将供应商插入客户表中。然后我们只需要将Where子句添加到SELECT语句中以仅筛选出这些供应商。以下查询将在美国的供应商中创建客户表中的新客户:

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) SELECT SupplierName, ContactName, Address, City, PostalCode, Country FROM Suppliers WHERE Country = 'USA';

如果我们只想插入部分一组列,我们也可以这样做。以下查询仅插入名称和国家/地区。

INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country = 'USA';insert INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) SELECT SupplierName, ContactName, Address, City, PostalCode, Country from Suppliers WHERE Country IN ('USA', 'UK');

使用INSERT INTO后检索主键

数据库开发人员通常需要插入后插入记录的主键。一个示例将在与客户表中交互的网站上创建客户记录,保存客户,然后重定向到网站上的客户记录的视图。在此实例中,您可以单击网站上的保存。这将导致像这样的查询:

INSERT INTO Customers VALUES ('Bob Smith', 'Joe Smith', '111 Main St', 'Kansas City', '64115', 'USA');

然后我们在此查询后需要CustomerID以将用户重定向到客户记录。问题是,此查询不会返回除了在大多数关系数据库中插入有多少条记录的消息以外的任何内容,在这种情况下是一个。现在,我们可以做的是运行类似于此后面的查询:

SELECT CustomerId FROM Customers WHERE CustomerName = 'Bob Smith' AND ContactName = 'Joe Smith' AND Address = '111 Main St' AND City = 'Kansas City' AND PostalCode = '64115' AND Country = 'USA';

那有点荒谬。获取简单的CustomerID的查询比原始查询更复杂。幸运的是,使用许多数据库引擎,有一种方法可以将插入读入查询以返回记录的ID。这样,Web应用程序只能从查询本身检索CustomerID,并立即重定向我们而没有额外的查询。

但是这样做的语法取决于您使用的关系数据库。对于Oracle、PostgreSQL和其他一些数据库,这个查询将返回刚刚通过returns子句插入的客户记录的CustomerId:

INSERT INTO Customers VALUES ('Bob Smith', 'Joe Smith', '111 Main St', 'Kansas City', '64115', 'USA')返回CustomerId;

如果需要,还可以重命名CustomerId。以下查询返回与id列相同的id:

INSERT INTO Customers VALUES ('Bob Smith', 'Joe Smith', '111 Main St', 'Kansas City', '64115', 'USA') return CustomerId INTO ID;

对于Microsoft SQL Server,这有点不同。您必须单独查询来获取CustomerID,但至少它只是您呼叫的功能,而不是上面的复杂选择查询。以下是您必须在Microsoft SQL Server中编写的内容:

INSERT INTO Customers VALUES ('Bob Smith', 'Joe Smith', '111 Main St', 'Kansas City', '64115', 'USA');选择SCOPE_IDENTITY ();

对于MySQL,您还必须使用单独的查询。像SQL Server一样,它非常简单。这里是mysql中的查询:

INSERT INTO Customers VALUES ('Bob Smith', 'Joe Smith', '111 Main St', 'Kansas City', '64115', 'USA');选择last_insert_id();

如果您仍然使用SQL MS,这里有您必须写的查询:

INSERT INTO Customers VALUES ('Bob Smith', 'Joe Smith', '111 Main St', 'Kansas City', '64115', 'USA');输出插入。

因此,在使用INSERT TAN语句的同时对于大多数数据库引擎而言,如果您想要插入的记录的主键,则查询将根据您使用的关系数据库而变化。

顶尖发展课程betwayapp下载安装

完成c# Unity Game Developer 3D
Ben Tristem, Rick Davidson(游戏开发者)电视团队
4.7 (27,132)
畅销书
了解TypeScript - 2021版
马克西米利安Schwarzmuller
4.7 (21,542)
畅销书
数据科学课程2021:完整的数据科学训练营
365职业,365名职业团队
4.6 (91,667)
畅销书
虚幻引擎c++开发:学习c++和制作视频游戏
Ben Tristem, Sam Pattuzzi(游戏开发)电视团队Rob Brooks报道
4.6 (51609)
畅销书
深度学习A-Z™:手动人工神经网络
Kirill Eremenko,哈德林德·佩特维斯,Ligency团队
4.5 (36,782)
畅销书

更多的开发betwayapp下载安装课程

用插入触发

触发器是当数据库中发生事件时自动执行的过程。当INSERT、UPDATE或DELETE语句运行时,可以在数据库上创建DML触发器。这些触发器将在事件发生时发生,无论该事件是否导致数据库中的更改。

向INSERT事件添加触发器是数据库中的一项常见任务。在我们的Customer示例表中,我们可能希望在获得新客户时发生一些事情。也许我们需要向一个表添加一条记录,该表将客户分配给一个代表,或者向另一个表添加一条记录,该表保存新的客户信息包的邮件列表。

对于INSERT触发器,可以选择BEFORE INSERT触发器或AFTER INSERT触发器。BEFORE INSERT触发器允许您在数据添加到表之前修改数据,而AFTER INSERT触发器不能更改插入的数据。尽管如此,它们仍然可以处理我们希望在插入新客户后发生的上述操作。

结论

SQL INSERT INTO语句是您将一直在SQL查询中使用的语句。使用此查询的方式有很多种,从简单地将记录插入到表中,到复制整个表,再到将一个表的一部分复制到另一个表中。

整体而言,SQL是一种简单,友好的英文语言,相对容易学习。由于数据库用户和世界各地的开发人员广泛使用它,它也是非常访问的。要成为一个成功的数据库管理员,您必须知道如何构建和开发一个正确设计和链接的数据库,这将帮助您根据需要检索来自尽可能多的表的信息。一个好的开始,正在熟悉每天使用的基本SQL命令。

让我们继续学习SQL更新命令!

SQL中的顶级课程

SQL和PostgreSQL:完整的开发人员指南
斯蒂芬格莱德里
4.7 (1456)
评价最高
Ultimate MySQL BootCamp:从SQL初学者到专家
Colt Steele,Ian Schoonover
4.6 (54,294)
畅销书
SQL - 用于数据分析和商业智能的MySQL
365职业
4.6 (27,789)
畅销书
高级SQL: SQL专家认证准备课程
8万多名学员,Code Star学院
4.5 (2,204)
完整的SQL和数据库Bootcamp:零掌握[2021]
安德烈Neageie,Mo Binni
4.6 (1,472)
SQL初学者:学习SQL使用MySQL和数据库设计
Tim Buchalka的学习编程学院,Jon Avis - SQL讲师
4.5 (11220)
SQL & PostgreSQL初学者:成为一个SQL专家
Jon Avis - SQL讲师
4.6 (3,228)
畅销书
SQL编程基础知识
国际学院
4.4 (110)
SQL Server:27小时的MasterClass课程(1个课程1)
O.Thuillier |SQL |postgres |PowerShell |mysql |管理,TSQL和SQL Server性能。
4.5 (20)
Oracle SQL - 一步一步
Reddy Amarnath
4.4 (2160)

更多SQL课程

SQL学生也学习

赋予你的团队。引领行业。

通过Udemy为Business获取组织的在线课程和数字学习工具库的订阅。

请求一个演示