內連接和外連接
- 前言
- 正式開始
- 內連接
- 外連接
- 左外連接
- 右外連接
前言
前一篇講多表查詢的時候講過笛卡爾積,其實笛卡爾積就算一種連接,不過前一篇講的時候并沒有細說連接相關的內容,本篇就來詳細說說表的連接有哪些。
本篇博客中主要用到的還是前一篇中的三張表:
雇員表emp:
部門表dept:
薪資等級表:
這三張表中沒有明確指出外鍵和主鍵約束,但是是有外鍵和主鍵約束的樣子的:
其中不同薪資對應不同的薪資等級。
這三張表就不細說了,等會用例子慢慢了解。
正式開始
內連接
內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選,我前面博客中的查詢都是內連
接,這也是在開發過程中使用的最多的連接查詢。
說一下語法:
select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件;
這里的連接條件能用and不斷級聯。
我前一篇中所講的語法格式和這里的語法格式不太一樣,我前一篇對兩個表進行連接的時候是這樣(假如說是對emp表和dept表進行連接,如果看不懂建議先看一下我前一篇博客:【MySQL】多表查詢、子查詢、自連接、合并查詢詳解,包含大量示例,包你會):
這里給沒有看過我上一篇博客的同學簡單解釋一下:
如果是用剛剛的語法的話就是這樣:
解釋一下:
兩種語法產生的效果都是一樣的。不過更推薦用inner join這個語法,至于為什么等會就知道了。
來個例子:
題目>>顯示SMITH的名字和部門名稱
首先明確一點,SMITH的名字在emp表中:
但是部門名稱在dept表中:
所以說這是一個多表查詢的問題,需要對這兩張表進行連接:
但是這里沒有添加連接條件,就會導致產生一些無效的記錄。
比如說SMITH對應記錄有三條,每條都有著不同的部門,但是SMITH實際上是屬于20號部門的,對應dept連接出來的表中10和30號部門的信息沒有用。故要去掉這些無效信息。
而emp表和dept表中共同列屬性為deptno,需要根據deptno來對兩張表進行連接,那么這兩張表的連接條件就是二者的deptno要相等:
這樣得到的記錄就都是有效的記錄了。
再加上題目的條件:SMITH的名字和部門名稱,那么就是名字必須位SMITH:
不過這里的where也可以換成and:
因為員工名為SMITH也可以算成是一個連接的條件,不過把它算成篩選條件在邏輯上更通暢,所以用where更好一點,更能體現出來過程性。
如果用where,表達的意思就是先用deptno作為鏈接條件來對這兩張表進行連接,連接好之后再用where對ename進行篩選,篩選出來的就是SMITH。邏輯更加清晰。
而用前一篇中的方法的話就會變成這樣:
用的是where將表結構篩選出來。
再挑出來響應的列,結果就是這樣:
邏輯上就是用on作為連接條件,用where作為篩選條件,更加清晰。
外連接
外連接可分為兩種,左外連接和右外連接。
左外連接
左外連接就是當兩張表進行連接的時候左表所有的數據都要顯示,就算右表對應行是沒有數據的,也必須要將左表的所有數據顯示出來,對應右表沒有數據的行會顯示為空。
上例子,不然看不懂,先創建兩張表,一張學生表:
插入點數據:
然后再建一張成績表:
插入點數據:
兩張表中的數據并不是所有都能一一對應上的,stu中id為3、4的在exam中沒有成績,而exam中id為11的在stu中沒有數據。
左外連接的語法:
select 列名 from 表名1 left join 表名2 on 連接條件 and 其他連接條件;
此時如果將stu放到表名1,exam放到表名2:
此時stu中3、4沒有成績的也會顯示出來,右表中對應列的數據為空。
但如果用內連接就不會顯示不完整的數據:
如果把exam放到表名1位置:
對應id為11的在stu中沒有數據,但是還是會將其顯示,右表沒有數據的會顯示為空。
所以左外連接即在左表必須顯示全,右表根據篩選條件連接,如果條件不滿足就會顯示為空。
來個題目:
題目>>查詢所有學生的成績,如果這個學生沒有成績,也要將學生的個人信息顯示出來
很簡單,其實就是剛剛的示例:
右外連接
和左外連接同理。右表中的數據必須完全顯示。
其實有了左外連接都不需要右外連接了,因為我們在寫sql語句的時候完全可以調整兩個表名字的位置,這樣就能起到同樣的效果。
語法:
select 列名 from 表名1 right join 表名2 where 連接條件1 and 連接條件2 ...;
演示一下:
以右表的exam為主。
再來:
效果都是一樣的。我甚至感覺左外連接看起來更方便一點。
很簡單,不細說了。
題目>>對stu表和exam表聯合查詢,把所有的成績都顯示出來,即使這個成績沒有學生與它對應,也要顯示出來
也是剛剛的示例:
再來一個開頭給出的三張表的例子:
題目>>列出部門名稱和這些部門的員工信息,同時列出沒有員工的部門
其實三dept表有4個部門,但是有一個部門沒有員工,這個在生活中也是有的,比如說一個公司某項業務規模還比較小,但是不妨礙開一個空部門,等以后業務擴大了之后再向這個空部門中添加員工。
看著不太方便,排個序:
這樣看起來就好多了。
到此結束。。。