SQL經典例項(四)插入 更新和刪除

2021-09-13 02:55:07 字數 4621 閱讀 7553

定義表的某些列的預設值:

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列表後沒有values關鍵字。

為dept表建立乙個副本dept_2,但是只要表結構,不複製資料:

create table dept_2

asselect * 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,並刪除其餘的。

《sql經典例項》第四章

SQL學習(2) 插入,更新和刪除

一 資料插入insert 1.簡單插入 insert into aa values a b null 有幾個值就必須寫幾個值 insert into aa id,name,code values a b null 可以插入特定列的值,使用這個語法要求,這些被忽略的特定列是可以為null,或者有預設值...

sql更新和刪除

update 語句 update 語句用於修改表中的資料。語法 update 表名稱 set 列名稱 新值 where 列名稱 某值 person lastname firstname address city gates bill xuanwumen 10 beijing wilson champ...

SQL的更新和刪除

1 sql更新資料 示例 update table name set some column some value other column other value where unique column unique value 上述示例示更新指定行,若想更新所有的行,那麼去掉where子句即可。...