日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL基础操作_4_表的插入、更新、删除、合并操作

發(fā)布時間:2024/9/27 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL基础操作_4_表的插入、更新、删除、合并操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

?表的插入、更新、刪除、合并操作

7.4.1 插入新的記錄

7.4.2 插入含自增列的記錄

7.4.3 插入新的多條記錄

7.4.4 同時往多個表插入記錄

7.4.5 通過其它表插入

7.4.6 通過多表關(guān)聯(lián)插入

7.4.7 通過視圖插入

7.4.8 插入手工數(shù)據(jù)

7.4.9 插入默認(rèn)值

7.4.10 僅復(fù)制表結(jié)構(gòu)

7.4.11 更新表的記錄

7.4.12 通過表關(guān)聯(lián)更新表

7.4.13 通過表關(guān)聯(lián)更新多個字段

7.4.14 通過表關(guān)聯(lián)更新多個表多個字段

7.4.15 按照默認(rèn)值更新表

7.4.16 刪除表中所有記錄

7.4.17 按照條件刪除表中記錄

7.4.18 清空表中記錄

7.4.19 通過表關(guān)聯(lián)刪除記錄

7.4.20 通過表關(guān)聯(lián)刪除多張表

7.4.21 合并表中數(shù)據(jù)


7.4 表的插入、更新、刪除、合并操作

注:數(shù)據(jù)集和表結(jié)構(gòu)見?SQL基礎(chǔ)操作_1_檢索數(shù)據(jù)

7.4.1 插入新的記錄

需求:向dept表中插入部門編號為50,部門名稱為Production,部門位置為Shanghai的數(shù)據(jù).

解決方法:這里通過INSERT INTO TableName VALUES (…)

Mysql、Sql server、Oracle:

INSERT INTO dept VALUES (50,'Production','Shanghai');

注:這里表dept的定義沒有自增字段,如果有請詳見下面的解決方案.

7.4.2 插入含自增列的記錄

需求:向dept表中插入部門編號為50,部門名稱為Production,部門位置為Shanghai的數(shù)據(jù).

解決方法:這里通過INSERT INTO TableName VALUES (…),這里表dept的deptno字段定義的是自增.

MySql:

INSERT INTO dept VALUES (50,'Production','Shanghai');

Mysql雖然在字段定義時約束了自增,但是在插入自增數(shù)據(jù)時依然可以顯示的插入,只要自增字段的值不和已有的數(shù)據(jù)重復(fù)即可.

如果插入的重復(fù)的自增字段數(shù)據(jù),則會有類似如下的報錯:

Duplicate entry '50' for key'PRIMARY'?

SQL Server:

INSERT INTO dept VALUES (50,'Production','Shanghai');

消息 8101,級別 16,狀態(tài) 1,第 2 行

僅當(dāng)使用了列列表并且 IDENTITY_INSERT 為 ON 時,才能為表'dept'中的標(biāo)識列指定顯式值。

問題原因:

dept表的deptno字段設(shè)置了自增模式,而默認(rèn)默認(rèn)情況下對自增字段的插入是數(shù)據(jù)庫自己維護的,所以當(dāng)用戶手動指定時則會拋出該異常.

create table dept(deptno int IDENTITY(1,1) NOT NULL,dname varchar(15),loc varchar(50),primary key(deptno));

解決該問題有3種辦法:

1)? 修改表結(jié)構(gòu)的定義,去掉表的自增屬性。不建議。

2)? 只插入除自增外的其他字段,讓數(shù)據(jù)庫自行維護自增字段。建議。

3)? 通過打開表的IDENTITY_INSERT開關(guān),顯示插入指定的自增字段。建議.

其中第三種方法的實現(xiàn)代碼見下:

SET IDENTITY_INSERT dept ON; GO INSERT INTO dept(deptno,dname,loc) VALUES (50,'Production','Shanghai') SET IDENTITY_INSERT dept OFF; GO

Oracle:

Oracle里對于自增字段的維護麻煩點,因為它沒有對應(yīng)的關(guān)鍵字.不過我們可以通過內(nèi)置的數(shù)據(jù)庫對象sequence來實現(xiàn).具體實現(xiàn)見下:

create sequence dept_autoincminvalue 50maxvalue 9999999999999999999999999999startwith 50incrementby 10nocache; INSERT INTO dept VALUES (dept_autoinc.nextval,'Production','Shanghai');

DEPTNO

DNAME

LOC

10

ACCOUNTING

NEW YORK

20

RESEARCH

DALLAS

30

SALES

CHICAGO

40

OPERATIONS

BOSTON

50

Production

Shanghai

7.4.3 插入新的多條記錄

需求:向dept表中插入部門編號為50,部門名稱為Production,部門位置為Shanghai和部門編號為60,部門名稱為Programming,部門位置為Beijing的數(shù)據(jù).

解決方法:這里通過INSERT INTO TableName VALUES (…),(…),(…)

Sql server 、Mysql:

INSERT INTO dept VALUES (50,'Production','Shanghai'), (60,'Programming','Beijing');

Oracle:

INSERT ALL INTO dept VALUES (50,'Production','Shanghai') INTO dept VALUES (60,'Programming','Beijing') select 1 from dual;

7.4.4 同時往多個表插入記錄

需求:從dept表里插入數(shù)據(jù)到3張表,當(dāng)loc是NEW YORK和BOSTON時向dept_east表中插入,當(dāng)當(dāng)loc是CHICAGO時向dept_mid表中插入,其它情況往dept_west表中插入.

解決方法:這里通過INSERT ALL WHEN Condition THEN INTO TABLENAME VALUES (…)的方式.

Oracle:

CREATE TABLE dept_east (DEPTNO NUMBER(2), DNAME VARCHAR2(14), LOC VARCHAR2(13));CREATE TABLE dept_mid (DEPTNO NUMBER(2), DNAME VARCHAR2(14), LOC VARCHAR2(13));CREATE TABLE dept_west (DEPTNO NUMBER(2), DNAME VARCHAR2(14), LOC VARCHAR2(13));INSERT ALL WHEN loc IN ('NEW YORK','BOSTON') THEN INTO dept_east(deptno,dname,loc) VALUES (deptno,dname,loc) WHEN loc IN ('CHICAGO') THEN INTO dept_mid(deptno,dname,loc) VALUES (deptno,dname,loc) ELSE INTO dept_west (deptno,dname,loc) VALUES (deptno,dname,loc) SELECT deptno,dname,loc FROM dept

我們可以通過如下的SQL,清晰的看到分散到3個表的數(shù)據(jù):?

SELECT A.*,'dept_east' AS TableSource FROM dept_east A UNION ALL SELECT A.*,'dept_mid' AS TableSource FROM dept_mid A UNION ALL SELECT A.*,'dept_west' AS TableSource FROM dept_west A;

DEPTNO

DNAME

LOC

TABLESOURCE

10

ACCOUNTING

NEW YORK

dept_east

40

OPERATIONS

BOSTON

dept_east

30

SALES

CHICAGO

dept_mid

20

RESEARCH

DALLAS

dept_west


注: 截止目前,僅oracle支持該語法.

7.4.5 通過其它表插入

需求:向dept表中插入部門編號為50,部門名稱為Production,部門位置為Shanghai的數(shù)據(jù).這里需要指定通過SELECT其它表的方式插入

解決方法:這里通過INSERT INTO TableName SELECT ColumnName FROM TableName …

如果我們想將一個表或則多個表的數(shù)據(jù)插入到另外一張新的表,也可以通過INSERT INTO TableName SELECT的方式.

Sql server 、Mysql:

CREATE TABLE temp(deptno varchar(50) NULL,deptname varchar(50) NULL,loc varchar(50) NULL,empno varchar(50) NULL,ename varchar(50) NULL,sal int NULL );

Oracle:

CREATE TABLE temp(deptno varchar2(50) NULL,deptname varchar2(50) NULL,loc varchar2(50) NULL,empno varchar2(50) NULL,ename varchar2(50) NULL,sal int NULL );

Sql server 、Mysql、Oracle:

INSERT INTO temp(deptno,deptname,loc) SELECT deptno,dname,loc FROM dept WHERE dname in ('SALES','OPERATIONS')

7.4.6 通過多表關(guān)聯(lián)插入

需求:通過dept和emp表向temp表中部門名稱為RESEARCH何ACCOUNTING0的數(shù)據(jù).這里temp表的字段來自dept表和emp表.

解決方法:這里通過INSERT INTO TableName SELECT ColumnName FROM TableA JOIN TableB …

Sql server 、Oracle、Mysql:

INSERT INTO temp(deptno,deptname,loc,empno,ename) SELECT A.deptno,A.dname,A.loc,B.EMPNO,B.ename FROM dept A JOIN emp B ON A.DEPTNO = B.Deptno WHERE A.dname in ('RESEARCH','ACCOUNTING') ORDER BY A.deptno; --或者 INSERT INTO temp(deptno,deptname,loc,empno,ename) SELECT A.deptno,A.dname,A.loc,B.EMPNO,B.ename FROM dept A,emp B WHERE A.DEPTNO = B.Deptno AND A.dname IN ('RESEARCH','ACCOUNTING') ORDER BY A.deptno;

7.4.7 通過視圖插入

需求:向dept表中插入部門編號為60,部門名稱為Testing,部門位置為Guangzhou的數(shù)據(jù).這里需要指定通過借助視圖的方式插入.

解決方法:這里需要先建立一張視圖,然后往視圖里插入數(shù)據(jù).

Sql server、Mysql、Oracle:

CREATE VIEW v_deptAS SELECT deptno,deptname,loc FROM temp; INSERT INTOv_dept VALUES (60,'Testing','Guangzhou');SELECT * FROM temp;

執(zhí)行結(jié)果:

deptno

deptname

loc

empno

ename

50

Production

Nanjing

7369

SMITH

60

Testing

Guangzhou

NULL

NULL

7.4.8 插入手工數(shù)據(jù)

需求:向dept表中插入部門編號為50,部門名稱為Production,部門位置為Shanghai和部門編號為60,部門名稱為Programming,部門位置為Beijing的數(shù)據(jù).

解決方法:這里通過INSERT INTO TableName SELECT value1,value2 UNION ALL SELECT … 的方式來事項該功能.

Mysql、Sql server:

INSERT INTO dept(deptno,dname,loc) SELECT 50,'Production','Shanghai' UNION ALL SELECT 60,'Programming','Beijing';

注:這里假設(shè)SQL Server里的dept表已經(jīng)開啟SET IDENTITY_INSERT dept ON或者deptno不是自增字段.

Oracle:

INSERT INTO dept(deptno,dname,loc) SELECT 50,'Production','Shanghai' FROM DUAL UNION ALL SELECT 60,'Programming','Beijing' FROM DUAL;

7.4.9 插入默認(rèn)值

需求:指定dept表loc字段的默認(rèn)值是Beijing,并向該表中插入部門編號為50,部門名稱為Production的數(shù)據(jù).

解決方法:這里需要DDL的里知識,即對表dept在loc這列新增個默認(rèn)值的約束.當(dāng)我們不去插入loc這列時數(shù)據(jù)庫會自動補充默認(rèn)約束里定義的值.

SQL Server:

ALTER TABLE dept add CONSTRAINT DF_dept_loc DEFAULT 'Beijing'FOR loc; SET IDENTITY_INSERT dept ON; GO INSERT INTO dept(deptno,dname) VALUES (50,'Production'); SET IDENTITY_INSERT dept OFF; GO SELECT * FROM dept WHERE deptno=50;

? ? 執(zhí)行結(jié)果:

deptno

dname

loc

50

Production

Beijing


注:

1)? 上述的insert語句,loc這列并沒有顯示維護,是數(shù)據(jù)庫里的默認(rèn)約束自動插入的.

2)? 如果你的表里每一列都直接或間接定義了默認(rèn)值,那么可以通過如下語句插入一個默認(rèn)值:

INSERT INTO TableName?DEFAULT?VALUES;

完整例子見下:

IF OBJECT_ID('dbo.T1','U') IS NOT NULLDROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 (column_1 AS 'Computedcolumn ' + column_2,column_2 varchar(30)CONSTRAINT default_name DEFAULT ('my column default'),column_3 rowversion,column_4 varchar(40)NULL ); GO INSERT INTO T1 DEFAULT VALUES;

執(zhí)行結(jié)果:

column_1

column_2

column_3

column_4

Computed column my column default

my column default

0x00000000000007D5

NULL


Mysql:

alter table dept alter loc set default 'Beijing'; INSERT INTO dept(deptno,dname) VALUES(50,'Production'); SELECT * FROM dept WHERE deptno=50;

