在實際應用中,查詢的數據往往不止局限在一張表里,通常需要多張表在一起進行組合查詢,今天我們將會對Mysql當中的多張有關聯的表進行組合查詢,本節內容涉及到的幾個關鍵點有:
等值和非等值連接查詢;自然連接查詢;嵌套查詢;自身連接查詢;
我們還是通過Python中的“pymysql”模塊來連接Mysql數據庫,進行今天的學習
准備工作
和上次一樣,我們還是建立了三張表,它們分別是:學生表、學科表、成績表。每張表都有一個自增量的ID字段,作為該表的主鍵,同時,成績表里有兩個字段“student_ID”和“subject_ID”與學生表的ID、學科表的ID相關聯,同時在這三張表里都插入了一些基礎數據,通過已插入的這些基礎數據我們來進行分析和介紹。
下面是三張表的建表語句和一些基礎數據:


等值和非等值連接查詢
通過比較運算符(通常有:=、>=、<=、>、<、<>、!=、like等)進行查詢條件的比較,sql語句的寫法是:
select A.*,B.* from A,B where A.主鍵=B.外鍵 and 其他查詢條件;
假如我們想要查詢學生名字叫陳偉的學生的成績,在Python中舉例如下:

進行等值連接查詢的sql語句編寫時,要明確指出數據源來源於哪幾張表,並且要很清楚的知道哪幾個字段是相互關聯的,然后再添加其他的查詢條件。其實這種查詢的原理就是將數張表合成一張大表,字段相加,記錄相乘,即笛卡爾積。
自然連接查詢
自然連接查詢就是在等值連接查詢的基礎之上,將需要的列展示出來的查詢。
sql語句的寫法是:select A.字段1,B.字段2 from A,B where A.主鍵 = B.外鍵 and 其他查詢條件;
例如:我們想查詢陳偉的所有學科的成績,展示學生姓名、學科和成績,如下圖所示:

自然連接查詢的本質實際上也是基於等值連接查詢結果的,只是在查詢結果集中進行篩選。因此,基於以上兩種查詢,優點是簡單方便,缺點也很明顯:查詢效率較低,不利於海量的數據查詢;
嵌套查詢
嵌套查詢就是將一個查詢語句嵌套到另一個查詢語句里,得到的查詢結果集;
假設我們要查詢學生名字叫陳偉的語文考試成績,用嵌套查詢可以這樣寫:

編寫嵌套查詢語句時要注意的地方是:在寫之前要理清思路,表的結構要清晰明了。單條sql查詢語句要逐個驗證,然后再結合在一起進行驗證。它的優點在於查詢效率較高,缺點就是邏輯性比較強;
從上例我們看到通過“in”關鍵詞將兩條查詢語句連在一起進行嵌套查詢,下面列舉一下嵌套查詢所用到的各種關鍵詞:
in:查詢的值是否在子查詢語句的結果集中,如上例;exist:子查詢語句的結果只要不為空,就返回所有符合條件的查詢結果;

上例中,因為子查詢語句能查詢到值,因此主查詢語句將返回所有的查詢結果;
any:子查詢語句的結果集中只要有任意一個滿足條件,就返回所有符合條件的查詢結果;all:子查詢語句的結果集必須都要滿足條件,才返回符合條件的查詢結果;

請注意上例中any和all的用法,得到不同的結果;
自身連接查詢
當在一張表中用到該表的好幾個字段作為篩選條件,可以考慮使用自身連接查詢實現,此時,需要為該表起一個別名,例如我們要把所有大於女同學年齡的所有男同學查詢出來,可以這么做:

通過as關鍵詞為同一張表命名為一個別名,從而可以使用這個別名,自身連接查詢在應用中往往因為語法簡單,但邏輯關系復雜而導致不太容易被理解。其實有時候,只要將單表看成是多張表,跳出思維的局限性,有時候在應用中會給我們帶來很多方便。