SQL基础操作_4_表的插入、更新、删除、合并操作
目錄
?表的插入、更新、刪除、合并操作
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; GOOracle:
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:
| deptno | dname | loc |
| 50 | Production | Beijing |
Oracle:
? ? 執(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.empnoMysql:
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 |
執(zhí)行更新后:
| empno | ename | sal |
| 7369 | SMITH2 | 1500.00 |
Sql Server:
執(zhí)行更新前:
| Empno | ename | sal |
| 7369 | SMITH | 800.00 |
執(zhí)行更新后:
| empno | ename | sal |
| 7369 | SMITH2 | 1500.00 |
Mysql:
執(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 TRANMySQL:
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 TRANMysql:
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:
執(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:
執(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青云申购是什么股票
- 下一篇: 337调查和反倾销调查有哪些区别?对外国