deptno

dname

loc

50

Production

Beijing


Oracle:

ALTER TABLE DEPT MODIFY LOC DEFAULT 'Beijing'; INSERT INTO dept(deptno,dname) VALUES (50,'Production'); SELECT * FROM dept WHERE deptno=50;

? ? 執(zhí)行結(jié)果:

deptno

dname

loc

50

Production

Beijing


7.4.10 僅復(fù)制表結(jié)構(gòu)

需求:快速新建一個和dept結(jié)構(gòu)一樣的表dept_new,僅需要字段定義一致,不需要數(shù)據(jù).

解決方法:這里通過SELECT * FROM TableName WHERE 1=0的方式僅拷貝到表結(jié)構(gòu),而沒有數(shù)據(jù).

Oracle、Mysql:

CREATE TABLE dept_new AS SELECT * FROM dept WHERE 1= 2;

Sql server:

SELECT * INTO dept_new FROM dept WHERE 1=0;

注: 如果想既復(fù)制表又復(fù)制數(shù)據(jù),則不需要加WHERE?1=0的限制條件即可.

7.4.11 更新表的記錄

需求:更新dept表里deptno為50的記錄對應(yīng)的loc字段為Nanjing

解決方法:這里通過UPDATE TableName SET ColName=.. WHERE …的方式來更新數(shù)據(jù).

Oracle、Mysql、Sql server:

UPDATE dept SET loc='Nanjing' WHERE deptno=50;

注:

1) 如果想更新表中某個或某幾個字段的所有記錄,只要不加WHERE條件過濾即可.

2) 如果想更新多個字段,直接在SET后面跟字段等于相應(yīng)的值即可.

7.4.12 通過表關(guān)聯(lián)更新表

需求:更新emp表里的sal字段的值為temp表里的sal乘以1.5,這些員工號同時出現(xiàn)在在temp表中.

解決方法:這里通過UPDATE TableName SET ColName=..FROM TABLENAME1 A JOIN TABLENAME2 B … WHERE …的方式來更新數(shù)據(jù).

Sql server:

TUNCATE TABLE temp; INSERT INTO temp(deptno,deptname,loc,empno,ename,sal) SELECT 50,'Production','Nanjing',7369,'SMITH',1000BEGIN TRAN SELECT empno,ename,sal FROM emp WHERE empno=7369;UPDATE A SET A.sal= B.sal*1.5 FROM emp A JOIN temp B ON A.empno= B.empnoSELECT empno,ename,sal FROM emp WHERE empno=7369; ROLLBACK TRAN

執(zhí)行更新前:

empno

ename

sal

7369

SMITH

800.00


執(zhí)行更新后:

empno

ename

sal

7369

SMITH

1500.00


注:

這里的join方式也可以寫成如下的形式:

UPDATE A SET A.sal= B.sal*1.5 FROM emp A,temp B WHERE A.empno= B.empno

Mysql:

TRUNCATE TABLE temp; INSERT INTO temp(deptno,deptname,loc,empno,ename,sal) SELECT 50,'Production','Nanjing',7369,'SMITH',1000UPDATE emp A INNER JOIN fridge.temp B ON A.empno= B.empno SET A.sal= B.sal*1.5

或者:

UPDATE emp,temp SET emp.sal=temp.sal*1.5 WHERE emp.empno=temp.empno;

Oracle:

TRUNCATE TABLE temp; INSERT INTO temp(deptno,deptname,loc,empno,ename,sal) SELECT 50,'Production','Nanjing',7369,'SMITH',1000 FROM DUAL;update emp a set sal=(select b.sal*1.5from temp b whereb.empno=a.empno) where exists (select1 from temp b where b.empno=a.empno ) SELECT empno,ename,sal FROM emp WHERE empno=7369;

結(jié)果跟上述相同.

7.4.13 通過表關(guān)聯(lián)更新多個字段

需求:更新emp表里的sal字段的值為temp表里的sal乘以1.5,同時更新ename為temp表里的值, 匹配條件是兩個表的deptno..

解決方法:這里通過UPDATE TableName SET ColName=..FROM TABLENAME1 A JOIN TABLENAME2 B … WHERE …的方式來更新數(shù)據(jù).

