[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函数完成: