錶鏈接類型

前言

對於關係型數據庫來講,對於複雜的查詢錶鏈接是必不可少的,下面妹子就來介紹下表鏈接的方式html

內鏈接(Inner Join)

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 Join)

Outer指的是 union集合,就是取兩表的並集
其中外鏈接分爲3種:github

Full outer join

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(條)

Left join

左鏈接,取表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表中都有。

Right join

右鏈接,取表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 Join)

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條

半鏈接(Semi Join)

半鏈接多在子查詢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 Join)

是指一張大的事實表和多個小表關聯得出所需的數據,往四周發散,因此稱爲星型連接。
要使用星型轉換,必需要求初始化參數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 .. :)

相關文章
相關標籤/搜索