news 2026/5/7 17:00:28

SQL必会必知整理-13-联结表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL必会必知整理-13-联结表
13.1 联结
  • 联结是利用SQLSELECT能执行的最重要的操作,很好地理解联结及其语法是学习SQL的一个极为重要的组成部分。
13.1.1 关系表
  • 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
  • 这样做的好处如下:
    • 信息不重复,从而不浪费时间和空间;
    • 如果信息变动,可以只更新一个表中的单个记录,相关表中的数据不用改动;
    • 由于数据无重复,显然数据是一致的,这使得处理数据更简单
  • 关系数据可以有效地存储和方便地处理。因此,关系数据库的可伸缩性远比非关系数据库要好。
  • 能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好(scale well)。
13.1.2 为什么要使用联结
  • 联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
  • 要维护引用完整性:
    • 要理解联结不是物理实体。换句话说,它在实际的数据库表中不存在。联结由MySQL根据需要建立,它存在于查询的执行当中。
    • 在使用关系表时,仅在关系列中插入合法的数据非常重要。
    • 为防止这种情况发生,可指示MySQL只允许在表的主键列中出现合法值。这就是维护引用完整性,它是通过在表的定义中指定主键和外键来实现的。
13.2 创建联结
  • 联结的创建非常简单,规定要联结的所有表以及它们如何关联即可。
SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name,prod_name;
  • 分析:
    • SELECT语句与前面所有语句一样指定要检索的列。这里,最大的差别是所指定的两个列(prod_name和prod_price)在一个表中,而另一个列(vend_name)在另一个表中。
    • 与以前的SELECT语句不一样,这条语句的FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT语句联结的两个表的名字。这两个表用WHERE子句正确联结,WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。
    • 要匹配的两个列以vendors.vend_idproducts.vend_id指定。这里需要这种完全限定列名,因为如果只给出vend_id,则MySQL不知道指的是哪一个(它们有两个,每个表中一个)。
  • 在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)。如果引用一个没有用表名限制的具有二义性的列名,MySQL将返回错误。
13.2.1 WHERE子句的重要性
  • 在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。在数据库表的定义中不存在能指示MySQL如何对表进行联结的东西。你必须自己做这件事情。在联结两个表时,你实际上做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起。
  • 笛卡尔积:由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
  • 应该保证所有联结都有WHERE子句,否则MySQL将返回比想要的数据多得多的数据。同理,应该保证WHERE子句的正确性。不正确的过滤条件将导致MySQL返回不正确的数据。
  • 有时我们会听到返回称为叉联结(cross join)的笛卡儿积的联结类型。
13.2.2 内部联结
  • 目前为止所用的联结称为等值联结equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。
SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
  • 分析:此语句中的SELECT与前面的SELECT语句相同,但FROM子句不同。这里,两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。
  • ANSI SQL规范首选INNER JOIN语法。此外,尽管使用WHERE子句定义联结的确比较简单,但是使用明确的联结语法能够确保不会忘记联结条件,有时候这样做也能影响性能。
13.2.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 = 20005;
  • 分析:此例子显示编号为20005的订单中的物品。订单物品存储在orderitems表中。每个产品按其产品ID存储,它引用products表中的产品。这些产品通过供应商ID联结到vendors表中相应的供应商,供应商ID存储在每个产品的记录中。这里的FROM子句列出了3个表,而WHERE子句定义了这两个联结条件,而第三个联结条件用来过滤出订单20005中的物品。
  • MySQL在运行时关联指定的每个表以处理联结。这种处理可能是非常耗费资源的,因此应该仔细,不要联结不必要的表。联结的表越多,性能下降越厉害。
  • 为执行任一给定的SQL操作,一般存在不止一种方法。很少有绝对正确或绝对错误的方法。性能可能会受操作类型、表中数据量、是否存在索引或键以及其他一些条件的影响。因此,有必要对不同的选择机制进行实验,以找出最适合具体情况的方法。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 16:29:43

Apache Doris AI 能力揭秘(四):HSAP 一体化混合搜索与分析架构全解

AI 时代正在重塑数据库的角色。过去,数据库主要为人类分析者提供报表与查询能力;而现在,越来越多的查询来自智能代理(Agent),它们会自动检索知识、过滤数据、组合多种信号,并将数据库作为 “实时…

作者头像 李华
网站建设 2026/5/5 22:29:56

jQuery EasyUI 树形菜单 - 树形网格动态加载

jQuery EasyUI 树形网格(TreeGrid) - 动态加载(按需加载子节点) jQuery EasyUI TreeGrid 支持两种常见的“动态加载”方式: 服务器端按需加载(On-Demand Loading / Remote Lazy Loading) 最常见…

作者头像 李华
网站建设 2026/5/1 21:04:26

测试网部署全流程:自研 dApp 上线 Goerli 测试链并验证功能

Goerli( Grli )是以太坊官方推荐的 PoA 测试网,兼容以太坊主网生态,是 dApp 上线主网前验证功能、测试交互的核心环境。本文以「Hardhat 框架 Solidity 智能合约 React 前端」为例,完整讲解 dApp 部署到 Goerli 测试…

作者头像 李华
网站建设 2026/5/2 22:28:21

纯电动汽车仿真:从模型搭建到动力性与经济性分析

纯电动汽车仿真、纯电动公交、纯电动客车、纯电动汽车动力性仿真、经济性仿真。 模型包括电机、电池、车辆模型。 有两种模型2选1: 1 完全用matlab simulink搭建的模型。 2用simscape搭建的车辆模型。 项目开发使用的模型,精确度高,不是随便乱…

作者头像 李华
网站建设 2026/5/5 21:43:30

新能源控制器中多峰值MPPT寻优仿真模型探索

新能源控制器,多峰值mppt寻优仿真模型,传统扰动电导等寻优无法用在局部遮阴下,而粒子群pso算法克服了这个问题,可用于自行研究。 压缩包附带使用说明及解析文档,包括传统扰动与粒子群算法模型。在新能源领域&#xff0…

作者头像 李华