SQL高階之三值邏輯與NULL

2021-10-24 14:11:30 字數 2924 閱讀 6219

普通語言裡的布林型只有 true 和 false 兩個值,即二值邏輯;sql中有 true、false 和 unknown,即三值邏輯;

關係模型並不是描述現實世界的模型,而是描述人類認知狀態的核心(知識)的模型,我們有限且不完備的知識也會直接反映在表裡;

三值邏輯優先順序:

q:為什麼where co l_1 = null 會出錯?

a:null不是值,只是乙個「沒有值」的標記,需要用where col_1 is null

select

*from tbl_a where col_1 =

null

;-- 結果為空

select

*from tbl_a where col_a is

null

;

q:排中律在sql中是否成立?(排中律:乙個人年齡要麼等於20,要麼不等於20)

a:在sql中,排中律不存在

select

*from students

where age =

20or age <>20;

-- 無法查詢出年齡為null的學生

q:case表示式中,null應該怎麼寫?

a:搜尋表示式 + is null

case col_1

when

1then

'〇'when

null

then

'x'-- 表示式為 col_1 = null,結果為空

end;

case

when col_1 =

1then

'〇'when col_1 is

null

then

'x'end

;

create

table class_a

(name varchar(16

)primary

key,

age integer

, city varchar(16

)not

null);

create

table class_b

(name varchar(16

)primary

key,

age integer

, city varchar(16

)not

null);

insert

into class_a values

('布朗',22

,'東京');

insert

into class_a values

('拉里',19

,'埼玉');

insert

into class_a values

('伯傑',21

,'千葉');

insert

into class_b values

('齊藤',22

,'東京');

insert

into class_b values

('田尻',23

,'東京');

insert

into class_b values

('山田'

,null

,'東京');

insert

into class_b values

('和泉',18

,'千葉');

insert

into class_b values

('武田',20

,'千葉');

insert

into class_b values

('石川',19

,'神奈川'

);

q:查詢「與b班住在東京的學生年齡不同的a班學生」,即「拉里」和「伯傑」

a:不能用not in

-- not in:結果為空

select

*from class_a

where age notin(

select age

from class_b as b

where b.city =

'東京');

-- not exists:不受null影響

select

*from class_a as a

where

notexists

(select

*from class_b as b

where a.age = b.age

and b.city =

'東京'

);

q:any相當與in;all和比較謂語聯用表示「與所有的xx都相等」、「比所有的xx都大」,若遇到null

a:若any、all遇到null,查詢結果永遠為空

select

*from class_a as a

where age <

all(

select age

from class_b as b

where b.city =

'東京'

);

q:max和比較謂語聯用表示「比***裡最大的更大」,若遇到null

a:極值函式只對非null起作用

select

*from class_a as a

where age <

(select

min(age)

from class_b

where city =

'東京'

);

mick[日] 《sql高階教程》 ↩︎

js高階之三 this指向

本文不考慮嚴格模式 錯誤之處感謝提出,請勿噴 function 函式 this 指向一共有4種規則 預設繫結,隱式繫結,顯式繫結,new繫結 預設繫結 function fn var a 1 fn a 1 fn在沒有任何修飾的被呼叫,只能使用預設繫結 this指向了直接呼叫的window 隱式繫結 ...

三值邏輯討論

習慣上我們在應用系統中一直使用兩值邏輯 非 true 即false 兩值邏輯的運算體系已經相當成熟,與 或 非以及衍生的異或 與非等等。但是在實際應用中,我們會有機會遇到三值邏輯。三值邏輯通常包含可選的 true false null 如何在完備的兩值邏輯運算體系中加入這個 null 使之滿足我們的...

Spring實戰之三 高階裝配

primary和 component組合使用,宣告該bean在自動掃瞄時為首選bean,在遇到歧義時首先使用首選bean autowired inject 和 qualifier配合使用,在注入時指定要注入進去的是哪個bean,如 qualifier icecream 表明注入id 確切地講是限定符...