chapter15:联结表

联结

联结(join)是SQL最强大功能之一。

关系表

看一个例子:假如有一个包含产品目录的数据库表,其中每种类别的物品占一行。对于每种物品要存储的信息包括产品描述和价格,供应商信息。
现在,假如有同一供应商生产的多种物品,将这些数据与产品信息分开存储的理由如下:

  • 供应商信息相同,对每个产品重复此信息浪费;
  • 如果供应商信息改变,只需改动一次;
  • 如果有重复数据,很难保证每次输入该数据的方式相同。
    关系表设计就是要保证把信息分解成多个表,一类数据一个表,各表通过某些常用的值互相关联。

在这个例子中,可以建立两个表,一个存储供应商信息,另一个存储产品信息。

vendors表包含所有供应商信息,每个供应商占一行,每个供应商具有唯一标识。此标识成为主键(primary key)。

products表存储产品信息,除了供应商ID(vendors的主键)外不存储其他供应商信息。

vendors表的主键又叫做products的外键,将两表关联起来,利用供应商ID能从vendors表中找出相应供应商的详细信息。

外键(foreign key):外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

创建联结

例:

SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;

!:使用完全限定列名。

WHERE子句的重要性

WHERE子句作为过滤条件,它只包含那些匹配给定条件的行。

笛卡尔积(cartesian product):由没有联结条件的表返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
例:

SELECT vend_name, prod_name, prod_price
FROM vendors, products
ORDER BY vend_name, prod_name;

内部联结

以上均为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。

联结多个表

SQL对一条SELECT语句可以联结的表数目没有限制。规则也相同,首先列出所有表,然后定义表之间的关系。例:

SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems.products, vendors
WHERE products.vend_id = vendors.vend_id
  AND orderitems.prod_id = products.prod_id
  AND order_num = 20005;

推荐阅读更多精彩内容