SQL联结多个表

SQL联结多个表,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 = 20007;

输出结果如下:

    prod_name             vend_name           prod_price      quantity
    ---------------      -------------      ----------      --------
    18 inch teddy bear  Bears R Us          11.9900          50
    Fish bean bag toy    Doll House Inc.    3.4900           100
    Bird bean bag toy    Doll House Inc.    3.4900           100
    Rabbit bean bag toy Doll House Inc.    3.4900           100
    Raggedy Ann           Doll House Inc.    4.9900           50

这个例子显示订单20007中的物品。订单物品存储在OrderItems表中。每个产品按其产品ID存储,它引用Products表中的产品。这些产品通过供应商ID联结到Vendors表中相应的供应商,供应商ID存储在每个产品的记录中。这里的FROM子句列出三个表,WHERE子句定义这两个联结条件,而第三个联结条件用来过滤出订单20007中的物品。

注意:性能考虑
DBMS在运行时关联指定的每个表,以处理联结。这种处理可能非常耗费资源,因此应该注意,不要联结不必要的表。联结的表越多,性能下降越厉害。

注意:联结中表的最大数目
虽然SQL本身不限制每个联结约束中表的数目,但实际上许多DBMS都有限制。

现在回顾一下子查询的例子,如下的SELECT语句返回订购产品RGAN01的顾客列表:

    SELECT cust_name, cust_contact
    FROM Customers
    WHERE cust_id IN (SELECT cust_id
                      FROM Orders
                      WHERE order_num IN (SELECT order_num
                                            FROM OrderItems
                                            WHERE prod_id = 'RGAN01'));

子查询所述,子查询并不总是执行复杂SELECT操作的最有效方法,下面是使用联结的相同查询:

    SELECT cust_name, cust_contact
    FROM Customers, Orders, OrderItems
    WHERE Customers.cust_id = Orders.cust_id
      AND OrderItems.order_num = Orders.order_num
      AND prod_id = 'RGAN01';

输出结果如下:

    cust_name                              cust_contact
    -----------------------------      --------------------
    Fun4All                                 Denise L. Stephens
    The Toy Store                         Kim Howard

子查询所述,这个查询中的返回数据需要使用3个表。但在这里,我们没有在嵌套子查询中使用它们,而是使用了两个联结来连接表。这里有三个WHERE子句条件。前两个关联联结中的表,后一个过滤产品RGAN01的数据。

提示:多做实验
可以看到,执行任一给定的SQL操作一般不止一种方法。很少有绝对正确或绝对错误的方法。性能可能会受操作类型、所使用的DBMS、表中数据量、是否存在索引或键等条件的影响。因此,有必要试验不同的选择机制,找出最适合具体情况的方法。

说明:联结的列名
上述所有例子里,联结的几个列的名字都是一样的(例如Customers和Orders表里的列都叫cust_id)。列名相同并不是必需的,而且你经常会遇到命名规范不同的数据库。我这样建表只是为了简单起见。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

SQL教程