[My SQL] 使用联结表

另一种可以达到子查询目的的方式是使用联结表。

联结是一种机制,用来在一条SELECT语句中关联表,可以联结多个表返回一组输出。

联结可以有很多种,主要有等值联结/内部联结、自联结、自然联结和外部联结;

首先我们来看等值联结/内部联结。

我们依然以orders和prderitems为例:

orders:


orderitems:


我们想要查询orders中每个cust购买的东西,可以这么写:


需要注意的是,如果列名有相同,一定要使用完全限定的列名,且应该保证所有联结都有WHERE子句,保证MySQL不返回过多的数据。

以上的联结方法还有可以有另一种方式:


我们使用INNER JOIN的方式,需要搭配ON来使用。这里ON 相当于WHERE。

另一种联结方式是自联结,FROM后面的表是同一张表,是在同一张表里面进行联结。

我们假设有一张products表,内容如下:


假设我们想知道生产DTNTR的生产厂商,还生产了其他什么产品,使用子查询可以这么写:


如果使用自联结可以这么写:


在这个例子中,我们为表使用了别名,将products假设是两张 相同的表,一张表名为p1,另一张为p2。

我们筛选出,第二张表prod_id为DTNTR的vend_id,然后筛选出第一张表和第二张表相同vend_id的prod_id和vend_id;

自然联结表示筛选结果的列不重复出现,一般通过对表使用通配符(SELECT *),对其他表使用明确的子集来完成,举例如下:


外部联结意即联结包含了相关表中没有关联的行,等于给相关行取反。我们以orders表和customers表为例:

orders:


customers:


我们希望找出所有有订单客户的信息,可以这么写:


这里我们使用了INNER JOIN和ON的内部联结方式。如果想要显示所有客户,包括那些没有订单的客户,可以使用外部联结:


这样就可以显示出来10002 Mouse House这个没有订单的客户。

我们也可以将聚集函数使用在联结中,假如我们要检索所有客户以及每个客户的订单数量,可以使用COUNT函数完成:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值