先看兩張表:
1. user表:

2. animal表:

現在我想要查詢各省市區對應的人名和動物名,即根據省市區來連接兩張表。
考慮到user表中有的省市區可能在animal表中沒有,animal表中有的省市區user表中可能沒有,所以兩張表需要全連接。
但是mysql本身不支持全連接,除了用union連接左連接查詢和右連接查詢外,現提供另外一種有效的解決方案。
1) 根據兩表的省市區建立視圖,視圖中省市區組合不重復:
create view v as SELECT u.province_id,u.city_id,u.district_id from user u union SELECT a.province_id,a.city_id,a.district_id from animal a
建好的視圖:

2)這樣視圖中就有了全部的不重復的省市區組合,然后user表和animal表和這個視圖根據省市區條件左連接即可:
SELECT v.province_id, v.city_id, v.district_id, u.`name`, u.money, a.`name`, a.amount FROM v LEFT JOIN USER u ON v.province_id = u.province_id AND v.city_id = u.city_id AND v.district_id = u.district_id LEFT JOIN animal a ON v.province_id = a.province_id AND v.city_id = a.city_id AND v.district_id = a.district_id
查詢出來的結果:

到此 查詢各省市區對應的人名和動物名 完成。
現在我想查詢各省市區對應的錢數(money_sum)和動物數(amount_sum):
sql如下:
SELECT v.province_id, v.city_id, v.district_id, u.money_sum, a.amount_sum FROM v LEFT JOIN ( SELECT u.province_id, u.city_id, u.district_id, sum(u.money) 'money_sum' -- 分組統計值 FROM USER u GROUP BY u.province_id, u.city_id, u.district_id ) u ON v.province_id = u.province_id AND v.city_id = u.city_id AND v.district_id = u.district_id LEFT JOIN ( SELECT a.province_id, a.city_id, a.district_id, sum(a.amount) 'amount_sum' -- 分組統計值 FROM animal a GROUP BY a.province_id, a.city_id, a.district_id ) a ON v.province_id = a.province_id AND v.city_id = a.city_id AND v.district_id = a.district_id -- 注:1. 視圖存放所有不重復的分組情況 2. 必須先統計再連接,即:先求出 分組統計值,然后再左連接;如果先左連接再求統計值,統計值會比實際值大,因為左連接后數據有重復
查詢出來的結果:

可以驗證一下查詢結果是否正確:
money_sum一列的和為15,user表中所有money的和也為15。
amount_sum一列的和為28,animal表中所有的amount值的和也為28。
總結:
mysql求全連接,可以先創建所有連接條件的並集,然后其他表都和這個並集進行左連接,即可得出全連接。
附:通常的解決方案(適用於語句較少時)
MySQL Full Join的實現 因為MySQL不支持FULL JOIN,下面是替代方法 left join + union(可去除重復數據)+ right join
兩張表時: select * from A left join B on A.id = B.id (where 條件) union select *from A right join B on A.id = B.id (where條件);
