• SQL 必知必会·笔记<11>创建高级联结


    1. 使用表别名

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

    • 缩短SQL 语句;
    • 允许在一条SELECT 语句中多次使用相同的表。

    使用表别名示例:

    1 SELECT cust_name, cust_contact
    2 FROM Customers AS C, Orders AS O, OrderItems AS OI
    3 WHERE C.cust_id = O.cust_id
    4 AND OI.order_num = O.order_num
    5 AND prod_id = 'RGAN01';

    注意:Oracle 中没有AS

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

    2. 使用不同类型的联结

    除了内联结或者等值联结的简单联结,还有以下三种类型的联结:

    • 自联结(self-join)
    • 自然联结(natural join)
    • 外联结(outer join)

    2.1 自联结

    示例:

    1 SELECT c1.cust_id, c1.cust_name, c1.cust_contact
    2 FROM Customers AS c1, Customers AS c2
    3 WHERE c1.cust_name = c2.cust_name
    4 AND c2.cust_contact = 'Jim Jones';

    提示:用自联结而不用子查询

    自联结通常作为外部语句,用来替代从相同表中检索数据的使用子查 询语句。虽然最终的结果是相同的,但许多DBMS 处理联结远比处理 子查询快得多。应该试一下两种方法,以确定哪一种的性能更好。

    2.2 自然联结

    标准的联结(前一笔记中介绍的内联结)返回所有数据,相同的列甚至多次出现。自然联结排除多次出现,使每一列只返回一次。自然联结要求你只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成。

    1 //通配符只对第一个表使用。所有其他列明确列出,所以没有重复的列被检索出来
    2 SELECT C.*, O.order_num, O.order_date,
    3 OI.prod_id, OI.quantity, OI.item_price
    4 FROM Customers AS C, Orders AS O, OrderItems AS OI
    5 WHERE C.cust_id = O.cust_id
    6 AND OI.order_num = O.order_num
    7 AND prod_id = 'RGAN01';

    事实上,我们迄今为止建立的每个内联结都是自然联结,很可能永远都 不会用到不是自然联结的内联结。

    2.3 外联结

    许多联结将一个表中的行与另一个表中的行相关联,但有时候需要包含 没有关联行的那些行,这时候我们可以使用——外联结来完成。这是一个左联结示例:

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

    提示:左联结和右联结

    要记住,总是有两种基本的外联结形式:左外联结(left outer join)和右外联结(right outer join)。它们之间的唯一差别是所关联的表的顺序。换句话说,调整FROM 或WHERE子句中表的顺序,左外联结可以转换为右外联结。因此,这两种外联 结可以互换使用,哪个方便就用哪个。

    全外联结(full outer join)

    检索两个表中的所有行并关联那些可以关联的行。与左外联结或右外联结包含一个表 的不关联的行不同,全外联结包含两个表的不关联的行。全外联结的语法如下:

    1 SELECT Customers.cust_id, Orders.order_num
    2 FROM Orders FULL OUTER JOIN Customers
    3 ON Orders.cust_id = Customers.cust_id;

    注意:FULL OUTER JOIN 的支持

    Access、MariaDB、MySQL、Open Office Base 或SQLite 不支持FULL OUTER JOIN 语法。

    3. 使用联结和联结条件

    • 注意所使用的联结类型。一般我们使用内联结,但使用外联结也有效。
    • 关于确切的联结语法,应该查看具体的文档,看相应的DBMS 支持何种语法
    • 保证使用正确的联结条件(不管采用哪种语法),否则会返回不正确 的数据。
    • 应该总是提供联结条件,否则会得出笛卡儿积。
    • 在一个联结中可以包含多个表,甚至可以对每个联结采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试它们前分别测试每个联结。这会使故障排除更为简单。
  • 相关阅读:
    Atitit attilax要工作研究的要素 纪要 方案 趋势 方向 概念 理论
    Atitit 常见每日流程日程日常工作.docx v7 r8f
    Atitit it 互联网 软件牛人的博客列表
    Atitit 信息链(Information Chain)的概念理解 attilax总结
    Atitit 知识点的体系化 框架与方法 如何了解 看待xxx
    Atitit 聚合搜索多个微博 attilax总结
    Atitit 企业知识管理PKM与PIM
    Atitit 项目沟通管理 Atitit 沟通之道 attilax著.docx
    Atitit 项目管理软件 在线服务 attilax总结 1. 项目管理协作的历史 1 1.1. Worktile 406k 1 1.2. Teambition  584k in baidu
    Atitit.每周末总结 于每周一计划日程表 流程表 v8 import 上周遗漏日志补充 检查话费 检查流量情况 Crm问候 Crm表total and 问候
  • 原文地址:https://www.cnblogs.com/IPrograming/p/3322715.html
Copyright © 2020-2023  润新知