SQL中的联结表

本文介绍什么是联结,为什么使用联结,以及如何编写使用联结的SELECT语句。

1. 联结

SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是SQL的SELECT能执行的最重要的操作,理解联结及其语法是学习SQL的重要部分。要有效使用联结,首先需要了解关系表及关系数据库设计的一些基础知识。下面的介绍是入门级的内容,足以帮助理解联结的基本概念。

1.1 关系表

理解关系表,最好通过一个例子来说明。假设有一个包含产品目录的数据库表,每一类物品占一行。对于每种物品,要存储的信息包括产品描述、价格和生产该产品的供应商信息。如果同一供应商生产了多种物品,那么如何存储供应商的名称、地址、联系方式等信息呢?将这些数据与产品信息分开存储的理由有以下几点:

  1. 同一供应商生产的每个产品,其供应商信息是相同的,若对每个产品重复存储这些信息,不仅浪费时间,也浪费存储空间;
  2. 如果供应商信息发生变化,例如供应商的地址或电话号码变动,更新一次即可,无需更新所有产品数据;
  3. 如果供应商信息重复存储,会导致数据一致性问题,不同的输入方式可能造成数据不一致,影响后续分析和报表。

关键在于,相同的数据出现多次是低效的,这是关系数据库设计的基础。关系表的设计应将信息分解成多个表,每类数据存一个表,通过某些共同的值将各表关联(因此称为关系数据库)。

在这个例子中,可以建立两个表:一个存储供应商信息,另一个存储产品信息。Vendors 表包含所有供应商信息,每个供应商占一行,且具有唯一标识(主键,primary key)。Products 表仅存储产品信息,除了存储供应商ID外,不存储其他供应商信息。通过供应商ID,Products 表与 Vendors 表关联,可以从 Vendors 表中查询到相关供应商的详细信息。

这样做的好处包括:

  1. 供应商信息不重复,节省存储空间;
  2. 如果供应商信息发生变动,只需在 Vendors 表中更新一次,其他表中的数据无需更改;
  3. 数据一致性更好,便于数据处理和报表生成。

总之,关系数据库能有效存储数据,并方便后续处理,因此,其可伸缩性要优于非关系数据库。

1.2 为什么使用联结

如前所述,将数据分解为多个表可以更高效地存储数据,且更便于管理,但这也带来了挑战:如何用一条SELECT语句从多个表中检索数据?答案是使用联结。联结是一种机制,可以在一条SELECT语句中将多个表关联,返回关联后的数据集。联结在执行时会根据特定条件把表中的行匹配在一起。

2. 创建联结

创建联结非常简单,只需要指定要联结的所有表和它们的关联条件。以下是一个例子:

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;

输出结果

 

分析:这段代码与前面所写的SELECT语句类似,指定了需要检索的列。不同之处在于,这里列出了两个表:VendorsProducts。在 FROM 子句中,指定了这两个表,表示要联结的表。然后在 WHERE 子句中,通过条件 Vendors.vend_id = Products.vend_id,将两个表中的行关联起来。

注意,在联结中需要明确列名的表名,如 Vendors.vend_idProducts.vend_id,因为每个表都有一个 vend_id 列,否则数据库系统会无法知道你是指哪个表的列。

2.1 WHERE子句的重要性

使用 WHERE 子句来建立联结关系,可能有些令人困惑,但这是有充分理由的。实际上,表之间的关系是在查询执行时动态构造的,数据库表的定义中并没有指定如何联结表。在联结两个表时,数据库会将第一个表中的每一行与第二个表中的每一行配对,WHERE 子句则作为过滤条件,确保只有那些满足联结条件的行才会被返回。如果没有 WHERE 子句,数据库将进行笛卡尔积计算,即第一个表的每一行将与第二个表的每一行配对,可能会返回大量无意义的结果。

