對於關係型數據庫來講,對於複雜的查詢錶鏈接是必不可少的,下面妹子就來介紹下表鏈接的方式html
Inner
指的是 intersect
相交,顧名思義就是取兩表的交集。git
SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63條*/ SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10條*/ /*inner-join*/ SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a INNER JOIN `b_borrow_deductions` AS b ON a.per_id=b.per_id;/*51條*/
表a有63條數據,表b有10條數據,兩表都有鍵值per_id,用INNER JOIN取交集爲51條
Outer
指的是 union
集合,就是取兩表的並集。
其中外鏈接分爲3種:github
full outer join 獲得兩表的乘集,也可叫作笛卡爾乘積。若是a表中的行在b表中沒有對應的部分,b的部分將是 null, 反之亦然。sql
SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63條*/ SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10條*/ /*full-outer-join*/ SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a JOIN `b_borrow_deductions` AS b /*630條*/
取兩表的乘集,則a表的行數乘以b表的行數,63*10=630(條)
左鏈接,取表a的全部行,和b表中匹配的值,沒有匹配的則以null值取代。數據庫
SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63條*/ SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10條*/ /*left-join*/ SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a LEFT JOIN `b_borrow_deductions` AS b ON a.per_id=b.per_id;/*63條*/
a表有63行,b表中鍵值per_id在a表中都有。
右鏈接,取表b的全部行,和a表中匹配的值,沒有匹配的則以null值取代。app
SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63條*/ SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10條*/ /*right-join*/ SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a RIGHT JOIN `b_borrow_deductions` AS b ON a.per_id=b.per_id;/*51條*/
b表有10行,a表中有重複鍵值per_id,因此有51條
Anti
指的是 英語詞根反對
的意思,與inner join
正好相反。
多用於!= not in 等查詢;若是找到知足條件(!= not in)的不返回,不知足條件(!= not in)的返回。ide
SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63條*/ SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10條*/ /*anti-join*/ SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a ,`b_borrow_deductions` AS b WHERE a.per_id!=b.per_id;/*579條*/
至關於a表與b表的乘級減去a表與b表的交集,即(63*10)-51=579條
半鏈接多在子查詢exists中使用,找到存在的鍵值以後就再也不查找內部其餘的鍵值了。ui
SELECT COUNT(a.per_id) FROM `b_borrow_list` AS a;/*63條*/ SELECT COUNT(b.per_id) FROM `b_borrow_deductions` AS b;/*10條*/ /*semi-join */ SELECT COUNT(a.`per_id`) FROM `b_borrow_list` AS a WHERE EXISTS( SELECT NULL FROM `b_borrow_deductions` AS b WHERE a.per_id=b.per_id)/*51條*/
是指一張大的事實表和多個小表關聯得出所需的數據,往四周發散,因此稱爲星型連接。
要使用星型轉換,必需要求初始化參數star_transforation_enabled
設爲TRUE。code
SELECT ... FROM really_big_fact f -- 50 million rows , dim1 d1 -- 50 rows , dim2 d2 -- 100 rows , dim3 d3 -- 10 rows , dim4 d4 -- 15 rows WHERE f.key1 = d1.key1 AND f.key2 = d2.key2 AND f.key3 = d3.key3 AND f.key4 = d4.key4
如今只有
Oracle
纔有
表連接的方式有:排序合併鏈接(Sort Merge join)、嵌套循環鏈接(Nested Logo join)、哈希鏈接(Mash join)、笛卡爾連接(Cross join)htm
Happy coding .. :)