zoukankan      html  css  js  c++  java
  • 第13课 创建高级联结

    第13课 创建高级联结

    13.1 使用表别名

    给列起别名的语法如下:

    SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
           AS vend_title
    FROM Vendors
    ORDER BY vend_name;
    

    SQL除了可以对列名和计算字段使用别名,还允许给表名起别名。这样做有两个主要理由:

    • 缩短SQL语句;
    • 允许在一条SELECT语句中多次使用相同的表。
    SELECT cust_name, cust_contact
    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';
    

    警告:Oracle中没有AS
    Oracle不支持AS关键字。要在Oracle中使用别名,可以不用AS,简单地指定列名即可(因此,应该是Customers C,而不是Customers AS C)。

    需要注意,表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户端。

    13.2 使用不同类型的联结

    13.2.1 自联结

    使用表别名的一个主要原因是能在一条SELECT语句中不止一次引用相同的表。

    SELECT cust_id, cust_name, cust_contact
    FROM Customers
    WHERE cust_name = (SELECT cust_name
                       FROM Customers
                       WHERE cust_contact = 'Jim Jones');
    

    现在来看使用联结的相同查询:

    SELECT c1.cust_id, c1.cust_name, c1.cust_contact
    FROM Customers AS c1, Customers AS c2
    WHERE c1.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语句给出了一个简单的内联结。它检索所有顾客及其订单:

    SELECT Customers.cust_id, Orders.order_num
    FROM Customers INNER JOIN Orders
     ON Customers.cust_id = Orders.cust_id;
    

    外联结语法类似。要检索包括没有订单顾客在内的所有顾客,可如下进行:

    SELECT Customers.cust_id, Orders.order_num
    FROM Customers LEFT OUTER JOIN Orders
     ON Customers.cust_id = Orders.cust_id; 
    

    与内联结关联两个表中的行不同的是,外联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。上面的例子使用LEFT OUTER JOIN从FROM子句左边的表(Customers表)中选择所有行。为了从右边的表中选择所有行,需要使用RIGHT OUTER JOIN,如下例所示:

    SELECT Customers.cust_id, Orders.order_num
    FROM Customers RIGHT OUTER JOIN Orders
     ON Orders.cust_id = Customers.cust_id;
    

    13.3 使用带聚集函数的联结

    SELECT Customers.cust_id,
           COUNT(Orders.order_num) AS num_ord
    FROM Customers 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返回。

    13.4 使用联结和联结条件

    汇总一下联结及其使用的要点。

    • 注意所使用的联结类型。一般我们使用内联结,但使用外联结也有效。
    • 应该总是提供联结条件,否则会得出笛卡儿积。

    13.5 小结

    首先讲授了如何以及为什么使用别名,然后讨论不同的联结类型以及每类联结所使用的语法。我们还介绍了如何与联结一起使用聚集函数,以及在使用联结时应该注意的问题。

  • 相关阅读:
    泛微云桥e-Bridge 目录遍历,任意文件读取
    (CVE-2020-8209)XenMobile-控制台存在任意文件读取漏洞
    selenium 使用初
    将HTML文件转换为MD文件
    Python对word文档进行操作
    使用java安装jar包出错,提示不是有效的JDK java主目录
    Windows server 2012安装VM tools异常解决办法
    ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则
    iostat iotop 查看硬盘的读写、 free 查看内存的命令 、netstat 命令查看网络、tcpdump 命令
    使用w uptime vmstat top sar nload 等命令查看系统负载
  • 原文地址:https://www.cnblogs.com/zhangsonghui/p/13302192.html
Copyright © 2011-2022 走看看