SQL 内外连接
??????? 前兩天去一家公司面試筆試,技術部人員問到“SQL語句左聯接與內連接的區別”。記得上大學時。在學校做“實訓教學管理系統”中曾用過該語句,印象中,還和同組中同學有過爭吵(技術上)呢。?因此,當回答這道題時,很咄咄有詞,一口氣回答了下來,本以為都回答對了。可今天接到回復,復試名單中沒有我,很是失望,又得找工作了。仔細回想下當時面試和筆試的題目,今天特意驗證了下那天的那些題,才發現自己當時回答的很唐突片面。哎,經濟危機只是很小的一個原因,關鍵是自己學識短淺,沒有工作經驗和很強的能力。
?
如表 ?
? ------------------------------------------------- ?
? table1 | table2 | ?
? ------------------------------------------------- ?
? id name |id score | ?
? 1 lee |1 90 | ?
? 2 zhang |2 100 | ?
? 4 wang |3 70 | ?
? ------------------------------------------------- ?
? ?
? 以下均在查詢分析器中執行 ?
? ?
? 一、外連接 ?
? 1.概念:包括左向外聯接、右向外聯接或完整外部聯接 ?
? ?
? 2.左連接:left ? join ? 或 ? left ? outer ? join ?
? (1)左向外聯接的結果集包括 ? LEFT ? OUTER ? 子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值(null)。 ?
? (2)sql語句 ?
? select ? * ? from ? table1 ? left ? join ? table2 ? on ? table1.id=table2.id ?
? -------------結果------------- ?
? id name id score ?
? ------------------------------ ?
? 1 lee 1 90 ?
? 2 zhang 2 100 ?
? 4 wang NULL NULL ?
? ------------------------------ ?
? 注釋:包含table1的所有子句,根據指定條件返回table2相應的字段,不符合的以null顯示 ?
? ?
? 3.右連接:right ? join ? 或 ? right ? outer ? join ?
? (1)右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。 ?
? (2)sql語句 ?
? select ? * ? from ? table1 ? right ? join ? table2 ? on ? table1.id=table2.id ?
? -------------結果------------- ?
? id name id score ?
? ------------------------------ ?
? 1 lee 1 90 ?
? 2 zhang 2 100 ?
? NULL NULL 3 70 ?
? ------------------------------ ?
? 注釋:包含table2的所有子句,根據指定條件返回table1相應的字段,不符合的以null顯示 ?
? ?
? 4.完整外部聯接:full ? join ? 或 ? full ? outer ? join ? ?
? (1)完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。 ?
? (2)sql語句 ?
? select ? * ? from ? table1 ? full ? join ? table2 ? on ? table1.id=table2.id ?
? -------------結果------------- ?
? id name id score ?
? ------------------------------ ?
? 1 lee 1 90 ?
? 2 zhang 2 100 ?
? 4 wang NULL NULL ?
? NULL NULL 3 70 ?
? ------------------------------ ?
? 注釋:返回左右連接的union(見上左、右連接) ?
? ?
? 二、內連接 ?
? 1.概念:內聯接是用比較運算符比較要聯接列的值的聯接 ?
? ?
? 2.內連接:join ? 或 ? inner ? join ? ?
? ?
? 3.sql語句 ?
? select ? * ? from ? table1 ? join ? table2 ? on ? table1.id=table2.id ?
? -------------結果------------- ?
? id name id score ?
? ------------------------------ ?
? 1 lee 1 90 ?
? 2 zhang 2 100 ?
? ------------------------------ ?
? 注釋:只返回符合條件的table1和table2的列 ?
? ?
? 4.等價(與下列執行效果相同) ?
? A:select ? a.*,b.* ? from ? table1 ? a,table2 ? b ? where ? a.id=b.id ?
? B:select ? * ? from ? table1 ? cross ? join ? table2 ? where ? table1.id=table2.id ? ? (注:cross ? join后加條件只能用where,不能用on) ?
? ?
? 三、交叉連接(完全) ?
? ?
? 1.概念:沒有 ? WHERE ? 子句的交叉聯接將產生聯接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等于笛卡爾積結果集的大小。(table1和table2交叉連接產生3*3=9條記錄) ?
? ?
? 2.交叉連接:cross ? join ? (不帶條件where...) ?
? ?
? 3.sql語句 ?
? select ? * ? from ? table1 ? cross ? join ? table2 ?
? -------------結果------------- ?
? id name id score ?
? ------------------------------ ?
? 1 lee 1 90 ?
? 2 zhang 1 90 ?
? 4 wang 1 90 ?
? 1 lee 2 100 ?
? 2 zhang 2 100 ?
? 4 wang 2 100 ?
? 1 lee 3 70 ?
? 2 zhang 3 70 ?
? 4 wang 3 70 ?
? ------------------------------ ?
? 注釋:返回3*3=9條記錄,即笛卡爾積 ?
? ?
? 4.等價(與下列執行效果相同) ?
? A:select ? * ? from ? table1,table2??
?
[SQL腳本代碼轉自:http://323229113.blog.163.com/blog/static/2185362820070172553209/ ]
轉載于:https://www.cnblogs.com/GT_Andy/archive/2008/11/04/1922118.html
總結
- 上一篇: 显卡型号后缀详解
- 下一篇: 整理ASP.NET MVC 5各种错误请