第十三课 创建高级联结

来源:互联网 发布:lol免费刷皮肤软件 编辑:程序博客网 时间:2024/05/21 09:15

第十三课、  创建高级联结

       预习与回顾:

       第十二课学习了联结,讲述了一些关系数据库设计的基本知识,包括等值联结(也称为内联结)这种最常用的联结;第十三课将学习另外一些联结(包括它们的含义和使用方法),介绍如何使用表别名,如何对被联结的表使用聚集函数。

       13.1、使用表别名

       给列起别名:

输入▼
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
                AS vend_title
                       FROM Vendors
                                    ORDERBY vend_name;

输入▼
SELECT cust_name, cust_contact
                FROM Customers AS C,Orders AS O, OrderItems AS OI
                             WHEREC.cust_id = O.cust_id
                                               AND OI.order_num = O.order_num
                                                          ANDprod_id = 'RGAN01';

        13.2、使用不同类型的联结

       :自联结(self-join)、自然联结(natural join)和外联结(outer join)。

        13.2.1、自联结(self-join)

输入▼
SELECT cust_id, cust_name, cust_contact
                FROM Customers
                             WHEREcust_name = (SELECT cust_name
                                            FROM Customers
                                                         WHERE cust_contact = 'Jim Jones');

       子查询:内部的SELECT语句做了一个简单检索,返回Jim Jones工作公司的cust_name。该名字用于外部查询的WHERE子句中,以检索出为该公司工作的所有雇员。

        输入▼
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
                FROM Customers AS c1,Customers AS c2
                            WHEREc1.cust_name = c2.cust_name
                                          AND c2.cust_contact = 'Jim Jones';

       13.2.2、自然联结

       自然联结要求你只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成。

输入▼
SELECT C.*, O.order_num, O.order_date,
                       OI.prod_id,OI.quantity, OI.item_price
                                          FROM Customers AS C, Orders AS O, OrderItems AS OI
                                                      WHERE C.cust_id = O.cust_id
                                                                      AND OI.order_num = O.order_num
                                                                                AND prod_id ='RGAN01';

       13.2.3外联结

        许多联结将一个表中的行与另一个表中的行相关联,但有时候需要包含没有关联行的那些行。

输入▼
SELECT Customers.cust_id, Orders.order_num
                FROM Customers INNER JOINOrders
                            ONCustomers.cust_id = Orders.cust_id;

输入▼
SELECT Customers.cust_id, Orders.order_num
                FROM Customers LEFT OUTERJOIN Orders
                            ONCustomers.cust_id = Orders.cust_id;

!!关键字OUTER JOIN来指定联结类型(而不是在WHERE子句中指定)。但是,与内联结关联两个表中的行不同的是,外联结还包括没有关联行的行。在使用OUTERJOIN语法时,必须使用RIGHTLEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出OUTER JOIN左边的表)。上面的例子使用LEFTOUTER JOINFROM子句左边的表(Customers表)中选择所有行。为了从右边的表中选择所有行,需要使用RIGHTOUTER JOIN!!

全外联结(full outer join),它检索两个表中的所有行并关联那些可以关联的行。与左外联结或右外联结包含一个表的不关联的行不同,全外联结包含两个表的不关联的行。

输入▼
SELECT Customers.cust_id, Orders.order_num
             FROM Orders FULL OUTER JOINCustomers
                         ONOrders.cust_id = Customers.cust_id;

        13.3、使用聚集函数的联结

        要检索所有顾客及每个顾客所下的订单数:

输入▼
SELECT Customers.cust_id,
                COUNT(Orders.order_num)AS num_ord
                               FROMCustomers INNER JOIN Orders
                                           ON Customers.cust_id = Orders.cust_id
                                                  GROUP BY Customers.cust_id;

SELECT语句使用INNER JOIN将Customers和Orders表互相关联。GROUP BY子句按顾客分组数据,因此,函数调用COUNT(Orders.order_num)对每个顾客的订单计数,将它作为num_ord返回。

输入▼
SELECT Customers.cust_id,
                COUNT(Orders.order_num)AS num_ord
                                 FROMCustomers LEFT OUTER JOIN Orders
                                             ON Customers.cust_id = Orders.cust_id
                                                    GROUP BY Customers.cust_id;

左外部联结来包含所有顾客,甚至包含那些没有任何订单的顾客

原创粉丝点击