笛卡儿积(Cartesian Product)
没有联结条件的查询会返回笛卡尔积,结果行数等于第一个表的行数乘以第二个表的行数。以下示例会展示这一点:

SELECT vend_name, prod_name, prod_price
FROM Vendors, Products;

输出结果

 

从输出中可以看到,这个查询返回的是笛卡尔积,这意味着每个供应商都会与每个产品匹配,显然这不是我们想要的结果。为了避免这种情况,必须确保在联结查询中正确使用 WHERE 子句。

2.2 内联结

到目前为止,我们使用的联结是等值联结(equijoin),它基于两个表之间的相等测试,也叫做内联结(inner join)。这种联结也可以使用另一种语法来明确指定联结类型,语法如下:

SELECT vend_name, prod_name, prod_price
FROM Vendors
INNER JOIN Products ON Vendors.vend_id = Products.vend_id;

分析:此语句的 SELECT 部分与之前相同,但 FROM 子句有所不同。这里,使用了 INNER JOIN 来明确指定两个表之间的关系,并通过 ON 子句来指定联结条件。ON 子句中的条件与 WHERE 子句中的条件是等价的。

说明:“正确的”语法
ANSI SQL标准推荐使用 INNER JOIN 语法,而传统的等值联结语法(如 WHERE 子句方式)则属于较旧的形式。虽然DBMS支持两者,但建议大家理解这两种格式,实际应用时可以根据自己的习惯和需求选择。

总结

SQL联结是强大的查询工具,通过它可以将多个表中的相关数据整合到一起,方便分析和处理。理解关系表设计和联结语法对于高效使用SQL至关重要。联结能够帮助我们优化数据库设计,减少冗余数据,提高存储效率和一致性。在实际使用中,正确使用 WHEREINNER JOIN 子句来指定联结条件,是确保查询结果准确的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937800.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.Net WebAPI(一)

文章目录 项目地址一、WebAPI基础1. 项目初始化1.1 创建简单的API1.1.1 get请求1.1.2 post请求1.1.3 put请求1.1.4 Delete请求 1.2 webapi的流程 2.Controllers2.1 创建一个shirts的Controller 3. Routing3.1 使用和创建MapControllers3.2 使用Routing的模板语言 4. Mould Bind…

SQL在线格式化 - 加菲工具

SQL在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql,点击上方的格式化按钮即可 输入框得到格式化后的sql结果

vs 调试

常用: 调试->窗口-> 断点 监视 自动窗口 局部变量 调用堆栈 内存 反汇编(也可以右键,转到反汇编) 寄存器 快捷键: F5:启用调试,经常用来跳到下一个断点处 F9创建断点和取消断点。断点的重要作用&…

25. 深浅拷贝

