向一個表發散彈槍: ⑴ insert into table_name [(column[,column…])] select_statement 每次只能插入一個表,但性能上比寫多條insert語句要高。另外,oracle還提供create table table_name as select …,as不可少!實現直接創建并且插入表,依賴于后面的s
向一個表發散彈槍:
⑴ insert into table_name [(column[,column…])] select_statement
每次只能插入一個表,但性能上比寫多條insert語句要高。另外,Oracle還提供create table table_name as select …,as不可少!實現直接創建并且插入表,依賴于后面的select語句的結果,如:create table new_table as select * from source_table where 1=0
–
案例:
表mxt新增一列time,那么這個列會被置在最后,現想把此列放于第2
create table copy_mxt as select id,time,name from mxt;
drop table mxt;
rname copy_mxt to mxt;
向多個表發散彈槍:
類型:
??????????? ① 無條件的insert
??????????? ② 帶條件的insert all
??????????? ③ 帶條件的insert first
??????????? ④ pivoting insert
多表insert的使用限制:
??????????? ① 只能對table使用insert,不能對視圖或物化視圖使用
??????????? ② 不能對遠程表使用這個插入操作
??????????? ③ 多表插入時,不能指定一個表的集操作
??????????? ④ 多表insert的into的目標表加在一起的列數不能超過999
㈠ 無條件的insert
???????????? 語法:
???????????? insert all
???????????? into dest_table1 [column(,column…)] [values (…)]
???????????? into dest_table2 [column(,column…)] [values (…)]
???????????? …
???????????? select_statement? –values中指定是select結果列,如果沒有values指定列,那么表示目標表的列類型和順序與select語句查詢的結果完全一致。建議不要省略目標表中的列和values,增強可讀性。
例子:
1.create table emp_1 as select employee_id,last_name from employees where 1=0;??
2.create table emp_2 as select * from employees where 1=0;??
3.create table emp_3 as select * from employees where 1=0;??
4.insert all??
5.–不指定emp_1后面的列,也沒有values指定列,那么emp_1所有列類型和順序與查詢的列的類型和順序一致???
6.–也就是emp_1中只有查詢結果中的那幾列,而且類型和順序一致???
7.? into emp_1??
8.–指定了emp_2后面的列,但沒有values指定列,表示emp_2中要插入的列被選擇出來,與查詢結果列的類型和順序一致???
9.–emp_2也有很多列,不止這兩列???
10.? into emp_2(employee_id,last_name)??
11.–指定emp_3后面的列和values指定列,那么values后面的列名必須與查詢結果一致,如果查詢有別名,必須在values中使用別名???
12.–emp_3指定的列的類型和順序必須與values保持一致???
13.–emp_3也可能列數大于指定列數???
14.? into emp_3(employee_id,last_name) values(e_id,e_last_name)??
15.? select employee_id e_id,last_name e_last_name???
16.?? from employees?
語法:
???????????? insert all
???????????? when condition_statement
???????????? then into dest_table1[指定列] values[查詢中的列]
???????????? when condition_statement
???????????? then into dest_table2[指定列] values[查詢中的列]
???????????? select_statement
???????????? 注釋:帶條件的insert all與insert first的區別在于只按條件對查詢的結果進行刷選,不會考慮前面已經匹配過的記錄,每次都是全量匹配,而insert first對已經匹配過的記錄不予考慮,下一個when會自動過濾掉上一個匹配過的行記錄
???????????? 例子:
1.insert all?
2.? –將查詢結果s_id>20的插入,條件中指定的列必須與查詢結果名字一致,如果有別名,請用別名?? 3.? when e_id>20? 4.??? then into emp_1? 5.? –s_last_name為M開頭的插入,可能插入的行與s_id有重復?? 6.? when e_last_name like ‘M%’? 7.??? then into emp_2(employee_id,last_name)? 8.? –如果指定else,則不滿足上面條件的插入到emp_3,插入的行不會與上面兩個重復?? 9.? else? 10.??? into emp_3(employee_id,last_name) values(e_id,e_last_name)? 11.? select employee_id e_id,last_name e_last_name? 12.??? from employees??