我理解內連接,但當涉及到外連接時我感到困惑。困惑於左連接(簡單場景)
tbl2:
1
2
內連接:2行(I明白,2排在tbl1
與一個匹配 表1具有兩列如下所示:如下所示
tbl1:
1
1
表2具有兩排在tbl2
) 左外值加入:會是3行(所有在tbl1
和兩個表之間共用)
我理解內連接,但當涉及到外連接時我感到困惑。困惑於左連接(簡單場景)
tbl2:
1
2
內連接:2行(I明白,2排在tbl1
與一個匹配 表1具有兩列如下所示:如下所示
tbl1:
1
1
表2具有兩排在tbl2
) 左外值加入:會是3行(所有在tbl1
和兩個表之間共用)
當在左外右側的表或結果集JOIN已經然後匹配的值OUTER和INNER JOIN之間沒有區別。它是在你的榜樣的情況 - 你得到兩行 爲SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number
:
tbl1.number tbl2.number
1 1
1 1
但是你使用SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number
相同的結果。
不同之處在左外連接的左側 - 你說我想要tbl1
中的所有行,而不管tbl2
中是否有匹配的行。
所以,如果你tbl2
與DELETE FROM tbl2 WHERE number = 1
刪除第一行並運行內蒙古命令JOIN SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.number=tbl2.number
- 你得到0記錄,因爲沒有匹配的記錄tbl2
。
如果你再運行SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.number=tbl2.number
,您可以:
tbl1.number tbl2.number
1 NULL
1 NULL
感謝您花時間回覆,清除了我所困惑的內容。 – Deepthi 2014-11-08 16:12:04
下面是一個例子使用SQLite:
sqlite> create table tbl1(value int);
sqlite> insert into tbl1 values(1);
sqlite> insert into tbl1 values(1);
sqlite> create table tbl2(value int);
sqlite> insert into tbl2 values(1);
sqlite> insert into tbl2 values(2);
如果tbl2
被上tbl1
左加入,你會得到兩個結果:
sqlite> SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.value = tbl2.value;
1|1
1|1
這是因爲tbl1
是「左」表,因此將包括來自tbl1
的每一行,無論它是否在tbl2
中匹配。到tbl2
如果tbl1
是左加入,你會得到三種結果:
sqlite> SELECT * FROM tbl2 LEFT JOIN tbl1 ON tbl1.value = tbl2.value;
1|1
1|1
2|
這是因爲:
tbl2
每一行都將包括,是否存在是tbl1
的匹配tbl2
中的行可能與tbl1
中的多行匹配。在這種情況下,tbl2
有兩行用火柴在tbl1
加一行不匹配,從而導致三個總。
感謝您花時間回覆,這有助於理解這一概念。 – Deepthi 2014-11-08 16:15:09
請更好地解釋你的例子。使用列名稱和值,以便具有相同疑問的其他用戶可以理解您的問題。同樣爲了您得到正確的答案,您需要提出正確的問題。 – antorqs 2014-11-08 15:45:27
你應該改進和澄清你的例子,但它看起來像你的例子,你會得到與內部連接相同的結果。 – grin0048 2014-11-08 15:47:12
這是我面試問題的一部分,我在上面給出了兩個表格,並被要求解釋我將作爲所有類型連接的輸出獲得的行數。 – Deepthi 2014-11-08 16:00:02