常見sql陷阱
表字段說明及資料demo如下:
1、sum()求和:無資料時sum()是null,而不是0
有資料時,某一筆被sum的資料為null值沒有關係,依然可以正確sum
修正後的寫法,注意兩種nvl處理,nvl的位置不對也會導致結果為null
select sum(nvl(base_salary,0)), --×,結果依然為null
nvl(sum(base_salary),0) --√
from t_salary
where slip = '200812'
2、null值的參與的任何計算:計算結果後依然都是null
--將年月為201410 工號為1134807的績效上調1000(原本是null)
update t_salary
set performance_salary = performance_salary + 1000
where slip = '201410'
and idcard = '1134807'
--上調績效更新提交後再查詢資料
select * from t_salary
where slip = '201410'
and idcard = '1134807'
結果資料依然沒更新上去:
應該這樣寫:用nvl處理空值
update t_salary
set performance_salary = nvl(performance_salary,0) + 1000
where slip = '201410'
and idcard = '1134807'
3、
null值 不等同 空值' '
--①:結果為4
select count(*) from t_salary
where idcard in ('1234568','1156888','1134807') or idcard = ''; --'',空
--② :結果為5,t_salary表裡面實際也是5條資料
select count(*) from t_salary
where idcard in ('1234568','1156888','1134807') or idcard is null --null
4、
取第一條資料/前幾條資料:你是否在用order by 和 rownum=1 / rownum
特別說明:上面提供的demo中有2條slip=201308的資料,且item分別為1、2,其中item=2的先插入資料庫,再插入item=1的資料
--取202023年月裡面order by slip asc,item asc的第一筆資料
--×,很多人經常如下寫sql,order by排序然後以為rownum=1就是取的第一條想要的資料
sql應該如下這樣寫:
--先將查詢排序做為1個結果集,再從這個子查詢的結果集裡面再取rownum=1的資料,取得到才是按排序後的第一條資料
select * from
(select t_salary.* from t_salary
where slip='201308'
--and rownum = 1
order by slip asc,item asc
) where rownum = 1
--order by slip asc,item asc
5、
null、''、' ' 之間的區別
select * from t_salary where null = null; --×,與null比較應該使用 is 或 is not
select * from t_salary where null is null; --true
select * from t_salary where null is not null; --false
select * from t_salary where '' is null; --true, ''中間沒任何空格
select * from t_salary where '' is not null; --false,''中間沒任何空格
select * from t_salary where ' ' is null; --false,' '中間有乙個空格
select * from t_salary where ' ' is not null; --true, ' '中間有乙個空格
CRITICAL SECTION同步易出錯的地方
眾所周知通過critical section可以對多個執行緒同步,然而加鎖和解鎖的次數不匹配將導致死鎖 cpp view plain copy class clock clock void lock void unlock private critical section m cs cpp view...
Oracle SQL語言注意點
sql關鍵字不區分大小寫,既可以使用大寫格式,也可以使用小寫格式,或者大小寫格式混用。在使用子查詢時,還應注意以下規則 子查詢必須用括號括起來 子查詢中不能包括order by子句 子查詢允許巢狀多層,但不能超過255層 批量插入需要注意的是,insert into子句指定的列名可以與select子...
C 基礎中常見易混淆知識點
寫程式時經常遇到的幾個難以分辨的c 概念 1,include 與 include h 的區別 是從庫目錄中查詢,是從當前目錄 執行時目錄 開始查詢,一般情況下如果要包含自己寫的標頭檔案,是要用 的,2,在c 中class類,可以看做是一種特殊的結構體struct,在類的定義中,如果未指明成員型別,則...