不說話先看圖吧:
SQL的7種連接分別是:inner join、left join、right join、full outer join(2種),但MySQL的full outer join方式卻有些不一樣。
-
內連接(交集)
select * from x_user a inner join x_school b on a.id=b.id;
-
左外連接
select * from x_user a left join x_school b on a.id=b.id;
-
右外連接
select * from x_user a right join x_school b on a.id=b.id;
-
左差集
select * from x_user a left join x_school b on a.id=b.id where b.id is null;
-
右差集
select * from x_user a right join x_school b on a.id=b.id where b.id is null;
-
並集
select * from x_user a left join x_school b on a.id=b.id union select * from x_user a right join x_school b on a.id=b.id;
並集就是交叉和不交叉的都顯示出來,但需要注意的是union左右兩邊查詢的字段個數要保持一致;另外如果同一列下,union左側顯示左邊的字段,右邊顯示的寫右邊的字段,那麼需要在左右分別顯示的寫上各自的字段就好了,比如下面的1.drugstore_name, t1.organ_sign, t1.province, t1.city和 t2.drugstore_name, t2.organ_sign, t2.province, t2.city是一一對應的,那麼查詢出來的就是各自的字段,如下表格圖(紅色畫框的是表t2字段的數據)。
SELECT t1.drugstore_name, t1.organ_sign, t1.province, t1.city, t1.order_id sku_10_order_id, t1.member_guid sku_10_member_guid, t1.sku_10_amount, t2.order_id sku_1_order_id, t2.member_guid sku_1_member_guid, t2.sku_1_amount FROM t1 LEFT JOIN t2 ON t1.organ_sign = t2.organ_sign AND t1.order_id = t2.order_id UNION SELECT t2.drugstore_name, t2.organ_sign, t2.province, t2.city, t1.order_id, t1.member_guid, t1.sku_10_amount, t2.order_id sku_1_order_id, t2.member_guid sku_1_member_guid, t2.sku_1_amount FROM t1 RIGHT JOIN t2 ON t1.organ_sign = t2.organ_sign AND t1.order_id = t2.order_id;
-
差集
select * from x_user a left join x_school b on a.id=b.id where b.id is null union select * from x_user a right join x_school b on a.id=b.id where a.id is null;