日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美天天搞 | jizz日韩| 极品色综合 | 女人夜夜春 | 精品国产视频一区二区三区 | 国产网址 | 自拍偷拍2019| 泽村玲子在线 | 国产精品2 | 欧美八区 | 欧美大白屁股 | 亚洲最黄网站 | 久久精品国产网红主播 | av黄色在线播放 | 亚洲精品热| 国产午夜精品理论片在线 | 日韩美女国产精品 | 美女福利视频导航 | 两根大肉大捧一进一出好爽视频 | 黑人黄色一级片 | 国产成人一区二区 | 亚洲国内自拍 | 日韩狠狠操 | 午夜视频免费看 | 日产精品久久久 | 国产成人精品在线视频 | 97久久久久 | 亚洲在线| 五月婷婷婷婷 | 开心成人激情 | 国产人妖网站 | 可以直接在线观看的av | 香蕉精品在线 | 看av网站 | 2021av在线 | 一本色道久久综合狠狠躁的推荐 | 青青操免费在线视频 | 国产 日韩 欧美在线 | 亚洲欧洲色图 | 污污视频网站免费观看 | 国产精品麻豆欧美日韩ww | 冲田杏梨在线 | 日韩a级在线观看 | 五月婷婷亚洲 | 精品欧美激情精品一区 | 少妇被粗大猛进进出出s小说 | 国产学生美女无遮拦高潮视频 | 国产一区一区 | 永久黄网站色视频免费观看w | 97精品久久人人爽人人爽 | 91片看 | 亚洲国产免费视频 | 国产欧美在线视频 | 在线观看视频中文字幕 | 日本少妇videos高潮 | 操碰91| 日批网址 | 成年免费视频 | 欧美不卡二区 | 中文字幕有码无码人妻av蜜桃 | 色丁香婷婷综合久久 | 日韩欧美高清片 | 国产一区二区三区在线观看免费 | 欧美变态另类刺激 | 亚洲成人精品久久 | 97香蕉久久夜色精品国产 | 麻豆视频免费在线观看 | 亚洲av无码一区二区二三区 | 国产精品2019| 可以看的av网站 | 91桃色免费视频 | 香蕉久久夜色精品 | 91精品久久人妻一区二区夜夜夜 | 手机看片1024在线 | 女色婷婷| 国产综合视频一区二区 | 日本特级黄色大片 | 91丨国产丨白丝 | 日本韩国在线观看 | 成人精品一区二区三区四区 | 国产亚洲性欧美日韩在线观看软件 | 国产中文字幕网 | 一级黄色性生活视频 | av资源库| 精品成人无码一区二区三区 | 免费操人视频 | 特黄视频免费看 | 毛片毛片女人毛片毛片 | 西方裸体在线观看 | 操干视频| 黑鬼巨鞭白妞冒白浆 | 四川话毛片少妇免费看 | 亚洲免费一区视频 | 亚洲av无码一区二区三区人 | 国产精品热久久 | 亚洲视频在线看 | 日韩欧美一区二区在线 | 国产精品高清在线观看 | 国产男人的天堂 |