JOIN 示例
SQL JOIN 子句用于根据公共字段合并两个或多个表中的数据。根据指定的联接方法,结果可能会发生变化,也可能不发生变化。有关 JOIN 子句的语法的更多信息,请参阅参数。
以下示例使用 TICKIT
示例数据中的数据。有关数据库架构的更多信息,请参阅示例数据库。要了解如何加载示例数据,请参阅《Amazon Redshift 入门指南》中的加载数据。
下面的查询是 LISTING 表和 SALES 表之间的内部联接(不带 JOIN 关键字),其中 LISTING 表中的 LISTID 介于 1 和 5 之间。此查询匹配 LISTING 表(左表)和 SALES 表(右表)中的 LISTID 列值。结果显示 LISTID 1、4 和 5 符合条件。
select listing.listid, sum(pricepaid) as price, sum(commission) as comm from listing, sales where listing.listid = sales.listid and listing.listid between 1 and 5 group by 1 order by 1; listid | price | comm -------+--------+-------- 1 | 728.00 | 109.20 4 | 76.00 | 11.40 5 | 525.00 | 78.75
以下查询是一个左外部联接。当在其他表中找不到匹配项时,左外部联接和右外部联接保留某个已联接表中的值。左表和右表是语法中列出的第一个表和第二个表。NULL 值用于填补结果集中的“空白”。此查询匹配 LISTING 表(左表)和 SALES 表(右表)中的 LISTID 列值。结果表明 LISTID 2 和 3 不会生成任何销售额。
select listing.listid, sum(pricepaid) as price, sum(commission) as comm from listing left outer join sales on sales.listid = listing.listid where listing.listid between 1 and 5 group by 1 order by 1; listid | price | comm -------+--------+-------- 1 | 728.00 | 109.20 2 | NULL | NULL 3 | NULL | NULL 4 | 76.00 | 11.40 5 | 525.00 | 78.75
以下查询是一个右外部联接。此查询匹配 LISTING 表(左表)和 SALES 表(右表)中的 LISTID 列值。结果显示 ListID 1、4 和 5 符合条件。
select listing.listid, sum(pricepaid) as price, sum(commission) as comm from listing right outer join sales on sales.listid = listing.listid where listing.listid between 1 and 5 group by 1 order by 1; listid | price | comm -------+--------+-------- 1 | 728.00 | 109.20 4 | 76.00 | 11.40 5 | 525.00 | 78.75
以下查询是一个完全联接。当在其他表中找不到匹配项时,完全联接保留已联接表中的值。左表和右表是语法中列出的第一个表和第二个表。NULL 值用于填补结果集中的“空白”。此查询匹配 LISTING 表(左表)和 SALES 表(右表)中的 LISTID 列值。结果表明 LISTID 2 和 3 不会生成任何销售额。
select listing.listid, sum(pricepaid) as price, sum(commission) as comm from listing full join sales on sales.listid = listing.listid where listing.listid between 1 and 5 group by 1 order by 1; listid | price | comm -------+--------+-------- 1 | 728.00 | 109.20 2 | NULL | NULL 3 | NULL | NULL 4 | 76.00 | 11.40 5 | 525.00 | 78.75
以下查询是一个完全联接。此查询匹配 LISTING 表(左表)和 SALES 表(右表)中的 LISTID 列值。结果中只有不会导致任何销售额的行(ListID 2 和 3)。
select listing.listid, sum(pricepaid) as price, sum(commission) as comm from listing full join sales on sales.listid = listing.listid where listing.listid between 1 and 5 and (listing.listid IS NULL or sales.listid IS NULL) group by 1 order by 1; listid | price | comm -------+--------+-------- 2 | NULL | NULL 3 | NULL | NULL
以下示例是与 ON 子句的内部联接。在这种情况下,不返回 NULL 行。
select listing.listid, sum(pricepaid) as price, sum(commission) as comm from sales join listing on sales.listid=listing.listid and sales.eventid=listing.eventid where listing.listid between 1 and 5 group by 1 order by 1; listid | price | comm -------+--------+-------- 1 | 728.00 | 109.20 4 | 76.00 | 11.40 5 | 525.00 | 78.75
以下查询是 LISTING 表和 SALES 表的交叉联接或笛卡尔联接,其中包含限制结果的谓词。此查询匹配 SALES 表和 LISTING 表中的 LISTID 列值,对应于这两个表中的 LISTID 1、2、3、4 和 5。结果显示 20 个行符合条件。
select sales.listid as sales_listid, listing.listid as listing_listid from sales cross join listing where sales.listid between 1 and 5 and listing.listid between 1 and 5 order by 1,2; sales_listid | listing_listid -------------+--------------- 1 | 1 1 | 2 1 | 3 1 | 4 1 | 5 4 | 1 4 | 2 4 | 3 4 | 4 4 | 5 5 | 1 5 | 1 5 | 2 5 | 2 5 | 3 5 | 3 5 | 4 5 | 4 5 | 5 5 | 5
以下示例是两个表之间的自然联接。在这种情况下,列 listid、sellerid、eventid 和 dateid 在两个表中具有相同的名称和数据类型,因此用作联接列。结果限制为 5 行。
select listid, sellerid, eventid, dateid, numtickets from listing natural join sales order by 1 limit 5; listid | sellerid | eventid | dateid | numtickets -------+-----------+---------+--------+----------- 113 | 29704 | 4699 | 2075 | 22 115 | 39115 | 3513 | 2062 | 14 116 | 43314 | 8675 | 1910 | 28 118 | 6079 | 1611 | 1862 | 9 163 | 24880 | 8253 | 1888 | 14
以下示例是使用 USING 子句在两个表之间进行的联接。在这种情况下,列 listid 和 eventid 用作联接列。结果限制为 5 行。
select listid, listing.sellerid, eventid, listing.dateid, numtickets from listing join sales using (listid, eventid) order by 1 limit 5; listid | sellerid | eventid | dateid | numtickets -------+----------+---------+--------+----------- 1 | 36861 | 7872 | 1850 | 10 4 | 8117 | 4337 | 1970 | 8 5 | 1616 | 8647 | 1963 | 4 5 | 1616 | 8647 | 1963 | 4 6 | 47402 | 8240 | 2053 | 18
以下查询是 FROM 子句中的两个子查询的内部联接。此查询查找不同类别的活动(音乐会和演出)的已售门票数和未售门票数:这些 FROM 子句子查询是表 子查询;它们可返回多个列和行。
select catgroup1, sold, unsold from (select catgroup, sum(qtysold) as sold from category c, event e, sales s where c.catid = e.catid and e.eventid = s.eventid group by catgroup) as a(catgroup1, sold) join (select catgroup, sum(numtickets)-sum(qtysold) as unsold from category c, event e, sales s, listing l where c.catid = e.catid and e.eventid = s.eventid and s.listid = l.listid group by catgroup) as b(catgroup2, unsold) on a.catgroup1 = b.catgroup2 order by 1; catgroup1 | sold | unsold ----------+--------+-------- Concerts | 195444 |1067199 Shows | 149905 | 817736