1 join 連接的作用
join 連接用于把來自兩個或多個表的行結合起來,基于這些表之間的共同字段。
最常見的 join 類型:inner join(簡單的 join)。 inner join 從多個表中返回滿足 join條件的所有行。
2 示例數據
讓我們看看選自 "orders" 表的數據:
csdn=> select * from orders;order_id | cust_id | empoyee_id | order_date | ship_id
----------+---------+------------+---------------------+---------1 | 3 | 9 | 2018-09-21 09:20:23 | 32 | 4 | 9 | 2018-06-28 11:10:23 | 53 | 6 | 3 | 2018-09-21 13:02:19 | 34 | 3 | 7 | 2018-09-28 14:11:16 | 45 | 1 | 4 | 2018-09-30 15:02:12 | 4
(5 rows)csdn=>
csdn=> select * from customers;id | name | addr | city | zip | province
----+--------+---------------+------+--------+----------1 | 魯智深 | 北京路27號 | 平涼 | 200000 | 甘肅省2 | 李四 | 南京路12號 | 杭州 | 310000 | 浙江市3 | 王五 | 花城大道17號 | 廣州 | 510000 | 廣州省4 | 馬六 | 江夏路19號 | 武漢 | 430000 | 湖北省5 | 趙七 | 西二旗12號 | 北京 | 100000 | 北京市6 | 宋一 | 花城大道21號 | 廣州 | 510000 | 廣東省7 | 劉二 | 長安街 121 號 | 北京 | 100000 | 北京市8 | 宋江 | 梁山路1號 | 濟南 | 250000 | 山東省| 武松 | | 邢臺 | | 河北省10 | 韓信 | 梁山路1號 | 渝東 | 250001 | 四川省11 | 呂不韋 | 梁山路1號 | 渝中 | 250001 | 四川省
(11 rows)csdn=>
請注意,"orders" 表中的 "cust_id" 列指向 "customers" 表中的"id"。上面這兩個表是通過 "客戶ID" 列聯系起來的。
select o.order_id as "訂單ID",c.name as "姓名", o.order_date as "訂單日期"
from orders o
inner join customers c
on o.cust_id=c.id;
結果:
3 不同的join
在我們繼續講解實例之前,我們先列出您可以使用的不同的 sql join 類型:
- inner join:如果表中有至少一個匹配,則返回行
- left join:即使右表中沒有匹配,也從左表返回所有的行
- right join:即使左表中沒有匹配,也從右表返回所有的行
- full join:只要其中一個表中存在匹配,則返回行
?
4 inner join
內部鏈接 inner join 關鍵字選擇兩個表中具有匹配值的記錄。
inner join 語法
select column_name(s) from table1
inner join table2 on
table1.column_name = table2.column_name;
注釋:inner join 與 join 是相同的,上面的示例就是 inner join
?
5 left join
sql 左鏈接 left join 關鍵字返回左表(表 1)中的所有行,即使在右表(表 2)
中沒有匹配。如果在左表中沒有匹配,結果是 null。
left join 語法
select column_name(s)
from table1
left join table2
on table1.column_name=table2.column_name;
或:
select column_name(s)
from table1
left outer join table2
on table1.column_name=table2.column_name;
注釋:在GaussDB數據庫中,left join 稱為 left outer join。
?
?
left join 示例
我們想看看客戶 customers 表中的所有用戶是否都有下單,可以使用如下查詢語言:
select c.name as "姓名",o.order_id as "訂單id", o.order_date as "訂單日期"
from customers c
left join orders o
on o.cust_id=c.id;
結果:
我們發現李四,劉二,趙七,宋江,呂不韋,韓信,武松沒有對應的訂單 ID 和訂單日期,是因為他們沒有在訂單 ,表 orders 中不存在,沒有匹配上他們的信息。但是由于是左連接,就把主表 customers 的信息全部顯示出來了,就是對應上圖的 table1。
?
6 right join
sql右鏈接 right join 關鍵字返回右表(table2)的所有行,即使在左表(table1)上沒有匹配。如果左表沒有匹配,則結果為 null。
right join 語法
select column_name(s) from table1
right join table2 on
table1.column_name = table2.column_name;
注釋:在GaussDB數據庫中,right join 稱為 right outer join。
?
select c.name as "姓名",c.province as "省",o.order_id as "訂單id", o.order_date as "訂單日期"
from customers c
right join orders o
on o.cust_id=c.id;
結果:
?
7 full outer join
當左(表 1)或右(表 2)表記錄匹配時,full outer join 關鍵字將返回所有記錄。
注意: full outer join 可能會返回非常大的結果集!
FULL OUTER JOIN 語法
select column_name(s) from table1
full outer join table2 on
table1.column_name = table2.column_name;
?
select c.name as "姓名",c.province as "省",o.order_id as "訂單id",o.order_date as "訂單日期"
from customers c
full join orders o
on o.cust_id=c.id;
結果:

8?批注
?
?
?
?