Oracle:

TRUNCATE TABLE temp;INSERT INTO temp(deptno,deptname,loc,empno,ename,sal)SELECT 50,'Production','Nanjing',7369,'SMITH2',1000 FROM DUAL;update emp a set (sal,ename)=(select b.sal*1.5,b.enamefrom temp bwhereb.empno=a.empno) where exists (select1 from temp b where b.empno=a.empno ) SELECT empno,ename,sal FROM emp WHERE empno=7369;

執(zhí)行更新前:

Empno

ename

sal

7369

SMITH

800.00

SELECT empno,ename,sal FROM emp WHERE empno=7369;

執(zhí)行更新后:

empno

ename

sal

7369

SMITH2

1500.00


Sql Server:

TRUNCATE TABLE temp; INSERT INTO temp(deptno,deptname,loc,empno,ename,sal) SELECT 50,'Production','Nanjing',7369,'SMITH2',1000 BEGIN TRAN SELECT empno,ename,sal FROM emp WHERE empno=7369;UPDATE emp SET emp.sal=b.sal*1.5,emp.ename=b.ename from emp a,temp b WHERE a.empno= b.empnoUPDATE emp SET emp.sal=b.sal*1.5,emp.ename=b.ename from emp a JOIN temp b ON a.empno= b.empnoSELECT empno,ename,sal FROM emp WHERE empno=7369;ROLLBACK

執(zhí)行更新前:

Empno

ename

sal

7369

SMITH

800.00


執(zhí)行更新后:

empno

ename

sal

7369

SMITH2

1500.00


Mysql:

BEGIN; SELECT empno,ename,sal FROM emp WHERE empno=7369; UPDATE emp a,temp b SET a.sal=b.sal*1.5 ,a.ename=b.ename WHERE a.empno= b.empno;UPDATE emp a INNER JOIN temp b ON a.empno= b.empno SET a.sal=b.sal*1.5 ,a.ename=b.ename;SELECT empno,ename,sal FROM emp WHERE empno=7369; ROLLBACK;

執(zhí)行結(jié)果相同.

舉一反三:這里多表關(guān)聯(lián)時用到的是join(inner join),當(dāng)然你也可以通過left join、right join以及不等值連接。

7.4.14 通過表關(guān)聯(lián)更新多個表多個字段

更新emp表里的sal字段的值為temp表里的sal乘以1.5,同時更新temp表里ename為emp表里的值,匹配條件是兩個表的deptno.

Mysql:

TRUNCATE TABLE temp; INSERT INTO temp(deptno,deptname,loc,empno,ename,sal) SELECT50,'Production','Nanjing',7369,'SMITH2',1000BEGIN; SELECT empno,ename,sal,'From_emp' as Table_Name FROM emp WHERE empno=7369 UNION SELECT empno,ename,sal,'From_temp' as Table_Name FROM temp WHERE empno=7369; UPDATE emp a,temp b SET a.sal=b.sal*1.5 ,b.ename=a.ename WHERE a.empno= b.empno;UPDATE emp a INNERJOIN temp b ON a.empno= b.empno SET a.sal=b.sal*1.5 ,b.ename=a.ename;SELECT empno,ename,sal,'From_emp' as Table_Name FROM emp WHERE empno=7369 UNION SELECT empno,ename,sal,'From_temp' as Table_Name FROM temp WHERE empno=7369;ROLLBACK;

執(zhí)行更新前:

empno

ename

sal

Table_Name

7369

SMITH

800.00

From_emp

7369

SMITH2

1000.00

From_temp


執(zhí)行更新后:

empno

ename

sal

Table_Name

7369

SMITH

1500.00

From_emp

7369

SMITH

1000.00

From_temp


注:Oracle和SQL Server里暫未發(fā)現(xiàn)該語法.

7.4.15 按照默認(rèn)值更新表

需求:更新deptno對應(yīng)是50的dept表的loc字段成默認(rèn)值.

解決方法:這里通過UPDATE TableName SET ColName=DEFAULT …的方式來更新數(shù)據(jù).

SQL Server:

BEGIN TRAN SELECT * FROM dept WHERE deptno= 50;UPDATE dept SET loc = DEFAULT WHERE deptno= 50;SELECT * FROM dept WHERE deptno= 50; ROLLBACK TRAN

