3 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
我覺得你的主要潛在的困惑是,當(dāng)(例如)只A以紅色突出顯示,你正在做的是指“查詢只返回?cái)?shù)據(jù)來自A ”,但實(shí)際上它的意思是”查詢只返回?cái)?shù)據(jù)的那些情況下,A有記錄 ”。查詢可能仍包含從B.數(shù)據(jù)(有關(guān)情況B并沒有有記錄,查詢將取代NULL。)
同樣,下面的圖像僅包含來自B圈的數(shù)據(jù),那么為什么join語句中完全包含A?
如果您的意思是-圖像A完全是白色的,并且有一個(gè)紅色的月牙形,而該部分與B不重疊A,則:A查詢中出現(xiàn)的原因是,A它如何查找B需要的記錄被排除在外。(如果A未出現(xiàn)在查詢中,則維恩圖將沒有A,只會顯示B,并且無法將所需記錄與不需要的記錄區(qū)分開。)
圖像使圓B看起來像是sql語句的主要焦點(diǎn),但是sql語句本身通過以A開頭(從A選擇,然后聯(lián)接B)向我傳達(dá)了相反的印象,即A將成為焦點(diǎn)sql語句。
非常正確。因此,RIGHT JOINs比較少見。盡管使用a的查詢LEFT JOIN幾乎總是可以重新排序?yàn)槭褂胊 RIGHT JOIN的查詢(反之亦然),但通常人們會使用LEFT JOIN和而不使用來編寫查詢RIGHT JOIN。

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
我同意Cade所說的維恩圖的局限性??赡芨线m的視覺表示是這樣。
桌子
從交叉聯(lián)接B SQL小提琴中選擇A.顏色,B。顏色
交叉聯(lián)接(或笛卡爾乘積)使用兩個(gè)表中各行的每種組合產(chǎn)生結(jié)果。每個(gè)表有4行,因此結(jié)果產(chǎn)生16行。
從A.Colour = B.Colour SQL Fiddle的內(nèi)部聯(lián)接B中選擇A.Colour,B.Colour
內(nèi)部聯(lián)接在邏輯上返回交叉聯(lián)接中與聯(lián)接條件匹配的所有行。在這種情況下有五個(gè)。
從A.COLOR NOT IN(“綠色”,“藍(lán)色”)SQL小提琴中的內(nèi)部聯(lián)接B選擇A.Colour,B.Colour
內(nèi)部聯(lián)接條件不必一定是相等條件,也不必引用兩個(gè)表(甚至其中一個(gè)表)的列。A.Colour NOT IN ('Green','Blue')對交叉聯(lián)接的每一行進(jìn)行評估。
內(nèi)部聯(lián)接條件的條件1=1對于交叉聯(lián)接中的每一行都為true,因此兩者是等效的(SQL Fiddle)。
從A.Colour = B.Colour SQL Fiddle的左外連接B中選擇A.Colour,B.Colour
外部聯(lián)接以同樣的方式為內(nèi)進(jìn)行邏輯評估只是如果左表行(左連接)連接不從右手表都被保存在結(jié)果與任何行會合NULL的價(jià)值觀右手列。
從A.COLOUR = B.COLOUR的左外連接B中選擇A.Colour,B.Colour B.Colour IS NULL SQL Fiddle
這只是將先前的結(jié)果限制為僅返回其中的行B.Colour IS NULL。在這種特殊情況下,這些行將被保留,因?yàn)樗鼈冊谟覀?cè)表中不匹配,并且查詢返回表中不匹配的單個(gè)紅色行B。這稱為反半連接。
重要的是,為IS NULL測試選擇一列不可為空或連接條件可確保NULL排除任何值的列,以使此模式正確運(yùn)行,并避免僅帶回恰好具有該NULL值的行,這一點(diǎn)很重要列以及未匹配的行。
從A.Colour = B.Colour SQL Fiddle的正確外部聯(lián)接B中選擇A.Colour,B.Colour
右外部聯(lián)接的行為與左外部聯(lián)接類似,不同之處在于它們保留了來自右表的不匹配行,并且null擴(kuò)展了左手列。
從A.Colour = B.Colour SQL Fiddle的完整外部聯(lián)接B中選擇A.Colour,B.Colour
完全外部聯(lián)接將左右聯(lián)接的行為結(jié)合在一起,并保留左右表中不匹配的行。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
維恩圖適用于表示設(shè)置操作,例如UNION,INTERSECTS,EXCEPT等。
僅在使用EXFT等設(shè)置操作模擬LEFT JOIN WHERE rhs.KEY為NULL的情況下,此圖才是準(zhǔn)確的。
否則會產(chǎn)生誤導(dǎo)。例如,如果聯(lián)接條件不是1:1,則任何聯(lián)接都會導(dǎo)致行成倍增加。但是,只允許集合包含不同的成員,因此不能將它們表示為集合操作。
然后是CROSS JOIN或INNER JOIN ON = 1-這既不類似于此圖所示的INNER JOIN,也不可以通過維恩圖真正描述生成的集合。更不用說所有其他可能的三角連接,自連接和反連接,例如:
lhs INNER JOIN rhs ON rhs.VALUE < lhs.VALUE (triangular)
要么
SELF self1
INNER JOIN SELF self2
ON self2.key <> self1.key
AND self1.type = self2.type
(自我交叉和反加入以查找除您之外的所有相似家庭成員-self1和self2是同一集合,結(jié)果是一個(gè)適當(dāng)?shù)淖蛹?/p>
在本教程的前幾分鐘,堅(jiān)持對鍵進(jìn)行聯(lián)接可能會很好,但是這可能會導(dǎo)致學(xué)習(xí)聯(lián)接的含義很差。我認(rèn)為這就是您所發(fā)現(xiàn)的。
維恩圖通??梢杂眠@種方式表示JOIN的想法需要消失。
添加回答
舉報(bào)