【SQL 必知必会】- 第十五课 插入数据

目录

数据插入

        插入完整的行

        总是使用列的列表

        小心使用VALUES

        插入部分行

        省略列

        插入检索出的数据

        新例子的说明

        INSERT SELECT 中的列名

        插入多行

从一个表复制到另一个表

        INSERT SELECT 与SELECT INTO

        进行表的复制


        这一课介绍如何利用SQL 的INSERT 语句将数据插入表中。

数据插入

        毫无疑问,SELECT 是最常用的SQL 语句了,这就是前14 课都在讲它的原因。但是,还有其他3 个常用的SQL 语句需要学习。第一个就是INSERT(下一课介绍另外两个)。

        顾名思义,INSERT 用来将行插入(或添加)到数据库表。插入有几种方式:

  • 插入完整的行;
  • 插入行的一部分;
  • 插入某些查询的结果。

        插入完整的行

        把数据插入表中的最简单方法是使用基本的INSERT 语法,它要求指定表名和插入到新行中的值。

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

        必须给每一列提供一个值。如果某列没有值,则应该使用NULL 值(假定表允许对该列指定空值)。各列必须以它们在表定义中出现的次序填充。

        在某些SQL 实现中,跟在INSERT 之后的INTO 关键字是可选的。但即使不一定需要,最好还是提供这个关键字

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

        编写INSERT 语句的更安全(不过更烦琐)的方法如下:

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

        因为提供了列名,VALUES 必须以其指定的次序匹配指定的列名,不一定按各列出现在表中的实际次序。其优点是,即使表的结构改变,这条INSERT 语句仍然能正确工作。


        总是使用列的列表

        不要使用没有明确给出列的INSERT 语句。给出列能使SQL 代码继续发挥作用,即使表结构发生了变化。

        即不要使用 insert *,使用这个 SQL 的唯一好处是省事,但是后续一旦对表结构做了改动之后(甚至只是栏位长度的改动),极有可能会出现执行失败的情况,到时候还是需要对代码进行修改。这么说的原因肯定是在工作中已经遇到了这种问题,导致出现了错误,不得不对代码部分进行完善。


        小心使用VALUES

        不管使用哪种INSERT 语法,VALUES 的数目都必须正确。如果不提供列名,则必须给每个表列提供一个值;如果提供列名,则必须给列出的每个列一个值。否则,就会产生一条错误消息,相应的行不能成功插入。


        插入部分行

        使用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');

        省略列

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

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

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


        插入检索出的数据

        INSERT 一般用来给表插入具有指定列值的行。INSERT 还存在另一种形式,可以利用它将SELECT 语句的结果插入表中,这就是所谓的INSERT SELECT。顾名思义,它是由一条INSERT 语句和一条SELECT语句组成的。

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 语句。DB2 不支持这里描述的SELECT INTO。


        INSERT SELECT 与SELECT INTO

        它们之间的一个重要差别是前者导出数据,而后者导入数据

SELECT *
INTO CustCopy
FROM Customers;

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

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

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

        进行表的复制

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

猜你喜欢

转载自blog.csdn.net/qq_57163366/article/details/130123090
今日推荐