MySQL:

BEGIN; SELECT * FROM dept WHERE deptno=40; UPDATE dept SET loc=default WHERE deptno=40;SELECT * FROM dept WHERE deptno=40; ROLLBACK;

Oracle:

SELECT * FROM dept WHERE deptno=40;UPDATE dept SET loc=default WHERE deptno=40; SELECT * FROM dept WHERE deptno=40; ROLLBACK;

執(zhí)行更新前:

deptno

dname

loc

50

Production

Nanjing


執(zhí)行更新后:

deptno

dname

loc

50

Production

Beijing


?

7.4.16 刪除表中所有記錄

需求:刪除dept表里的所有記錄,但后期可通過數(shù)據(jù)庫日志恢復(fù).

解決方法:這里通過DELETE FROM TableName的方式來刪除數(shù)據(jù).

Oracle、Mysql、Sql server:

DELETE FROM dept; DELETE * FROM dept;

7.4.17 按照條件刪除表中記錄

需求:刪除dept表里deptno為50的記錄,但后期可通過數(shù)據(jù)庫日志恢復(fù).

解決方法:這里通過DELETE FROM TableName WHERE Columname= …的方式來刪除數(shù)據(jù).

Oracle、Mysql、Sql server:

DELETE FROM dept WHERE deptno=50; DELETE FROM dept WHERE deptno IN (50);

7.4.18 清空表中記錄

需求:刪除dept表里deptno為50的記錄,但數(shù)據(jù)不可再恢復(fù).

解決方法:這里通過TRUNCATE TABLE TableName方式來刪除數(shù)據(jù).

Oracle、Mysql、Sql server:

TRUNCATE TABLE dept;

7.4.19 通過表關(guān)聯(lián)刪除記錄

需求:刪除dept表里deptno和temp相同的記錄,但數(shù)據(jù)可再恢復(fù).

解決方法:這里通過DELETE FROM tableNAME A JOIN tableName B …方式來刪除數(shù)據(jù).

Sql server:

BEGIN TRANSELECT * FROM dept;DELETE FROM deptFROM dept AJOIN temp BON A.deptno= B.deptnoSELECT * FROM dept; ROLLBACK TRAN

Mysql:

BEGIN;SELECT * FROM dept A; -- JOIN temp B -- ON A.deptno = B.deptnoDELETE A FROM dept A INNER JOIN temp B ON A.deptno= B.deptno AND B.deptno=40; --或者見下 DELETE dept FROM dept,temp WHERE dept.deptno= temp.deptno AND temp.deptno=40; SELECT * FROM dept;ROLLBACK;

不難發(fā)現(xiàn),這里dept表里deptno=40的記錄被刪除了.

deptno

dname

loc

10

ACCOUNTING

NEW YORK

20

RESEARCH

DALLAS

30

SALES

CHICAGO

50

Production

Beijing


Oracle:

INSERT INTO dept VALUES(50,'Production','Nanjing'); INSERT INTO temp(deptno,deptname,loc,empno,ename,sal) SELECT 50,'Production','Nanjing',7369,'SMITH2',1000 FROM DUAL; DELETE FROM dept WHERE EXISTS (SELECT 1 FROM TEMP WHERE dept.deptno = temp.deptno)

執(zhí)行結(jié)果:

DEPTNO

DNAME

LOC

10

ACCOUNTING

NEW YORK

20

RESEARCH

DALLAS

30

SALES

CHICAGO

40

OPERATIONS

BOSTON


7.4.20 通過表關(guān)聯(lián)刪除多張表

需求:刪除dept表里deptno和temp相同的記錄,但數(shù)據(jù)不可再恢復(fù).

解決方法:這里通過DELETE FROM A,B FROM tableNAME A JOIN tableName B ON …方式來刪除數(shù)據(jù).

INSERT INTO dept VALUES(50,'Production','Nanjing'); INSERT INTO temp(deptno,deptname,loc,empno,ename,sal) SELECT 50,'Production','Nanjing',7369,'SMITH2',1000; BEGIN; SELECT deptno,dname,loc,'tab_dept' as Table_Name FROM dept WHERE deptno=50 UNION ALL SELECT deptno,deptname,loc,'tab_temp' as Table_Name FROM temp WHERE deptno=50;DELETE A,B FROM dept A INNER JOIN temp B ON A.deptno= B.deptno AND B.deptno=50;SELECT deptno,dname,loc,'tab_dept' as Table_Name FROM dept WHERE deptno=50 UNION ALL SELECT deptno,deptname,loc,'tab_temp' as Table_Name FROM temp WHERE deptno=50; ROLLBACK;