一、什么是浅拷贝 只对对象的最顶层进行的拷贝称为 浅拷贝。我们可以用 copy 模块中的 copy() 方法实现浅拷贝。 import copya [11, 22, 33] b [44, 55, 66] c [a, b] d copy.copy(c)print(f"c: {c}") print(f"d: {d}") print(f"c d: {c d}&q…

docker简单命令

docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件,id取前三位即可 docker rmi e64 删除镜像文件(先删容器才能删镜像),id取前三位即可 在包含Dockerfile文件的目录…

【Java】4、虚拟机 JVM

目录 Java内存区域详解(重点) JVM垃圾回收详解(重点) 类文件结构详解 类加载过程详解 类加载器详解(重点) 最重要的JVM参数总结 JDK监控和故障处理工具总结 JVM线上问题排查和性能调优案例 参考: JVM 核心技术 32 讲 深入浅出 Java 虚拟机

谷歌浏览器的无障碍功能介绍

在数字化时代,互联网已经成为人们生活中不可或缺的一部分。然而,并不是所有人都能平等地享受网络带来的便利。为了帮助有特殊需求的人士更好地访问和使用网络内容,谷歌浏览器推出了一系列无障碍功能。这些功能旨在提升视力障碍、听力障碍及其…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF,用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型,并且容易出…

从斯柯达和大众汽车安全漏洞事件剖析谈软件安全设计

一、事件概述 2022年,斯柯达和大众汽车被曝出存在一系列安全漏洞,这一事件引起了广泛关注。据估算,这些漏洞可能涉及超过 140 万辆汽车,涵盖斯柯达速派 III(Skoda Superb III)、斯柯达柯珞克(S…

Hyperledger Fabric 2.x 环境搭建

Hyperledger Fabric 是一个开源的企业级许可分布式账本技术(Distributed Ledger Technology,DLT)平台,专为在企业环境中使用而设计,与其他流行的分布式账本或区块链平台相比,它有一些主要的区别。 环境准备…

OpenIPC开源FPV之Adaptive-Link天空端代码解析

OpenIPC开源FPV之Adaptive-Link天空端代码解析 1. 源由2. 框架代码3. 报文处理3.1 special报文3.2 普通报文 4. 工作流程4.1 Profile 竞选4.2 Profile 研判4.3 Profile 应用 5. 总结6. 参考资料7. 补充资料7.1 RSSI 和 SNR 的物理含义7.2 信号质量加权的理论依据7.3 实际应用中…

metinfo的csrf漏洞复现

http://localhost/metinfo/install/index.php 管理员admin登录 抓修改信息包 进入点击受害链接 localhost/333.html 管理员被修改密码原来root错误被强制退出 输入密码123456登录正常

jclasslib Bytecode Viewer 安装

IDEA 2023.1.3 Settings->Plugins->Marketplace,搜索jclasslib Bytecode Viewer, install,apply 选中你所要分析的类,view->show bytecode with jclasslib gaoding

智能高效的IDE GoLand v2024.3全新发布——支持最新Go语言

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议,通过一步撤消快速安全重构,智能代码完成,死代码检测和文档提示帮助所有 Go 开发人员,从新手到经验丰富的专业人士,创建快速、高效、和可靠的…

Android学习路线图

‌Android系统的开发始于2003年,最初由安迪鲁宾在危险公司(Danger, Inc.)开发。2005年,Google收购了危险公司,并将其移动开发团队纳入旗下。2007年,Google正式发布了Android的第一个版本,并随后…

【含开题报告+文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现

开题报告 近年来,随着互联网技术的迅猛发展,人们的生活方式、消费习惯以及信息交流方式都发生了深刻的变化。旅游业作为国民经济的重要组成部分,其信息化、网络化的发展趋势也日益明显。旅游论坛作为旅游信息交流和分享的重要平台&#xff0…

CTFshow-php特性(Web89-115)

CTFshow-php特性(Web89-115) Web89&#xff08;intval&#xff09; <?php include("flag.php"); highlight_file(__FILE__);if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("no no no!");}if(intval($num))…

ip地址获取失败啥意思?ip地址获取失败怎么回事

在日常的网络使用中&#xff0c;我们时常依赖于稳定的IP地址来确保数据的顺畅传输和设备的正常识别。然而&#xff0c;有时我们会遇到“IP地址获取失败”的困扰&#xff0c;这不仅阻碍了我们的网络访问&#xff0c;还可能带来一系列的网络连接问题。那么&#xff0c;IP地址获取…

中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”

近期&#xff0c;《咬文嚼字》杂志发布了2024年度十大流行语&#xff0c;“智能向善”位列其中&#xff0c;过去一年时间里&#xff0c;深度伪造、AI诈骗等话题屡次登上热搜&#xff0c;AI技术“野蛮生长”引发公众担忧。今年9月&#xff0c;全国网络安全标准化技术委员会发布了…

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588 ,基于FFmpeg, 拉取RTSP,使用 mpp 实现硬解码. ⚡️ 参考: Rk3588 FFmpeg 拉流 RTSP, mpp 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode RTSPint open_stream(