多表连接

多表连接在一个或多个相关联列上连接两个以上的表。它可以是等值连接或自然连接。

下列查询在 catalogstockmanufact 表上创建等值连接。

图: 查询

SELECT * FROM catalog, stock, manufact
          WHERE catalog.stock_num = stock.stock_num
          AND stock.manu_code = manufact.manu_code
          AND catalog_num = 10025; 
该查询检索到下列行。

图: 查询结果

catalog_num  10025
        stock_num    106
        manu_code    PRC
        cat_descr    
        Hard anodized alloy with pearl finish; 6mm hex bolt hard ware. 
        Available in lengths of 90-140mm in 10mm increments.
        cat_picture  <BYTE value>
        
        cat_advert   ProCycle Stem with Pearl Finish
        stock_num    106
        manu_code    PRC
        description  bicycle stem
        unit_price   $23.00
        unit         each
        unit_descr   each
        manu_code    PRC
        manu_name    ProCycle
        lead_time       9 

manu_code 重复三次,每个表一次,stock_num 重复两次。

为避免多表查询的大量重复(如图 1),在投影列表中包括特定的列以更确切地定义 SELECT 语句,如下所示。

图: 查询

SELECT catalog.*, description, unit_price, unit, 
          unit_descr, manu_name, lead_time
          FROM catalog, stock, manufact
          WHERE catalog.stock_num = stock.stock_num
          AND stock.manu_code = manufact.manu_code
          AND catalog_num = 10025; 
该查询使用通配符来从具有大多数列的表中选择所有列,然后从其他两个表中指定列。下表显示了此查询生成的自然连接。它与前一示例显示相同的信息,但不重复。

图: 查询结果

catalog_num  10025
          stock_num    106
          manu_code    PRC
          cat_descr    
          Hard anodized alloy with pearl finish. 6mm hex bolt 
          hardware. Available in lengths of 90-140mm in 10mm increments.
          cat_picture  <BYTE value>
          
          cat_advert   ProCycle Stem with Pearl Finish
          description  bicycle stem
          unit_price   $23.00
          unit         each
          unit_descr   each
          manu_name    ProCycle
          lead_time       9