數據庫的左連接,右連接問題

數據庫的左連接,右連接問題

 

前一階段經歷了幾次程序員的面試,發現數據庫這個部分佔了很大的比重。而左連接,右連接又是很多人問的重點,當初我就是不太明白怎麼一回事,所以吃了幾次的虧。今天把專門作了一次關於左連接和右連接的文章,鞏固一下知識:
要點:left join,right join,inner join
首先有如下兩個表:
Student:

ID(int)
 Name(nvarchar)
 
1    a
 
2     b
 
3     c
 
4     d
 
5     e
 
6     f
 

Quiz:

ID(int)
 score(int)
 
1   60
 
2   70
 
4   80
 
6  90
 
8   100
 
9    30
 

內連接:(inner join)包括連接表的匹配行
select Student.Name,Quiz.score from Quiz inner join Student on Student.ID=Quiz.ID

Name
 score
 
a    60
 
b    70
 
d    80
 
f     90
 

左連接:(left join)包括連接表匹配行以及左連接表的所有行
select Student.Name,Quiz.score from Student left join Quiz on Student.ID=Quiz.ID

Name
 score
 
a
 60
 
b
 70
 
c
 null
 
d
 80
 
e
 null
 
f
 90
 

右連接:(right join)結果包括連接表的匹配行以及右連接表的所有行
select Student.Name,Quiz.score from Student right join Quiz on Student.ID=Quiz.ID

Name
 score
 
a
 60
 
b
 70
 
d
 80
 
f
 90
 
null
 100
 
null
 30
 

當然,也可以看出左連接也可以寫成右連接的形式:
select Student.Name,Quiz.score from Student right join Quiz on Student.ID=Quiz.ID等價於
select Student.Name,Quiz.score from Quiz left join Student on Student.ID=Quiz.ID

 

 

使用外聯接

僅當至少有一個同屬於兩表的行符合聯接條件時,內聯接才返回行。內聯接消除與另一個表中的任何行不匹配的行。而外聯接會返回 FROM 子句中提到的至少一個表或視圖的所有行,只要這些行符合任何 WHERE 或 HAVING 搜索條件。將檢索通過左向外聯接引用的左表的所有行,以及通過右向外聯接引用的右表的所有行。完整外部聯接中兩個表的所有行都將返回。

Microsoft® SQL Server™ 2000 對在 FROM 子句中指定的外聯接使用以下 SQL-92 關鍵字:

·                         LEFT OUTER JOIN 或 LEFT JOIN

·                         RIGHT OUTER JOIN 或 RIGHT JOIN

·                         FULL OUTER JOIN 或 FULL JOIN

SQL Server 支持 SQL-92 外聯接語法,以及在 WHERE 子句中使用 *= 和 =* 運算符指定外聯接的舊式語法。由於 SQL-92 語法不容易產生歧義,而舊式 Transact-SQL 外聯接有時會產生歧義,因此建議使用 SQL-92 語法。

使用左向外聯接

假設在 city 列上聯接 authors 表和 publishers 表。結果只顯示在出版商所在城市居住的作者(本例中爲 Abraham Bennet 和 Cheryl Carson)。

若要在結果中包括所有的作者,而不管出版商是否住在同一個城市,請使用 SQL-92 左向外聯接。下面是 Transact-SQL 左向外聯接的查詢和結果:

USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors a LEFT OUTER JOIN publishers p

   ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

下面是結果集:

au_fname             au_lname                       pub_name         

-------------------- ------------------------------ -----------------

Reginald             Blotchet-Halls                 NULL

Michel               DeFrance                       NULL

Innes                del Castillo                   NULL

Ann                  Dull                           NULL

Marjorie             Green                          NULL

Morningstar          Greene                         NULL

Burt                 Gringlesby                     NULL

Sheryl               Hunter                         NULL

Livia                Karsen                         NULL

Charlene             Locksley                       NULL

Stearns              MacFeather                     NULL

Heather              McBadden                       NULL

Michael              O'Leary                        NULL

Sylvia               Panteley                       NULL

Albert               Ringer                         NULL

Anne                 Ringer                         NULL

Meander              Smith                          NULL

Dean                 Straight                       NULL

Dirk                 Stringer                       NULL

Johnson              White                          NULL

Akiko                Yokomoto                       NULL

Abraham              Bennet                         Algodata Infosystems

Cheryl               Carson                         Algodata Infosystems

 

(23 row(s) affected)

不管是否與 publishers 表中的 city 列匹配,LEFT OUTER JOIN 均會在結果中包含 authors 表的所有行。注意:結果中所列的大多數作者都沒有相匹配的數據,因此,這些行的 pub_name 列包含空值。

使用右向外聯接

假設在 city 列上聯接 authors 表和 publishers 表。結果只顯示在出版商所在城市居住的作者(本例中爲 Abraham Bennet 和 Cheryl Carson)。SQL-92 右向外聯接運算符 RIGHT OUTER JOIN 指明:不管第一個表中是否有匹配的數據,結果將包含第二個表中的所有行。

若要在結果中包括所有的出版商,而不管城市中是否還有出版商居住,請使用 SQL-92 右向外聯接。下面是 Transact-SQL 右向外聯接的查詢和結果:

USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a RIGHT OUTER JOIN publishers AS p

   ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

下面是結果集:

au_fname             au_lname                 pub_name            

-------------------- ------------------------ --------------------

Abraham              Bennet                   Algodata Infosystems

Cheryl               Carson                   Algodata Infosystems

NULL                 NULL                     Binnet & Hardley

NULL                 NULL                     Five Lakes Publishing

NULL                 NULL                     GGG&G

NULL                 NULL                     Lucerne Publishing

NULL                 NULL                     New Moon Books

NULL                 NULL                     Ramona Publishers

NULL                 NULL                     Scootney Books

 

(9 row(s) affected)

使用謂詞(如將聯接與常量比較)可以進一步限制外聯接。下例包含相同的右向外聯接,但消除銷售量低於 50 本的書籍的書名:

USE pubs

SELECT s.stor_id, s.qty, t.title

FROM sales s RIGHT OUTER JOIN titles t

   ON s.title_id = t.title_id

   AND s.qty > 50

ORDER BY s.stor_id ASC

下面是結果集:

stor_id qty    title                                                    

------- ------ ---------------------------------------------------------

(null) (null) But Is It User Friendly?                                  

(null) (null) Computer Phobic AND Non-Phobic Individuals: Behavior

            Variations                 

(null) (null) Cooking with Computers: Surreptitious Balance Sheets      

(null) (null) Emotional Security: A New Algorithm                       

(null) (null) Fifty Years in Buckingham Palace Kitchens                 

7066   75     Is Anger the Enemy?                                       

(null) (null) Life Without Fear                                         

(null) (null) Net Etiquette                                             

(null) (null) Onions, Leeks, and Garlic: Cooking Secrets of the

            Mediterranean                 

(null) (null) Prolonged Data Deprivation: Four Case Studies             

(null) (null) Secrets of Silicon Valley                                 

(null) (null) Silicon Valley Gastronomic Treats                         

(null) (null) Straight Talk About Computers                             

(null) (null) Sushi, Anyone?                                            

(null) (null) The Busy Executive's Database Guide                       

(null) (null) The Gourmet Microwave                                     

(null) (null) The Psychology of Computer Cooking                        

(null) (null) You Can Combat Computer Stress!                           

 

(18 row(s) affected)

有關謂詞的更多信息,請參見 WHERE。

使用完整外部聯接

若要通過在聯接結果中包括不匹配的行保留不匹配信息,請使用完整外部聯接。Microsoft® SQL Server™ 2000 提供完整外部聯接運算符 FULL OUTER JOIN,不管另一個表是否有匹配的值,此運算符都包括兩個表中的所有行。

假設在 city 列上聯接 authors 表和 publishers 表。結果只顯示在出版商所在城市居住的作者(本例中爲 Abraham Bennet 和 Cheryl Carson)。SQL-92 FULL OUTER JOIN 運算符指明:不管表中是否有匹配的數據,結果將包括兩個表中的所有行。

若要在結果中包括所有作者和出版商,而不管城市中是否有出版商或者出版商是否住在同一個城市,請使用完整外部聯接。下面是 Transact-SQL 完整外部聯接的查詢和結果:

USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors a FULL OUTER JOIN publishers p

   ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

下面是結果集:

au_fname             au_lname                     pub_name            

-------------------- ---------------------------- --------------------

Reginald             Blotchet-Halls               NULL

Michel               DeFrance                     NULL

Innes                del Castillo                 NULL

Ann                  Dull                         NULL

Marjorie             Green                        NULL

Morningstar          Greene                       NULL

Burt                 Gringlesby                   NULL

Sheryl               Hunter                       NULL

Livia                Karsen                       NULL

Charlene             Locksley                     NULL

Stearns              MacFeather                   NULL

Heather              McBadden                     NULL

Michael              O'Leary                      NULL

Sylvia               Panteley                     NULL

Albert               Ringer                       NULL

Anne                 Ringer                       NULL

Meander              Smith                        NULL

Dean                 Straight                     NULL

Dirk                 Stringer                     NULL

Johnson              White                        NULL

Akiko                Yokomoto                     NULL

Abraham              Bennet                       Algodata Infosystems

Cheryl               Carson                       Algodata Infosystems

NULL                 NULL                         Binnet & Hardley

NULL                 NULL                         Five Lakes Publishing

NULL                 NULL                         GGG&G

NULL                 NULL                         Lucerne Publishing

NULL                 NULL                         New Moon Books

NULL                 NULL                         Ramona Publishers

NULL                 NULL                         Scootney Books

 

(30 row(s) affected)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章