常見Oracle SQL易出錯點

2021-06-29 10:22:08 字數 2960 閱讀 3552

常見sql陷阱

表字段說明及資料demo如下:

1sum()求和:無資料時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'

2null值的參與的任何計算:計算結果後依然都是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,在類的定義中,如果未指明成員型別,則...