需求
有一個部門的表(dept),
- 部門編號(deptno)
- 部門員工數(emps)
- 部門員工的總工資(income)
還有一個員工表(emp)
- 員工編號(empid)
- 所屬部門(deptno)
- 工資(sal)
要求更新部門員工數和總工資數。
代碼
1.
update dept
set(emps,income)=(
select count(empid),sum(sal)
from emp
where emp.deptno=dept.deptno
);
這樣整個表都會更新。
假設有這樣一個情況,公司有一個極其神祕的部門‘’混分小分隊‘’,部門人數和部門收入都有值。但爲了保護員工信息,員工表裏面就沒有該部門 的任何信息。
那上述查詢後,這個部門的值會被置爲空。
2.
那如何搞呢?
利用另外一張表更新本表:(表1中有值,但表2中沒有值,則不做修改)
update 表1 set 列名=(select 列名 from 表2 where 表1.列名=表2.列名)
where exists (select 1 from 表2 where 表1.列名=表2.列名)
按葫蘆畫瓢:
update dept
set(emps,income)=(
select count(empid),sum(sal)
from emp
where emp.deptno=dept.deptno
)
where exists (select 1 from emp where emp.deptno=dept.deptno)
這種情況就能解決。它只更新員工的部門編號和部門的部門編號相對應的情況,不一致的情況就不更新,比如‘’混分小分隊‘’部門就沒有更新。
select 1 from 表名
與select * from 表名
作用上來說是沒有差別的,都是查看是否有記錄。但前者效率更高- 用exists代替in可以提高sql語句的執行效率
那麼,代碼select 1 from emp where emp.deptno=dept.deptno
的意思是:
在emp表中,找出emp.deptno=dept.deptno的行,作爲查詢結果,然後select 1
,即把這些具體的值變爲1.
查詢結果的行數沒有變,只有一列的值,都是1.
所以select 1
不涉及到具體的數值就可以查看是否有記錄,效率更高一些。
參考:https://www.cnblogs.com/kangkaii/p/8419088.html