1. 程式人生 > >MySQL的內部聯結,外部聯結(左聯結,右聯結),自然聯結

MySQL的內部聯結,外部聯結(左聯結,右聯結),自然聯結

一、SELECT語句

一個典型的SQL查詢語句具有如下形式:
SELECT A1,A2, ... ,An
FROM r1, r2, ... ,rm
WHERE P;
select子句列出查詢結果中所需要的屬性。 from子句是一個查詢求值中需要訪問的關係列表。 where子句是一個作用在from子句關係屬性上的謂詞。 其中from這個子句定義的是一個在該子句中列出的關係上的笛卡爾積。可以用如下表述:
for each 元組t1 in 關係r1
    for each 元組t2 in 關係r2
        ...
        把t1, t2, ..., 連線成單個元組t
        把t加入到結果關係中
舉個例子,我這裡有表1:Name
表2:Address
測試FROM語句,會產生如下的笛卡爾積:

二、內部聯結

內部聯結又稱為等值聯結,將兩個表中存在聯結關係的欄位符合聯結關係的那些記錄形成記錄集的聯結。用INNER JOIN 指定表之間的關係,用ON子句指定聯結條件。 首先看看不加聯結條件的內部聯結:
這個結果和select * from Name, Address一樣。 再加上聯結條件:Name.id = Address.id
其結果就是顯式id相等的部分。 這個其實和語句SELECT WHERE一樣的,來看下面的結果:

三、自然聯結

自然聯結其實和內部聯結一樣,只是不會出現相同的重複列。比如在上邊的INNER JOIN中,出現了兩個id列,他們一模一樣。 在以前的版本中,有natural join 來實現自然聯結,也就是去除重複的列。在最新版本的MySQL中,不在支援natural join。把這項工作交給了使用者。 如果我們想得到不重複的列,可以這樣做:

四、外部聯結

外部聯結中包含了在相關表中沒有關聯的行。舉個例子,我在Name表中再插入一行,這一行在Address表中沒有對應的id記錄這個人的地址。

如果我們使用內部聯結,就不會出現"Fox"這個人的資訊。


但是我想顯示所有人的資訊,不管他們有沒有地址。這就可以使用外部聯結。 外部聯結分為LEFT OUTER JOIN 和RIGHT OUTER JOIN。比如我這裡使用LEFT OUTER JOIN:
上邊的語句使用了LEFT OUTER JOIN。它以左邊的表(也就是Name)作為基準,會選擇Name中的所有行,如果該行在Address表中不存在相應的記錄,就會以null值(必須要支援null值)顯示。 同理,RIGHT OUTER JOIN 是以右邊的表作為基準。