oracle insert的擴充套件

2021-09-30 15:34:00 字數 3390 閱讀 9953

向乙個表發散彈槍:

⑴ 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,增強可讀性。

例子:

create table emp_1 as select employee_id,last_name from employees where 1=0;

create table emp_2 as select * from employees where 1=0;

create table emp_3 as select * from employees where 1=0;

insert all

--不指定emp_1後面的列,也沒有values指定列,那麼emp_1所有列型別和順序與查詢的列的型別和順序一致

--也就是emp_1中只有查詢結果中的那幾列,而且型別和順序一致

into emp_1

--指定了emp_2後面的列,但沒有values指定列,表示emp_2中要插入的列被選擇出來,與查詢結果列的型別和順序一致

--emp_2也有很多列,不止這兩列

into emp_2(employee_id,last_name)

--指定emp_3後面的列和values指定列,那麼values後面的列名必須與查詢結果一致,如果查詢有別名,必須在values中使用別名

--emp_3指定的列的型別和順序必須與values保持一致

--emp_3也可能列數大於指定列數

into emp_3(employee_id,last_name) values(e_id,e_last_name)

select employee_id e_id,last_name e_last_name

from employees

㈡ 帶條件的insert

包括:insert all和insert first

語法: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會自動過濾掉上乙個匹配過的行記錄

例子:

insert all

--將查詢結果s_id>20的插入,條件中指定的列必須與查詢結果名字一致,如果有別名,請用別名

when e_id>20

then into emp_1

--s_last_name為m開頭的插入,可能插入的行與s_id有重複

when e_last_name like 'm%'

then into emp_2(employee_id,last_name)

--如果指定else,則不滿足上面條件的插入到emp_3,插入的行不會與上面兩個重複

else

into emp_3(employee_id,last_name) values(e_id,e_last_name)

select employee_id e_id,last_name e_last_name

from employees

㈢ pivoting insert(旋轉插入)

關係型資料庫三正規化,歸納起來三句話:

① 行不可再分

② 列不可再分

③ 列不可重複

但很多情況下,正規化都會被破壞。使用旋轉插入可以實現將非關係表記錄轉換為關係表在資料庫儲存。和insert all類似,不過這裡是向乙個表發散彈槍,將列轉變成行。

例子:

create table sales (year_2008 number,year_2009 number,year_2010 number,year_2011 number,year_2012 number)

insert into sales values(191,922,392,942,592)

select * from sales

create table cow_sales(year_sales number)

insert all

into cow_sales values(year_2008)

into cow_sales values(year_2009)

into cow_sales values(year_2010)

into cow_sales values(year_2011)

into cow_sales values(year_2012)

select * from sales

select * from cow_sales

oracle insert的擴充套件

向乙個表發散彈槍 insert into table name column column.select statement 每次只能插入乙個表,但效能上比寫多條insert語句要高。另外,oracle還提供create table table name as select as不可少!實現直接建立...

Oracle insert多表插入語句

oracle 多表插入 如下 create table emp1 as select empno,ename,job from emp where 1 2 create table emp2 as select empno,ename,deptno from emp where 1 2 沒有條件in...

oracle insert兩個關聯表

現有一張老師學生表 tb tea cou 由於業務需要,需把老師學生表tb tea stu拆分成兩張表 tb tea tb cou 並把記錄insert到這兩張子表中 tb tea tb cou為關聯的兩張表 表結構如下 tb tea cou id,pk name,任課老師 zc,職稱 course...