標籤:使用 amp sql 測試 查詢 比較 modifier exp test
一.IN && NOT IN
WHERE expression IN (subquery)
右邊圓括弧內是返回一個欄位的子查詢結果集,左邊的運算式(或欄位)對查詢結果每一行進行一次運算和比較,如果結果集中存在相等的行,則IN結果為‘TRUE‘,否則為‘FALSE‘;
WHERE expression NOT IN (subquery)
NOT IN與IN正相反,如果結果集中不存在相等的行結果為‘TRUE‘,否則為‘FALSE‘。
測試表:
test=# \d tbl_test Table "public.tbl_test" Column | Type | Modifiers --------+---------+----------- f | integer | test=# \d tbl_insert Table "public.tbl_insert" Column | Type | Modifiers --------+-----------------------+----------- a | integer | b | integer | c | character varying(12) | test=# select * from tbl_test ; f ---
1
3
5(3 rows)test=# select * from tbl_insert; a | b | c ---+---+-------| 1 | 11| 2 | 22| 3 | 33| 4 | 44| 5 | 51| 6 | 1| 6 | 61| 6 | 661| 7 | 3%1| 8 | 3%_1| 8 | 3_%_1| 7 | abc| 7 | ABc| 7 | aBC(14 rows)
樣本1.查詢tbl_insert表,且a欄位值在tbl_test表欄位f中的行
test=# select * from tbl_insert where a in (select f from tbl_test); a | b | c ---+---+----| 1 | 11| 3 | 33| 5 | 51(3 rows)
樣本2.查詢tbl_insert表,且a欄位值比tbl_test表欄位f小1的行
test=# select * from tbl_insert where a+1 in (select f from tbl_test); a | b | c ---+---+----| 2 | 22| 4 | 44(2 rows)
樣本3.查詢tbl_insert表,且a欄位值不在tbl_test表欄位f中的行
test=# select * from tbl_insert where a not in (select f from tbl_test); a | b | c ---+---+-------| 2 | 22| 4 | 44| 6 | 1| 6 | 61| 6 | 661| 7 | 3%1| 8 | 3%_1| 8 | 3_%_1| 7 | abc| 7 | ABc| 7 | aBC(11 rows)
樣本4.查詢tbl_insert表,且a欄位值等於5或7的行
test=# select * from tbl_insert where a in (5,7); a | b | c ---+---+-----| 5 | 51| 7 | 3%1| 7 | abc| 7 | ABc| 7 | aBC(5 rows)
二.EXISTS && NOT EXISTS
WHERE EXISTS (subquery)
括弧內同樣是一個子查詢,如果子查詢有返回結果,則EXISTS結果為‘TRUE‘,否則為‘FALSE‘。
WHERE NOT EXISTS(subquery)
NOT EXISTS與EXISTS正好相反,如果子查詢沒有返回結果,為‘TRUE‘,否則‘FALSE‘。
樣本1.查詢tbl_insert表,且a欄位值在tbl_test表欄位f中的行
test=# select * from tbl_insert where exists (select null from tbl_test where tbl_test.f=tbl_insert.a); a | b | c ---+---+----| 1 | 11| 3 | 33| 5 | 51(3 rows)
樣本2.查詢tbl_insert表,且a欄位值不在tbl_test表欄位f中的行
test=# select * from tbl_insert where not exists (select null from tbl_test where tbl_test.f=tbl_insert.a); a | b | c ---+---+-------| 2 | 22| 4 | 44| 6 | 1| 6 | 61| 6 | 661| 7 | 3%1| 8 | 3%_1| 8 | 3_%_1| 7 | abc| 7 | ABc| 7 | aBC(11 rows)
PS:NOT IN的效率非常低,如果可以的話建議使用NOT EXISTS。
postgresql----IN&&EXISTS