zoukankan      html  css  js  c++  java
  • SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解(SQL数据库和Oracle数据库的区别)

    我们经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。

    1.INSERT INTO SELECT语句

    语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

    或者:Insert into Table2 select  *  from Table1

    注意:(1)要求目标表Table2必须存在,并且字段field,field2...也必须存在

    (2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2...中必须包括主键

    (3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:

    Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1)

    由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:

    + expand sourceview plaincopy to clipboardprint


        --1.创建测试表  
        create TABLE Table1  
        (  
            a varchar(10),  
            b varchar(10),  
            c varchar(10)
        )
        create TABLE Table2  
        (  
            a varchar(10),  
            c varchar(10),  
            d int
        )

        --2.创建测试数据  
        Insert into Table1 values('赵','asds','90')  
        Insert into Table1 values('钱','asds','100')  
        Insert into Table1 values('孙','asds','80')  
        Insert into Table1 values('李','asds',null)  

        select * from Table2

    --3.INSERT INTO SELECT语句复制表数据部分列和常值

    Insert into Table2(a, c, d) select a,c,5 from Table1

    或:Insert into Table2 select * from Table1

    --4.显示更新后的结果  

    select * from Table2  

        --5.删除测试表  
        drop TABLE Table1  
        drop TABLE Table2



     

    2.SELECT INTO FROM语句

    语句形式为:SELECT vale1, value2 into Table2 from Table1

    要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。示例如下:

    view plaincopy to clipboardprint?
        --1.创建测试表  
        create TABLE Table1  
        (  
            a varchar(10),  
            b varchar(10),  
            c varchar(10)
        )

        --2.创建测试数据  
        Insert into Table1 values('赵','asds','90')  
        Insert into Table1 values('钱','asds','100')  
        Insert into Table1 values('孙','asds','80')  
        Insert into Table1 values('李','asds',null)  

        --3.SELECT INTO FROM语句创建表Table2并复制数据  
        select a,c INTO Table2 from Table1  
     
        --4.显示更新后的结果  
        select * from Table2  

        --5.删除测试表  
        drop TABLE Table1  
        drop TABLE Table2 


    注意:如果在sql/plus或者PL/SQL执行这条语句,会报"ORA-00905:缺失关键字"错误,原因是PL/Sql与T-SQL的区别。
    T-SQL中该句正常,但PL/SQL中解释是:
    select..into is part of PL/SQL language which means you have to use it inside a PL/SQL block. You can not use it in a SQL statement outside of PL/SQL.
    即不能单独作为一条sql语句执行,一般在PL/SQL程序块(block)中使用。

    如果想在PL/SQL中实现该功能,可使用Create table newTable as select * from ...:
    如: create table NewTable as select * from ATable;

    NewTable 除了没有键,其他的和ATable一样

    ---------SQL SELECT INTO语法介绍
    SQL SELECT INTO 语句可用于创建表的备份复件。
    SELECT INTO 语句
    SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
    SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
    SQL SELECT INTO 语法
    您可以把所有的列插入新表:
    SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename
    或者只把希望的列插入新表:
    SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename
    SQL SELECT INTO 实例 - 制作备份复件
    下面的例子会制作 "Persons" 表的备份复件:
    SELECT * INTO Persons_backup FROM Persons
    IN 子句可用于向另一个数据库中拷贝表:
    SELECT * INTO Persons IN 'Backup.mdb' FROM Persons
    如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:
    SELECT LastName,FirstName
    INTO Persons_backup
    FROM Persons
    SQL SELECT INTO 实例 - 带有 WHERE 子句
    我们也可以添加 WHERE 子句。
    下面的例子通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:
    SELECT LastName,Firstname INTO Persons_backup FROM Persons WHERE City='Beijing'
    SQL SELECT INTO 实例 - 被连接的表
    从一个以上的表中选取数据也是可以做到的。
    下面的例子会创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:
    SELECT Persons.LastName,Orders.OrderNo
    INTO Persons_Order_Backup
    FROM Persons
    INNER JOIN Orders
    ON Persons.Id_P=Orders.Id_P


    出处:http://blog.sina.com.cn/s/blog_7c7ec19b0100u6vb.html

  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/xinhua219/p/11942317.html
Copyright © 2011-2022 走看看