執(zhí)行之前:

deptno

dname

loc

Table_Name

50

Production

Nanjing

tab_dept

50

Production

Nanjing

tab_temp


執(zhí)行之后, temp和dept這兩張表里deptno為50的記錄均被刪除:

deptno

dname

loc

Table_Name


注: SQL Server、Oracle目前未見相關(guān)語法。

7.4.21 合并表中數(shù)據(jù)

需求:如果emp_temp表中的員工存在于emp中,則將他們的提成(comm字段)更新為1000;

對于提成已經(jīng)更新為1000的員工,如果他們的工資(SAL字段)少于2000,則從emp_temp表里刪除他們;

其它情況從EMP表里取員工編號(EMPNO字段)、員工名稱(ENAME字段)、部門號(DEPTNO字段)插入到emp_temp中.

Oracle:

CREATE TABLE emp_temp ASSELECT deptno,empno,ename,comm FROM empWHERE empno IN (7782,7839,7934);SELECT et.empno,et.ename,et.deptno,et.comm,emp.sal FROM emp_temp et JOIN emp ON et.empno = emp.empno;MERGE INTO emp_tempetUSING(SELECTempno,ename,deptno,comm,SAL FROM emp) empON(et.empno = emp.empno)WHEN MATCHED THENUPDATE SET et.comm=1000DELETE WHERE (SAL<2000)WHEN NOTMATCHED THENINSERT(et.empno,et.ename,et.deptno,et.comm)VALUES(emp.empno,emp.ename,emp.deptno,emp.comm);SELECT et.empno,et.ename,et.deptno,et.comm,emp.salFROM emp_tempetJOIN empON et.empno= emp.empno;

執(zhí)行前:

EMPNO

ENAME

DEPTNO

COMM

SAL

7782

CLARK

10

2450.00

7839

KING

10

5000.00

7934

MILLER

10

1300.00


執(zhí)行后,emp_temp表里員工編號為7782和7839的comm被更新成了1000,而7934這條記錄被刪除了,其它情況的數(shù)據(jù)從emp表里插入了過來.

EMPNO

ENAME

DEPTNO

COMM

SAL

7369

SMITH

20

1500.00

7499

ALLEN

30

300.00

1600.00

7521

WARD

30

500.00

1250.00

7566

JONES

20

2975.00

7654

MARTIN

30

1400.00

1250.00

7698

BLAKE

30

2850.00

7782

CLARK

10

1000.00

2450.00

7788

SCOTT

20

3000.00

7839

KING

10

1000.00

5000.00

7844

TURNER

30

0.00

1500.00

7876

ADAMS

20

1100.00

7900

JAMES

30

950.00

7902

FORD

20

3000.00


SqlServer:

CREATE TABLE emp_temp(deptno int NULL,empno int NOT NULL,ename varchar(15)NULL,comm decimal(7, 2)NULL ) INSERT INTO emp_temp SELECT deptno,empno,ename,comm FROM emp WHERE empno IN (7782,7839,7934);BEGIN TRAN SELECT et.empno,et.ename,et.deptno,et.comm,emp.sal FROM emp_temp et JOIN emp ON et.empno= emp.empno;MERGE INTO emp_temp etUSING(SELECT empno,ename,deptno,comm,SAL FROM emp) empON (et.empno= emp.empno)WHEN MATCHEDAND SAL< 2000THENDELETE WHEN MATCHED THENUPDATE SET et.comm = 1000WHEN NOTMATCHED THENINSERT VALUES(emp.deptno,emp.empno,emp.ename,emp.comm); SELECT et.empno,et.ename,et.deptno,et.comm,emp.sal FROM emp_temp et JOIN emp ON et.empno= emp.empno; ROLLBACK TRAN

執(zhí)行前:

empno

ename

deptno

comm

sal

7782

CLARK

10

NULL

2450.00

7839

KING

10

NULL

5000.00

7934

MILLER

10

NULL

