zoukankan      html  css  js  c++  java
  • 12 联结表

    1.联结

    SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。

    (1)关系表

    关系表的设计是把信息分解成多个表,一类数据一个表。各表通过某些共同的值互相联系。

    建立两个表:一个存储供应商信息,另一个存储产品信息。

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

    Products表只存储产品信息,除了存储供应商IDVendors表中的主键),不提供任何其他与存储供应商有关的信息。Vendors表的主键将Vendors表和Products表关联,利用存储供应商ID能从Vendors表中找出相应供应商的详细信息。

    (2)为什么使用联结

    联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

    2.创建联结

    指定要联结的表以及关联它们的方式即可创建联结。

    输入:

    SELECT vend_name, prod_name, prod_price

    FROM Vendors,Products

    WHERE Vendors.vend_id = Products.vend_id;

    输出:

    FROM子句列出了两个表:VendorsProducts,这两个表用WHERE子句正确地联结,WHERE子句指示DBMS匹配Vendors表中的vend_idProducts表中的vend_id。这里需要完全限定列名。

    (1)WHERE子句的重要性

    WHERE子句作为过滤条件,只包含那些匹配给定条件的行。没有WHERE子句,第一个表中的每一行将与第二个表中的每一行配对,而不管逻辑上是否能匹配到一起。

    输入:

    SELECT vend_name, prod_name, prod_price

    FROM Vendors, Products;

    输出:

    返回的数据用每个供应商匹配了每个产品,包括供应商不正确的产品,相应的笛卡儿积不是我们想要的。

    (2)内联结

    等值联结(equijion):基于两个表之间的相等测试,也称为内联结(inner join)

    输入:

    SELECT vend_name, prod_name, prod_price

    FROM Vendors INNER JOIN Products

    ON Vendors.vend_id = Products.vend_id;

    输出:

    返回与前面例子完全相同的数据,但这里两个表之间的关系是以INNER JOIN指定的部分FROM子句。使用该语法时,联结条件用特定的ON子句而不是WHERE子句给出,但传递的实际条件相同。

    (3)联结多个表

    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;

    输出:

    显示订单20007中的物品。订单物品存储在OrderItems表中,每个产品按其ID存储,它引用Products表中的产品。这些产品通过供应商ID联结到Vendors表中相应的供应商,供应商ID存储在每个产品的记录中。

    更改11课中的例子

    列出订购物品'RGAN01'的所有顾客

    (1)检索包含物品RGAN01的所有订单的编号;

    (2)检索具有前一步骤列出的订单编号的所有顾客的ID

    (3)检索前一步骤返回的所有顾客ID的顾客信息。

    输入:

    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 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';

    输出:

  • 相关阅读:
    浏览器如何减少 reflow/repaint
    caller和callee的区别
    正则表达式中的2和1和3不仅分组还占位
    正则分组和捕获
    Javascript之BOM与DOM讲解
    Ubuntu14.04(nginx+php+mysql+vsftp)配置安装流程
    JS的类型转换
    typeof 和 instanceof
    ios对new Date() 的兼容问题
    module.exports 和 export default
  • 原文地址:https://www.cnblogs.com/Sumomo0516/p/6131536.html
Copyright © 2011-2022 走看看