GaussDB join 连接的用法
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 批注