1300.0


執(zhí)行Merge into之后:

empno

ename

deptno

comm

sal

7782

CLARK

10

1000.00

2450.00

7839

KING

10

1000.00

5000.00

7369

SMITH

20

NULL

800.00

7499

ALLEN

30

300.00

1600.00

7521

WARD

30

500.00

1250.00

7566

JONES

20

NULL

2975.00

7654

MARTIN

30

1400.00

1250.00

7698

BLAKE

30

NULL

2850.00

7788

SCOTT

20

NULL

3000.00

7844

TURNER

30

0.00

1500.00

7876

ADAMS

20

NULL

1100.00

7900

JAMES

30

NULL

950.00

7902

FORD

20

NULL

3000.00


注:

1)? 這里SQL Server和Oracle的mergeinto語法還是有差異的.SQL Server里如下代碼:

WHEN MATCHEDAND SAL< 2000?THEN

?? DELETE

要寫在前面,如果和UPDATE互換了位置,則會報如下錯:

消息 5324,級別 16,狀態(tài) 1,第 11 行

在 MERGE 語句中,帶搜索條件的 'WHEN MATCHED' 子句不能出現(xiàn)在不帶搜索條件的 'WHENMATCHED' 子句后。

2)? 目前Mysql并沒有有merge into的語法.

總結(jié)

以上是生活随笔為你收集整理的SQL基础操作_4_表的插入、更新、删除、合并操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲午夜视频 | 在线视频网站 | 日韩在线播放一区二区 | 国产午夜网站 | 天堂影视在线观看 | 成人国产在线视频 | 亚洲不卡中文字幕 | 无码国产69精品久久久久同性 | 久久久一二三 | 欧美在线 | 亚洲 | 在线看的免费网站 | 红桃视频隐藏入口 | 婷婷综合另类小说色区 | 激情综合图 | 噼里啪啦高清 | 日韩精品久久久久久久电影99爱 | 国产ts变态重口人妖hd | 青青导航 | 91精品国产色综合久久不卡98口 | 粉嫩av在线播放 | 天堂资源地址在线 | 亚洲第一在线播放 | 最好看的中文字幕 | 免费a级黄色片 | 国产中文字幕av | 四虎国产精品永久在线国在线 | 天堂а√在线中文在线新版 | 成人动漫一区二区三区 | 污视频在线观看网址 | 91在线精品入口 | 激情视频一区二区三区 | 成人91 | 无码免费一区二区三区免费播放 | 成人性做爰aaa片免费看不忠 | 久久免费电影 | 日韩激情综合 | 69免费| 久久久老司机 | 毛片一级视频 | 国产免费成人在线视频 | 国产成人久久精品麻豆二区 | 亚洲啪啪免费视频 | 久久大陆| 色哟哟在线视频 | 性色浪潮av| 日韩欧美自拍偷拍 | 欧美人妻精品一区二区三区 | 九九热最新 | 蜜臀av88 | 精品一二三四 | mm131在线| 亚洲欧美强伦一区二区 | 岛国裸体写真hd在线 | 久久久午夜视频 | 日本在线免费视频 | 一区二区在线不卡 | 午夜激情视频在线观看 | 中文字幕第9页 | 国产色| 日本中文字幕不卡 | 成人免费国产 | 欧美精品啪啪 | 欧洲女女同性videoso | 国产一级美女 | 天天视频黄色 | 五月天久久综合 | 久久久亚洲欧洲 | 男人的天堂在线观看av | 久久r| 免费国产一区二区 | 久久国产福利一区 | 亚洲色图在线播放 | 色花堂在线 | 午夜影院男女 | 男女午夜爽爽爽 | 第四色视频 | 青青草综合网 | 国产一区视频在线观看免费 | 精品国产一区二区三区久久狼黑人 | av大片在线播放 | 免费啪视频在线观看 | 天堂网va| 亚洲经典视频在线观看 | 亚洲色图88 | 成人第一页 | 国产av电影一区二区三区 | 久久久一 | 色视频网 | 华人永久免费 | a在线免费观看 | 资源av| 女同在线视频 | 国产夫妻在线视频 | 日本熟伦人妇xxxx | 黄色片视频免费看 | 成人av综合网 | 亚洲成av人在线观看 | 啪啪精品 | 精久久|