數據分析系列 15/32 | MySQL連接查詢三板斧

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

 

PART01

  交叉連接

交叉連接(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條。因此,對於存在大量數據的表,應該避免使用交叉連接。

PART02

  內連接

內連接(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;

PART03

 外連接

外連接

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

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

 

1、左外連接

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

#使用左連接查詢所有學生及其選修課程的情況,包括沒有選修課程的學生,要求顯示學號、姓名、性別、班號、選修的課程號和成績。SELECT a.studentNo, studentName, sex,classNo, courseNo, scoreFROM tb_student a LEFT OUTER JOIN tb_scorebON 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爲基表,所以它們的查詢結果相同。外連接可以在兩個連接表沒有任何匹配記錄的情況下仍返回記錄。

 

歡迎關注微信公衆號,訪問更多精彩:數據之魅

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

 

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