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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 更改 uf_SQL经典实例(四)插入、更新和删除

發布時間:2025/1/21 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 更改 uf_SQL经典实例(四)插入、更新和删除 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

插入默認值

定義表的某些列的默認值:

create table D (id integer default 0);

所有的數據庫都支持使用default關鍵字來顯式地為某一列指定默認值:

insert into D values(default);

Oracle 8i數據庫及更早的版本不支持default關鍵字,因此沒辦法為某一列顯式地插入默認值。

如果所有的列都預設了默認值,MySQL允許制定一個空白的values列表為所有列創建預設的默認值:

MySQL

insert into D values();

如果數據表中某些列沒有設定默認值,而某些列設定了默認值,那么在插入數據的時候之喲啊不把預設了默認值的列寫入insert列表,就可以方便地為其插入默認值。考慮如下表:

create table DD (id integer default 0, foo varchar(10));

在insert列表中只指定foo列:

insert into DD (foo) values ('Bar');

也可以使用null值覆蓋默認值:

insert into DD (id, foo) values (null, 'Brighten');

復制數據到另一個表

insert into dept_east (deptno, dname, loc)

select deptno, dname, loc

from dept

where loc in ('NEW YORK', 'BOSTON');

注意在insert列表后沒有values關鍵字。

復制表定義

為DEPT表創建一個副本DEPT_2,但是只要表結構,不復制數據:

create table dept_2

as

select * from dept

where 1=0;

多表插入

Oracle可以使insert all或者insert first語法

Oracle

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;

insert all與insert first的區別就是:一旦WHEN-THEN-ELSE的結果為真,insert first會立即結束評估,insert all則會逐一評估所有的條件,而不論前面的測試結果是否為真,所以使用insert all可能把同一行數據插入到多個表中。

也就是說,當使用insert first時,如果滿足某一個when或else條件,判斷過程就會立即返回,不會再繼續評估其他判斷條件是否成立,保證每次過程都只有一條記錄插入到一張表中。

禁止插入特定列

如果想要阻止用戶或者錯誤的軟件應用程序在某些列中插入數據,可以創建一個視圖,只暴露那些你希望暴露的列,然后強制所有的insert語句都被傳送到該視圖。向一個簡單視圖插入數據,數據庫服務器會把它轉換為針對基礎表的插入操作。

例如,創建如下視圖:

create view new_emps as

select empno, ename, job

from emp;

執行下列插入語句

insert into new_emps (empno, ename, job)

values (1, 'Jonathan', 'Editor');

會被翻譯成:

insert into emp (empno, ename, job)

values (1, 'Jonathan', 'Editor');

當相關行存在時更新記錄

例如,如果一個員工出現在EMP_BONUS表中, 將他的工資(在EMP表中)上漲20%。

update emp

set sal = sal*1.2

where empno in (select empno from emp_bonus);

也可以使用exists關鍵字:

update emp

set sal = sal*1.2

where exists (select null

from emp_bonus

where emp.empno = emp_bonus.empno);

使用另一個表的數據更新記錄

MySQL & Oracle

update emp set (e.sal, e.comm) = (select ns.sal, ns.sal/2

from new_sal ns

where ns.deptno = e.deptno)

where exists (select null

from new_sal ns

where ns.deptno = e.deptno);

Oracle 更新內嵌視圖

update (

select e.sal as emp_sal, e.comm as emp_comm,

ns.sal as ns_sal, ns.sal/2 as ns_comm

from emp e, new_sal ns

where e.deptno = ns.deptno

) set emp_sal = ns_sal, emp_comm = ns_comm;

合并記錄

如果想根據相關記錄是否已經存在來插入、更新或刪除一個表的記錄,例如,如果記錄存在,則更新它,如果不存在,則插入一條新紀錄;如果更新之后的記錄不滿足某個條件,則刪除它。

考慮如下條件來修改emp_commission表:

1) 如果emp_commission表的員工數據在emp表里也存在相關記錄,則更新業務提成comm為1000;

2)對于所有可能會把comm列更新為1000的員工,如果他們的sal低于2000,則刪除相關記錄(他們不應該存在于emp_commission表中;

3)否則,就要從emp表中取出相應的empno,ename,deptno并插入到emp_commission表。

Oracle

merge into emp_commission ec

using (select * from emp) emp

on (ec.empno = emp.empno)

when matched then

update set ec.comm = 1000

delete where (sal < 2000)

when not matched then

insert (ec.empno, ec.ename, ec.deptno, ec.comm)

values (emp.empno, emp.ename, emp.deptno, emp.comm);

刪除違反參照完整性的記錄

想從表里刪除一些記錄,因為在另一個表里不存在與這些記錄相匹配的數據。例如,一些員工所屬的部門其實并不存在,你希望刪除這些員工。

delete from emp

where not exists (

select * from dept

where dept.deptno = emp.deptno;

);

或者

delete from emp

where deptno not in (select deptno from dept);

刪除重復記錄

考慮如下表dupes數據:

對于每一組重復的名字,你希望保留任意一個ID,并刪除其余的。

delete from dupes

where id not in (

select min(id) from dupes

group by name);

《SQL經典實例》第四章

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的mysql 更改 uf_SQL经典实例(四)插入、更新和删除的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。