資料分析系列 1532 | MySQL連線查詢三板斧

資料分析系列 15/32 | MySQL連線查詢三板斧

前面我們學習了MySQL的一些查詢,但是都是針對一個表進行查詢,當我們查詢的表大於1個,則稱為連線查詢。連線查詢是關係資料庫中重要的查詢方式,包括交叉連線、內連線、和外連線。

資料分析系列 15/32 | MySQL連線查詢三板斧

PART

01

交叉連線

交叉連線(CROSS JOIN)

又稱笛卡爾積,即把一張表的每一行與另一張表的每一行連線起來,返回兩張表的每一行相連線後所有可能的搭配結果,其連線的結果會產生一些沒有意義的記錄,所以這種查詢實際很少使用。

交叉連線SQL語法:

SELECT * FROM 表1 CROSS JOIN 表2;或SELECT * FROM 表1 , 表2;#查詢學生表與成績表的交叉連線SELECT * FROM tb_student CROSS JOINtb_score;SELECT * FROM tb_student, tb_score;

說明:交叉連線返回的查詢結果集的記錄行數等於其所連線的兩張表記錄行數的乘積,例如tb_student表有10條記錄,tb_score有10條記錄,這兩張表交叉連線後結果集的記錄行數是10*10=100條。因此,對於存在大量資料的表,應該避免使用交叉連線。

資料分析系列 15/32 | MySQL連線查詢三板斧

PART

02

內連線

內連線(INNER JOIN)

透過在查詢中設定連線條件來移除交叉連線查詢結果集中某些資料行。即在內連線查詢中,只有滿足條件的記錄才能出現在結果集中。

內連線的SQL語法形式有兩種:

#1)使用INNER JOIN的顯式語法結構SELECT 目標列1, 目標列2, 。。。, 目標列nFROM table1 [INNER] JOIN table2ON 連線條件[WHERE 過濾條件];#2)使用WHERE子句定義連線條件的隱式語法結構:SELECT 目標列1, 目標列2, 。。。, 目標列nFROM table1, table2WHERE 連線條件 [AND 過濾條件];

上面兩種表示形式的差別在於:使用INNER JOIN 連線後,FROM子句中的ON子句可用來設定連線表的連線條件,而其他過濾條件則可以在SELECT語句中的WHERE子句中指定,而使用WHERE子句定義連線條件的形式,表與表之間的連線條件和查詢時的過濾條件均在WHERE子句中指定。

1、等值與非等值連線

連線查詢中用來連線兩個表的條件稱為連線條件,一般形式為:

[<表1>。]<欄位名> <比較運算子> [<表2>。]<欄位名>

比較運算子主要有:=、>、<、>=、<=、!=(<>),“=”表示等值連線,其他都是非等值連線。

#查詢每個學生選修課程的情況。SELECT tb_student。*, tb_score。* FROM tb_student,tb_score WEHRE tb_student。studentNo = tb_score。studentNo;SELECT tb_student。*, tb_score。* FROM tb_studentINNER JOIN tb_score ON tb_student。studentNo = tb_score。studentNo;#查詢管理學院全體同學的學號、姓名、籍貫、班級編號和所在班級名稱。SELECT studentNo, studentName, native,tb_student。classNo, className FROM tb_student, tb_classWEHRE tb_student。classNo = tb_class。classNoAND department=’管理學院’;SELECT studentNo, studentName, native, tb_student。classNo,className FROM tb_student JOIN tb_class ON tb_student。classNo= tb_class。classNoWHERE department=’管理學院’;

PS。由於內連線系統預設的表連線,因而在FROM子句中可以省略關鍵字INNER,而只用關鍵字JOIN連線表。

#查詢選修了課程名稱為“程式設計”的學生學號、姓名、和成績。SELECT a。studentNo, studentName, score FROM tb_student AS a, tb_course AS b,tb_score cWEHRE a。 studentNo = c。 studentNo ANDb。courseNo = c。courseNoAND courseName=’程式設計’;或SELECT a。studentNo, studentName, scoreFROM tb_student AS a JOIN tb_course b JOINtb_score cON a。 studentNo = c。 studentNo ANDb。courseNo = c。courseNoWHERE courseName=’程式設計’;

