sql not in 的坑及改寫為join

2022-02-21 11:32:59 字數 3282 閱讀 2003

/*我們接著用上次建的兩個表。資料如下*/

sql> select * from l;

str   v

left_1 1

left_2 2

left_3 3

left_4 4

sql> select * from r;

str    v

right_3 3

right_4 4

right_5 5

right_6 6

/*如果要返回l表中有而r表為沒有的資料(v=1、2),那麼用not in寫應該如下*/

sql> select * from l where v not in(select r.v from r);

str   v

left_1 1

left_2 2

/*如果r表中v有空值呢*/

sql> insert into r values(null,null);

1 row inserted

/*結果集返回錯誤*/

sql> select * from l where v not in(select r.v from r);

str   v

/*這時要增加條件 r.v is not null*/

sql> select * from l where v not in(select r.v from r where r.v is not null);

str   v

left_1 1

left_2 2

/*not exists語句不受null影響,因為not exists中是等值關係*/

sql> select * from l where not exists(selectnull from r where r.v = l.v);

str   v

left_1 1

left_2 2

/*以上兩種都叫反聯接,也可以用join改寫解析如下*/

sql> select l.*,r.* from l left join ron l.v = r.v order by 2;

str   v str     v

left_1 1        

left_2 2        

left_3 3 right_3 3

left_4 4 right_4 4

/*如上所示,l中有,而r中沒有的,就是r.v為空的行,那麼加上這個條件後,返回的就是所需資料了*/

sql> select l.* from l left join r onl.v = r.v where r.v is null order by 2;

str   v

left_1 1

left_2 2

/*如果能前的(+)寫法,應該如下,為了便於理解,我們仍分步執行來看*/

sql> select left_str,left_v from (selectl.str as left_str,l.v as left_v,r.str as right_str,r.v as right_v from l,rwhere l.v = r.v(+) order by 2);

left_str left_v

left_1  1

left_2  2

left_3  3

left_4  4

sql> select left_str,left_v from (selectl.str as left_str,l.v as left_v,r.str as right_str,r.v as right_v from l,rwhere l.v = r.v(+)) where right_v is null orderby 2;

left_str left_v

left_1  1

left_2  2

/*簡化後,語句如下*/

sql> select l.* from l,r where l.v =r.v(+) and r.v is null order by 2;

str   v

left_1 1

left_2 2

/*有人把這兩種弄混了,寫為*/

select l.* from l left join r on (l.v =r.v) and r.v is null order by 2;

/*那麼我們把兩個表的資料都返回,看結果*/

sql> select l.*,r.* from l left join ron (l.v = r.v) and r.v is null order by 2;

str   v str     v

left_1 1        

left_2 2        

left_3 3        

left_4 4        

/*以上這句整理一下就是*/

sql> select l.*,r.* from l left join(select * from r where r.v is null)r on (l.v =r.v) order by 2;

str   v str     v

left_1 1        

left_2 2        

left_3 3        

left_4 4

/*相當於是l與一空行join了*/

sql> select * from r where r.v is null;

str    v

sql>

/*對join的方法引申一部,改為full join*/

sql> select l.*,r.* from l full join ron l.v = r.v order by 2,4;

str   v str     v

left_1 1        

left_2 2        

left_3 3 right_3 3

left_4 4 right_4 4

right_5 5

right_6 6

7 rows selected

sql>

/*看上述結果,對別對應l.v為空,與r.v為空就是兩個表不匹配的行*/

sql> select l.*,r.* from l full join ron l.v = r.v where (l.v is null or r.v is null)order by 2,4;

str   v str     v

left_1 1        

left_2 2        

right_5 5

right_6 6

sql>

ElasticSearch安裝及執行的坑

寫文章 sam dragon 發表於cnblogs訂閱 158 2.用 tar zxvf 解壓包 3.增加乙個elk使用者,elasticsearch7不可用root使用者執行 4.新建使用者必須要用 chown r 使用者名稱 資料夾 進行許可權分配 1 max file descriptors ...

iOS UISwitch縮放及布局的坑

如題,應設計要求,預設的switch大小不符合設計要求,所以對switch進行了縮放,方法如下 switch.transfrom cgaffinetransformmakescale 0.863,0.863 如上 大小縮放為了原來尺寸的0.863倍。but.坑來了 switch是放在cell中右側,...

pagehelper的使用及避坑

pagehelper是乙個非常簡單實用的分頁外掛程式,但是還是有乙個小坑在裡面的,話不多說,直接上乾貨。pageinfo pageinfo pagehelper.startpage pagenum,pagesize doselectpageinfo query 引數說明 pagenum 第幾頁 pa...