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