PS。可以看到,使用INNER JOIN實現多個表的內連線時,需要在FROM子句的多個表之間連續使用INNER JOIN或JOIN。

同時上面我們使用了表的別名,具體內容見這篇文章。

SQL查詢中需要使用別名問題

2、自連線

某個表與自身進行連線,稱為自表連線或自身連線,簡稱自連線。使用自連線時,需要為表指定多個不同的別名,且對所有查詢欄位的引用均必須使用表別名限定,否則SELECT操作會失敗。

#查詢與“資料庫”這門課學分相同的課程資訊SELECT c1。*FROM tb_course c1, tb_course c2WHERE c1。credit = c2。credit ANDc2。courseName = ‘資料庫’;或者SELECT c1。*FROM tb_course c1 JOIN tb_course c2ON c1。credit = c2。creditWHERE c2。courseName = ‘資料庫’;

3、自然連線

自然連線(NATURAL JOIN)

只有當連線欄位在兩張表中的欄位名都相同是才可以使用,否則返回的是笛卡爾積的結果集,自然連線在FROM子句中使用關鍵字NATURAL JOIN。使用NATURAL JOIN進行自然連線時,不需要指定連線條件,系統自動兩張表中相同的欄位名來連線。

#用自然連線查詢每個學生及其選修課程的情況,要求顯示學生學號、姓名、選修的課程號和成績SELECT a。studentNo, studentName, courseNo, scoreFROM tb_student a NATURAL JOIN tb_score b;

資料分析系列 15/32 | MySQL連線查詢三板斧

PART

03

外連線

外連線

外連線首先將連線的兩張表分為基表和參考表,然後再以基表為依據返回滿足和不滿足連線條件的記錄,就好像是在參考表中增加了一條全部由空值組成的“萬能行”,它可以和基表中所有不滿足連線條件的記錄進行連線。

外連線根據連線表的順序,可分為左外連線和右外連線兩種。

1、左外連線

左外連線,也稱左連線(LEFT OUTER JOIN 或 LEFT JOIN),用於返回該關鍵字左邊表(基表)的所有記錄,並用這些記錄與該關鍵字右邊表(參考表)中的記錄進行匹配,如果左表的某些記錄在右表中沒有匹配的記錄,就和右表中的“萬能行”連線,即右表對應的欄位值均被設定為空值NULL。

#使用右連線查詢所有學生及其選修課程的情況,包括沒有選修課程的學生,要求顯示學號、姓名、性別、班號、選修的課程號和成績。SELECT courseNo, score, b。studentNo,studentName, sex, classNo,FROM tb_score a RIGHT OUTER JOIN tb_studentbON a。 studentNo = b。 studentNo

2、右外連線

右外連線,也稱右連線(RIGHT OUTER JOIN 或 RIGHT JOIN),以右表為基表,連線方法與左外連線完全一樣。即返回右表的所有記錄,用這些記錄與該關鍵字左邊表(參考表)中的記錄進行匹配,如果右表的某些記錄在左表中沒有匹配的記錄,就和左表中的“萬能行”連線,即左表對應的欄位值均被設定為空值NULL。

#使用右連線查詢所有學生及其選修課程的情況,包括沒有選修課程的學生,要求顯示學號、姓名、性別、班號、選修的課程號和成績。SELECT courseNo, score, b。studentNo,studentName, sex, classNo,FROM tb_score a RIGHT OUTER JOIN tb_studentbON a。 studentNo = b。 studentNo

比較上面的兩個連線,可以發現,都是以tb_student為基表,所以它們的查詢結果相同。外連線可以在兩個連線表沒有任何匹配記錄的情況下仍返回記錄。

歡迎關注微信公眾號,訪問更多精彩:

資料之魅

如需轉載,請聯絡授權,謝謝合作。