南大通用GBase 8s连接查询全解析

原文链接:https://www.gbase.cn/community/post/4216
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在数据密集型的业务场景中,理解和应用多表连接查询是数据库管理员和分析师的核心技能之一。南大通用GBase 8s数据库通过其强大的连接查询功能,使用户能够在不同的数据表之间建立高效的数据关联。本文介绍GBase 8s中的连接查询,包括内连接、外连接、自连接以及多表连接,并通过实例演示其应用,帮助读者理解和掌握。

表1 客户表(customer)实例数据

客户编号

customer_num

姓名

cname

单位

company

地址

address

城市

city

国家

state

电话

phone

101张一川金牌大风解放路18号香港中国13887898075
102李凤华谊兄弟光明路19号北京中国13058221289
103王宝强乔杰力娱乐中华路88号北京中国15853284543
104杰克新索娱乐卡梅尔路422号洛杉矶美国4157433611
105刘杰复兴路38号北京中国18853898789

表2 订单表(orders)实例数据

订单编号

order_num

客户编号

customer_num

订单日期

order_date

交易日期

ship_date

付款日期

paid_date

100110105/20/201406/01/201407/22/2014
100210105/21/201405/26/201406/03/2014
100310405/22/201405/23/201406/14/2014
100410206/07/201407/06/201407/21/2014
100510406/22/201407/10/201407/31/2014

表3 订单明细表(items)实例数据

订单明细编号

item_num

订单编号

order_num

商品名称

ship_name

商品单价

ship_price

数量

quantity

100011001商品HRO250.01
100021002商品HSK960.02
100031002商品HSKA240.03
100041003商品ANZA19.85
100051004商品HRO250.01
100061005商品HRR480.05

一、内连接 (join on)

a)说明

内连接只返回两个表中与连接谓词匹配的行,不匹配的行不会被输出。

b)举例

  • 需求:查询每位顾客的联系方式及其订货日期
  • 分析:顾客信息存放在customer表中,订单日期存放在orders表中,本查询需要涉及两个表,两个表之间的联系是通过customer表的主键customer_num和orders表的外键customer_num实现的。
  • 查询语句:
select customer.customer_num, cname, phone, order_num, order_date
from customer join orders
on customer.customer_num=orders.customer_num;
  • 查询结果:
customer_numcnamephoneorder_numorder_date
101张一川13887898075100105/20/2014
101张一川13887898075100205/21/2014
104杰克4157433611100305/22/2014
102李凤13058221289100406/07/2014
104杰克4157433611100506/22/2014

2、外连接(Outer Join)

内连接操作的结果只输出两个表中在连接谓词上匹配的行。如果希望连接操作将左表或者右表中不匹配的行也输出,就需要使用外连接了。外连接分为左外连接、右外连接和完全外连接。

1)左外连接(left outer join on)

a)说明:

左外连接会返回左表中全部的行,即使右表中没有找到匹配的行。如果左表中的行在右表中没有匹配的行,对应的行上来自右表的属性为空值。

b)举例:

  • 需求:查询每位顾客的订购物品的信息,目前没有订单的顾客也要列出
  • 分析:顾客信息在customer表中,物品的信息在orders表中,两个表通过customer表中的主键customer_num和orders表中的外键customer_num连接。
  • 查询语句:
select customer.customer_num, cname, phone, order_num,order_date
from customer left outer join orders
on customer.customer_num=orders.customer_num;
  • 查询结果:
customer_numcnamephoneorder_numorder_date
101张一川13887898075100105/20/2014
101张一川13887898075100205/21/2014
102李凤13058221289100406/07/2014
103王宝强15853284543
104杰克4157433611100305/22/2014
104杰克4157433611100506/22/2014
105刘杰18853898789
2)右外连接(right outer join on)

a)说明:

右外连接会返回左表中全部的行,即使左表中没有找到匹配的行。如果右表中的行在左表中没有匹配的行,对应的行上来自左表的属性为空值。

b)举例(与左连接类似,不再列举)

  • 需求:查询每位顾客的订购物品的信息,目前没有订单的顾客也要列出
  • 分析:顾客信息在customer表中,物品的信息在orders表中,两个表通过customer表中的主键customer_num和orders表中的外键customer_num连接。
  • 查询语句(使用右外连接,修改左右表位置即可)
select customer.customer_num, cname, phone, order_num,order_date
from orders left outer join customer
on orders.customer_num=customer.customer_num;
  • 查询结果:
customer_numcnamephoneorder_numorder_date
101张一川13887898075100105/20/2014
101张一川13887898075100205/21/2014
102李凤13058221289100406/07/2014
103王宝强15853284543
104杰克4157433611100305/22/2014
104杰克4157433611100506/22/2014
105刘杰18853898789

 3、自连接(self-join)

a)说明:

自连接是指一个表与自身进行连接操作,它是特殊形式的内连接。

b)举例:

  • 需求:查询提交了一次以上订单的顾客信息
  • 分析: 在订单表orders中查看拥有不同的订单的同一个顾客的信息,将customer_num输出。

 该例中将orders表按照customer_num属性等值进行了连接,由于连接的两个表名字相同,无法使系统区分何时调用哪张表,因此需要为两张表取别名A和B ,按照要在同一行中出现不同的订单号,就说明该顾客至少签订了两个订单,通过A.order_num<>B.order_num条件可以过滤掉同一行订单记录自身匹配的情况。

  • 查询语句:
select distinct A.customer_num
from orders A inner join orders B on A.customer_num=B.customer_num
where A.order_num<>B.order_num;

select distinct A.customer_num
from orders A, orders B
where A.customer_num=B.customer_num and A.order_num <>B.order_num;

或(不用连接查询,使用嵌套查询)

select A.customer_num, count(*)
from orders
group by customer_num having count(*) >1;
  • 查询结果:
customer_num
101
104

4、多表连接(Multiple Table Joins)

a)说明:

将两个以上的表进行连接的操作称为多表连接。连接多张表需要使用多个join关键字。可以将多表连接的执行过程理解为:第1张表与第2张表连接,将得到的中间结果表再与第3张表连接,依此类推,直到获得最终结果表。

b)举例:

  • 需求:查询每位顾客提交订单的日期、所定的物品名称及物品价格
  • 分析:由于内连接运算满足交换律和结合律,多张表的连接顺序不会改变结果表,所以DBMS不一定按照表的先后顺序依次执行连接,而是根据执行代价选择最优的连接顺序。
  • 查询语句:
select cname, order_date, ship_name, (ship_price * quantity) as total_price
from customer join orders
on customer.customer_num=orders.customer_num join items on orders.order_num=items.order_num;

select cname, order_date, ship_name, (ship_price * quantity) as total_price
from customer , orders , items
where customer.customer_num=orders.customer_num and orders.order_num=items.order_num;
  • 查询结果:
cnameorder_dateship_nametotal_price
张一川05/20/2014商品HRO$250.00
张一川05/21/2014商品HSK$1920.00
张一川05/21/2014商品HSKA$720.00
杰克05/22/2014商品ANZA$99.00
李凤06/07/2014商品HRO$250.00
杰克06/22/2014商品HRR$2400.00

通过本文的深入分析和实例演示,我们希望读者能够更加熟练地运用GBase 8s的连接查询功能,以解决实际工作中的数据整合需求。连接查询不仅提高了数据处理的效率,也极大地丰富了数据分析的深度和广度。我们期待您通过本文的学习,能够进一步提升在数据库查询优化和数据挖掘方面的专业能力。

原文链接:https://www.gbase.cn/community/post/4216
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

 

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值